Ввести два предложения и распечатать самые длинные слова, общие для этих предложений - 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); }
Объяснение кода листинга программы
- Ввод двух предложений с помощью функции fgets() в переменные str1 и str2.
- Преобразование предложений в массивы слов с помощью функции strToWords().
- Сортировка массивов слов по длине слова в порядке убывания с помощью функции qsort().
- Поиск общих слов в обоих массивах с помощью двух вложенных циклов.
- Вывод найденных слов на экран с помощью функции printf().
- Освобождение памяти, выделенной под массивы слов, с помощью функций free().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д