Ввести два предложения и распечатать самые длинные слова, общие для этих предложений - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Одно из заданий лабы. Ввести два предложения и распечатать самые длинные слова, общие для этих предложений. Если нужных слов нет - сообщить об этом. Я делаю так - создаю двумерный массив и забиваю туда в слова из предложений. Вопрос теперь, как эти массивы сравнить и дать пользователю ответ. Вот то, что написал
#include<iostream>
#include<cstring>
#include <iomanip>
using namespace std;
int main()
{
   int counter=0, z=0, x=0;
   char str3[100], str7[100];
 
                    cout<<"Введите первое предложение: ";
                    gets(str3);
                    cout<<"Введите второе предложение: ";
                    gets(str7);
 
    char razmer1[300][300], razmer2[300][300], q[2]=" ";
    
        for (int i=0; i<strlen(str3); i++)
        {
            if (str3[i]!=q[0])
            {
                razmer1[z][x]=str3[i];
                x++;
            }
            else
            {
                razmer1[z][x+1]=0;
                x=0;
                z++;
            }
        }
        z=0;
        x=0;
        for (int i=0; i<strlen(str7); i++)
        {
            if (str7[i]!=q[0])
            {
                razmer2[z][x]=str7[i];
                x++;
            }
            else
            {
                razmer2[z][x+1]=0;
                x=0;
                z++;
            }
        }
}
А вот что дальше даже не представляю...

Решение задачи: «Ввести два предложения и распечатать самые длинные слова, общие для этих предложений»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
/* Ввести два предложения и распечатать самые длинные слова, общие для этих предложений. */
 
int wrdLenDescCmp(const void *a, const void *b){
    return strlen(*(char**)b) - strlen(*(char**)a);
}
 
char **strToWords(char *s, const char *delim, int *count){
    char **wa = NULL, *p = NULL;
    *count = 0;
    for ( p = strtok(s, delim); p != NULL; p = strtok(NULL, delim) ){
        if ( ( wa = (char**)realloc(wa, sizeof(char*) * (*count + 1)) ) == NULL ){
            perror("Bad memory!\n");
            exit(1);
        }
        if ( ( wa[*count] = strdup(p) ) == NULL ){
            perror("Bad memory!\n");
            exit(1);
        }
        *count += 1;
    }
    return wa;
}
 
#define STRLEN 128
#define SPCHARS " ,.:;!?\t\n"
int main(void){
    char str1[STRLEN], str2[STRLEN], **words1, **words2;
    int wcnt1, wcnt2, i, j, found;
    
    printf("Str1: ");
    if ( !fgets(str1, STRLEN, stdin) )
        exit(1);
    printf("Str2: ");
    if ( !fgets(str2, STRLEN, stdin) )
        exit(1);
    
    words1 = strToWords(str1, SPCHARS, &wcnt1);
    words2 = strToWords(str2, SPCHARS, &wcnt2);
    if ( !words1 || !words2 || !wcnt1 || !wcnt2 ){
        fprintf(stderr, "Shit happens!\n");
        exit(1);
    }
    qsort(words1, wcnt1, sizeof(char*), wrdLenDescCmp);
    qsort(words2, wcnt2, sizeof(char*), wrdLenDescCmp);
    
    found = 0;
    for ( i = 0; i < wcnt1 && !found; ++i ){
        for ( j = 0; j < wcnt2; ++j ){
            if ( !strcmp(words1[i], words2[j]) ){
                printf("%s\n", words1[i]);
                found = 1;
                break;
            }
        }
    }
    if ( !found )
        printf("No same words found!\n");
    
    for ( i = 0; i < wcnt1; ++i ){
        if ( words1[i] != NULL ){
            free(words1[i]);
            words1[i] = NULL;
        }
    }
    free(words1);
    words1 = NULL;
    for ( i = 0; i < wcnt2; ++i ){
        if ( words2[i] != NULL ){
            free(words2[i]);
            words2[i] = NULL;
        }
    }
    free(words2);
    words2 = NULL;
    exit(0);
}

Объяснение кода листинга программы

  1. Ввод двух предложений с помощью функции fgets() в переменные str1 и str2.
  2. Преобразование предложений в массивы слов с помощью функции strToWords().
  3. Сортировка массивов слов по длине слова в порядке убывания с помощью функции qsort().
  4. Поиск общих слов в обоих массивах с помощью двух вложенных циклов.
  5. Вывод найденных слов на экран с помощью функции printf().
  6. Освобождение памяти, выделенной под массивы слов, с помощью функций free().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы