Необходимо написать программу, которая с помощью указателей на функцию выполняет задание по варианту
В заданной строке нужно найти и вывести:
- сумму встречающихся цифр;
- количество слов в строке;
- самое длинное слово;
- все положительные числа.
В моём далеко неполном коде я написал в main циклы для суммы цифр и количества строк, а также поиск самого длинного слова. Первые 2 функции работают нормально, с поиском максимального слова проблемы, а как найти и вывести положительные числа - этого у меня сделать не получилось вовсе. В общем, кто сможет - переделайте эту программу, используя указатели на функции и подайте идею для нахождения и вывода положительных ЧИСЕЛ, заранее большое спасибо.
#include <stdio.h>
#include <string.h>
#include <locale.h>
int st_len(char* st)
{
int n = 0;
for (; st[n] != '\0'; n++);
return n;
}
int main()
{
setlocale(LC_ALL, "ru");
char str[10000];
int sum = 0, count, flag, id, count1, max, len, i = 0;
gets_s(str);
for (int i = 0; i < st_len(str); i++)
{
if ((str[i] >= '1') && (str[i] <= '9'))
{
sum += ((int)str[i] - 48);
}
}
printf("Сумма цифр - %d\n", sum);
count = 0;
flag = 0;
for (int i = 0; str[i] != '\0'; i++)
if (str[i] != ' ' && flag == 0) {
count += 1;
flag = 1;
}
else
if (str[i] == ' ') flag = 0;
printf("Количество слов - %d\n", count);
max = 0;
id = 0;
count1 = 0;
len = st_len(str);
for (int i = 0; i < len; i++)
if (str[i] != ' ' && str[i] >= 'a' && (str[i] <= 'z') || (str[i] >= 'A') && (str[i] <= 'Z'))
count1 += 1;
else
{
if (count1 > max)
{
max = count1;
id = i - count1;
}
count1 = 0;
}
if (count1 > max)
{
max = count1;
id = i - count1;
}
max += id;
printf("Самое длинное слово - ");
for (i = id; i < max; i++)
{
printf("%c", str[i]);
}
printf("\n");
return 0;}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Вот пример кода с комментариями:
Функция main:
int main() {
setlocale(LC_ALL, "ru");
char str[10000];
gets_s(str);
printf("1. Вывести сумму встречающихся цифр\n");
printf("2. Количество слов в строке\n");
printf("3. Самое длинное слово\n");
printf("4. Все положительные числа\n");
int choose;
printf("Введите код операции: ");
scanf("%d", &choose);
void (*func)(char* str) = NULL;
if (choose == 1) func = summaDigits;
else if (choose == 2) func = countWords;
else if (choose == 3) func = maxLenghtWord;
else if (choose == 4) func = inputPositiveNumbers;
if(func != NULL)
func(str);
return 0;
}
Функции по условию:
//Ваша функция - ничего не менял
void summaDigits(char* str) {
int sum = 0;
for (int i = 0; i < st_len(str); i++)
{
if ((str[i] >= '1') && (str[i] <= '9'))
{
sum += ((int)str[i] - 48);
}
}
printf("Сумма цифр: %d\n", sum);
}
//Ваша функция - ничего не менял
void countWords(char* str) {
int count = 0;
int flag = 0;
for (int i = 0; str[i] != '\0'; i++)
if (str[i] != ' ' && flag == 0) {
count += 1;
flag = 1;
}
else
if (str[i] == ' ') flag = 0;
printf("Количество слов: %d\n", count);
}
//Функция вывода самого длинного слова в строке
void maxLenghtWord(char* str) {
int max = 0;
int len = st_len(str);
int count = 0;
int maxIndex = 0;
for (int i = 0; i < len; i++) {
count = 0;
//Доходим до пробела считая длину слова
for (; i < len && str[i] != ' '; i++, count++);
//Проверяем на максимум
if (count > max) {
max = count;
maxIndex = i - count;
}
}
//Выводим
printf("Самое длинное слово: ");
for (int i = maxIndex; i < maxIndex + max; i++)
printf("%c", str[i]);
printf("\n");
}
//Вывод всех положительных чисел в строке
void inputPositiveNumbers(char* str) {
int len = st_len(str);
int index = 0;
for (int i = 0; i < len; i++) {
//Начало числа
index = i;
//ищем конец числа
for (; i < len && str[i] >= '0' && str[i] <= '9'; i++);
//Проверяем чтобы слева от числа и справа были пробелы
//цифры не в другом слова и нет минуса в начале
if ((index == 0 || str[index - 1] == ' ') && (str[i] == ' ' || i == len)) {
for (int j = index; j < i; ++j)
printf("%c", str[j]);
printf(" ");
}
}
}
Функцию st_len так же не менял.