Программирование функции. Взаимосвязь формальных и фактических параметров. - C (СИ)
Формулировка задачи:
Доброго времени суток!
Задание:
Разработать функцию, которая заменяет в заданном предложении все малые украинские и латинские буквы на соответствующие заглавные буквы и возвращает количество слов в этом предложении. Используя разработанную функцию, напечатать все введенные предложения заглавными буквами. В конце указать, какое предложение состоит из наибольшего количества слов. Подсказка: в функции воспользоваться массивами больших и малых букв украинского алфавита.
Помогите пожалуйста набросать код. Чистый язык Си.#include <stdio.h> #include <string.h> #include <stdlib.h> #define MXS 10 char* parr[MXS]; int main(void) { char buf[255], *pmem; int nstr; nstr=0; puts("\n\tText:"); while (*gets(buf) && nstr<MXS-1) { pmem = (char*)malloc(strlen(buf)+1); if (pmem==NULL) { puts("no free memory"); break; } strcpy(pmem, buf); parr[nstr++]=pmem; } return 0; }
Решение задачи: «Программирование функции. Взаимосвязь формальных и фактических параметров.»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SENTENCES_COUNT 10 unsigned int SentenceToUpperCase(char *); int FirstPos(const char, const char *); int main(void) { unsigned int actualSize = 0, maxSentenceNumber; int i, words, maxWordCount = -1; size_t n; char * sentences[MAX_SENTENCES_COUNT] = { NULL }; char str[255]; do { printf("Enter new sentence (empty sentence to exit): "); gets(str); n = strlen(str); if (n == 0) { break; } sentences[actualSize] = (char *)malloc(n + 1); if (sentences[actualSize] != NULL) { strcpy(sentences[actualSize], str); words = SentenceToUpperCase(sentences[actualSize]); if (words > maxWordCount) { maxSentenceNumber = actualSize; maxWordCount = words; } ++actualSize; } } while(actualSize < MAX_SENTENCES_COUNT); printf("\nProcessed sentences:\n"); for (i = 0; i < actualSize; i++) { printf("%u: %s\n", i + 1, sentences[i]); free(sentences[i]); } printf("\nSentence with #%u has %d words.\n", maxSentenceNumber + 1, maxWordCount); return 0; } unsigned int SentenceToUpperCase(char * str) { static const char * lowerCase = "abcdefghijklmnopqrstuvwxyzабвгґдеєжзиіїйклмнопрстуфхцчшщьюя"; static const char * upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"; static const char * wordSeparators = " .,;-\'\"!?\t\n\r\v"; unsigned int i, wordsCount = 0, inWord = 0; for (i = 0; str[i] != '\0'; i++) { int pos = FirstPos(str[i], lowerCase); if (pos != -1) { str[i] = upperCase[pos]; } if (FirstPos(str[i], wordSeparators) != -1) { inWord = 0; } else { if (inWord == 0) { ++wordsCount; inWord = 1; } } } return wordsCount; } int FirstPos(const char ch, const char * range) { int i; for (i = 0; range[i] != '\0'; i++) { if (ch == range[i]) { return i; } } return -1; }
Объяснение кода листинга программы
- Программа считывает предложения с клавиатуры, пока не будет введено пустое предложение или не достигнет максимального количества предложений.
- Каждое предложение преобразуется в верхний регистр и разбивается на слова.
- Слова, которые не являются буквами, считаются разделителями слов.
- Функция FirstPos используется для определения позиции символа в строке.
- Если символ является буквой, он преобразуется в верхний регистр.
- Если символ является разделителем слов, счетчик слов инкрементируется.
- Если символ не является буквой или разделителем слов, счетчик слов сбрасывается.
- Если введенное предложение пустое, программа завершается.
- Каждое обработанное предложение выводится на экран.
- Первое предложение с наибольшим количеством слов выводится вместе с количеством слов.
- Каждое предложение освобождается после вывода.
- Программа завершается с возвратом значения 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д