Написать программу используя указатель второго ранга - 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;
}

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

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

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

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