Написать программу используя указатель второго ранга - C (СИ)

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

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

Найти строку, содержащую наибольшее количество слов, и вывести ее на экран монитора. Количество строк 5, а максимальное число символов в строке - 80. Массив строк ввести с помощью инициализации Примечания: Данные вводятся с клавиатуры. В программе при обращении к элементу массива нельзя использовать дополнительную переменную для вычисления его адреса. Задачу нужно решить применяя указатель второго ранга. Буду очень признателен за помощь.

Решение задачи: «Написать программу используя указатель второго ранга»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. /*
  4. #include <wordexp.h>
  5.  
  6. size_t wc(const char * s) {
  7.     wordexp_t w;
  8.     size_t cnt;
  9.    
  10.     cnt = ( wordexp(s, &w, WRDE_NOCMD) ) ? 0 : w.we_wordc;
  11.     wordfree(&w);
  12.    
  13.     return cnt;
  14. }
  15. */
  16.  
  17. size_t wc(const char * s) {
  18.     size_t cnt = 0, inword = 0;
  19.    
  20.     for ( ; *s; ++s ) {
  21.         if ( isspace(*s) ) {
  22.             if ( inword ) {
  23.                 cnt += 1;
  24.                 inword = 0;
  25.             }
  26.         }
  27.         else
  28.             inword = 1;
  29.     }
  30.    
  31.     return cnt + inword;
  32. }
  33.  
  34. char ** max_words_string(char ** strings, size_t count) {
  35.     return ( count < 2 ) ? strings : max_words_string(strings + (wc(strings[0]) < wc(strings[count - 1])), count - 1);
  36. }
  37.  
  38. #define STRINGS_COUNT 5
  39. #define STRING_SIZE 81
  40. #define STRING_MASK "%80[^\n]%*c"
  41.  
  42. const char * STRING_NUMBERS[] = { "first", "second", "third", "fourth", "fifth" };
  43.  
  44. int main(void) {
  45.     char strings[STRINGS_COUNT][STRING_SIZE];
  46.     int i /* ,maxidx */;
  47.     char * pointers[STRINGS_COUNT];
  48.    
  49.     for ( i = 0; i < STRINGS_COUNT; ++i )
  50.         pointers[i] = strings[0] + STRING_SIZE * i;
  51.    
  52.     printf("Enter %u strings:\n", STRINGS_COUNT);
  53.    
  54.     for ( i = 0; i < STRINGS_COUNT && scanf(STRING_MASK, strings[i]) == 1; ++i )
  55.         ;
  56.     if ( i < STRINGS_COUNT ) {
  57.         printf("Not enough strings entered!.\n");
  58.         return 1;
  59.     }
  60.    
  61.     /*
  62.     for ( maxidx = 0, i = 1; i < STRINGS_COUNT; ++i )
  63.         if ( wc(strings[i]) > wc(strings[maxidx]) )
  64.             maxidx = i;
  65.    
  66.            
  67.     printf("\nMaximum words in %s string.\n", STRING_NUMBERS[maxidx]);
  68.     */
  69.     printf("\nMaximum words in %s string.\n", STRING_NUMBERS[max_words_string(pointers, STRINGS_COUNT) - pointers]);
  70.    
  71.     return 0;
  72. }

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

  1. Программа считывает строки из стандартного ввода до тех пор, пока не будет введено 5 строк.
  2. Переменная max_words_string рекурсивно находит строку с максимальным количеством слов в массиве строк.
  3. Переменная mainidx инициализируется значением 0.
  4. В цикле перебираются строки, и если количество слов в текущей строке больше, чем в строке с максимальным количеством слов, то maxidx обновляется.
  5. Выводится сообщение с номером строки, содержащей максимальное количество слов.

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


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

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

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы