Написать программу используя указатель второго ранга - C (СИ)
Формулировка задачи:
Найти строку, содержащую наибольшее количество слов, и вывести ее на экран монитора.
Количество строк 5, а максимальное число символов в строке - 80. Массив строк ввести с помощью инициализации
Примечания: Данные вводятся с клавиатуры. В программе при обращении к элементу массива нельзя использовать дополнительную переменную для вычисления его адреса.
Задачу нужно решить применяя указатель второго ранга.
Буду очень признателен за помощь.
Решение задачи: «Написать программу используя указатель второго ранга»
textual
Листинг программы
- #include <stdio.h>
- #include <ctype.h>
- /*
- #include <wordexp.h>
- size_t wc(const char * s) {
- wordexp_t w;
- size_t cnt;
- cnt = ( wordexp(s, &w, WRDE_NOCMD) ) ? 0 : w.we_wordc;
- wordfree(&w);
- return cnt;
- }
- */
- size_t wc(const char * s) {
- size_t cnt = 0, inword = 0;
- for ( ; *s; ++s ) {
- if ( isspace(*s) ) {
- if ( inword ) {
- cnt += 1;
- inword = 0;
- }
- }
- else
- inword = 1;
- }
- return cnt + inword;
- }
- char ** max_words_string(char ** strings, size_t count) {
- return ( count < 2 ) ? strings : max_words_string(strings + (wc(strings[0]) < wc(strings[count - 1])), count - 1);
- }
- #define STRINGS_COUNT 5
- #define STRING_SIZE 81
- #define STRING_MASK "%80[^\n]%*c"
- const char * STRING_NUMBERS[] = { "first", "second", "third", "fourth", "fifth" };
- int main(void) {
- char strings[STRINGS_COUNT][STRING_SIZE];
- int i /* ,maxidx */;
- char * pointers[STRINGS_COUNT];
- for ( i = 0; i < STRINGS_COUNT; ++i )
- pointers[i] = strings[0] + STRING_SIZE * i;
- printf("Enter %u strings:\n", STRINGS_COUNT);
- for ( i = 0; i < STRINGS_COUNT && scanf(STRING_MASK, strings[i]) == 1; ++i )
- ;
- if ( i < STRINGS_COUNT ) {
- printf("Not enough strings entered!.\n");
- return 1;
- }
- /*
- for ( maxidx = 0, i = 1; i < STRINGS_COUNT; ++i )
- if ( wc(strings[i]) > wc(strings[maxidx]) )
- maxidx = i;
- printf("\nMaximum words in %s string.\n", STRING_NUMBERS[maxidx]);
- */
- printf("\nMaximum words in %s string.\n", STRING_NUMBERS[max_words_string(pointers, STRINGS_COUNT) - pointers]);
- return 0;
- }
Объяснение кода листинга программы
- Программа считывает строки из стандартного ввода до тех пор, пока не будет введено 5 строк.
- Переменная
max_words_string
рекурсивно находит строку с максимальным количеством слов в массиве строк. - Переменная
mainidx
инициализируется значением 0. - В цикле перебираются строки, и если количество слов в текущей строке больше, чем в строке с максимальным количеством слов, то
maxidx
обновляется. - Выводится сообщение с номером строки, содержащей максимальное количество слов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д