Neri-kun Ответов: 3

Что не так с моей программой?


У меня есть строка, и мне нужно определить количество гласных, которые входят между двумя согласными.
Напр.:
Ввод:вода кипит при ста градусах.
Выход:5

Экспликация:единственные гласные, которые соблюдают это правило, - это:
"а" и " Е "от воды, "у" и "Е" от ста и первого "е" от градусов.

Что я уже пробовал:

#include<stdio.h>
bool vowel(char c)
{
	if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
		return true;
	else
		return false;

}
bool consonant(char c)
{
	if (c >= 'a'&&c <= 'z'&&vowel(c) == false)
		return true;
	else
		return false;
}
int main()
{
	char S[256];
	int i;
	int nr = 0;
	scanf_s("%s", S);
	for (i = 1; S[i]!=EOF; i++)
		if (vowel(S[i]) == true && consonant(S[i - 1]) == true && consonant(S[i + 1]) == true)
			nr++;
	printf("%d", nr);
	
	system("pause");
	return 0;
}

KarstenK

вам не нужно сверяться с истиной. "== True" - это не обязательно.

3 Ответов

Рейтинг:
2

Patrice T

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.

Вторичное воздействие
- Вы будете гордиться тем, что сами находите Жуков.
- Ваши навыки обучения улучшатся.

Вы должны довольно быстро найти, что не так.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

Цитата:
Однако,когда я сделал эту программу на c++, я обнаружил, что, например, когда я пишу "вода" с заглавной буквы w, " а " не соблюдает это правило.

Поскольку ваш код состоит только из нижнего регистра, вам нужно добавить верхний регистр к вашему коду.
Цитата:
Во-вторых,в c++ можно ли определить EOF как нулевой символ?

Да, вы можете определить EOF как символ 0, просто включите его в свой код.
Язык C: #define директива (определение макроса)[^]
#define директива (C-C++)[^]


Рейтинг:
2

Mohibur Rashid

немногие вопросы:
1. Ваш тег говорит C; вы использовали bool, true, false; не существует в C.
2. Как уже упоминал Рик, вы не используете EOF; EOF=конец файла. Вам нужно проверить 0
3. Важно, что scanf читает только ваше первое слово и игнорирует все остальные слова после первого пробела. Вы можете воспользоваться fgets возвращает.
4. Кроме того, как упоминал Рик, вы должны обращаться к заглавным буквам;


Neri-kun

1.Если bool,true и false не существуют,то какой эквивалент я должен использовать для c?
2.я понимаю.
3.Если я определяю S[size] как char и хочу прочитать массив символов,является ли,например,fgets(S, size) в C эквивалентным cin.getline(S, size) в C++?
4.я также буду принимать во внимание заглавные буквы

Обновление:мне удалось заставить мою программу работать так,как ожидалось,однако относительно того, что вы и Рик сказали, моя программа все еще работает, хотя я использовал EOF.Кроме того, можете ли вы объяснить мне, есть ли вообще какая-то разница, если я пишу S[i]!=0 или S[i]!='\0'?

Mohibur Rashid

около 1
в c 0 ложно, все остальное истинно.
про ВФ
Если вы отладите до конца, то увидите, что ваша программа перейдет к неназначенной части, после 0. Для теста уменьшите свой максимум до 4; Введите cod, ваше приложение выдаст ошибку сегментации falt и приложение рухнет.

около 3-х лет:
может быть. но в fgets вам также нужно назначить stdin в качестве входных данных

о 0 и \0, 0-это целое число; \0 говорит омпилеру, что это символ.

Рейтинг:
0

Rick York

Что произойдет, если ввести заглавную букву?

Кроме того, EOF определяется как -1. На самом деле вы хотите найти S[i] != 0 в цикле for, потому что в C строки заканчиваются нулевым символом, 0.

Другое дело, что тип bool не определен в языке C, поэтому добавьте туда оператор "typedef int bool;" вместе с определениями макросов для true и false как 1 и 0 соответственно.

typedef int bool;

#define true  1
#define false 0
Наконец, если вы хотите прочитать строку текста, содержащую несколько слов, gets( S ); это хороший вариант. Он считывает символы до тех пор, пока не будет получена новая строка или EOF.


Neri-kun

Во-первых,я не знаю, что происходит, потому что я получил эти конкретные ошибки:
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(2): ошибка C2061: синтаксическая ошибка: идентификатор 'гласный'
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(2): ошибка C2059: синтаксическая ошибка: ';'
1>процесс обучения c:\users\dragos\source\repos\c \З. учебный процесс\главная.с(2): ошибка C2059: синтаксическая ошибка: '&ЛТ;параметр-список&ГТ;'
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(10): ошибка C2061: синтаксическая ошибка: идентификатор 'согласный'
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(10): ошибка C2059: синтаксическая ошибка: ';'
1>процесс обучения c:\users\dragos\source\repos\c \З. учебный процесс\главная.с(10): ошибка C2059: синтаксическая ошибка: '&ЛТ;параметр-список&ГТ;'
1>процесс обучения c:\users\dragos\source\repos\c \З. учебный процесс\главная.с(24): предупреждение C4013: "гласный" неопределенные; при условии, что Экстерн возвращаясь инт
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(24): ошибка C2065: 'true': необъявленный идентификатор
1>c:\users\dragos\source\repos\c learning process\c learning process\main.c(24): предупреждение C4013: 'consonant' undefined; предполагая, что extern возвращает int
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(28): предупреждение C4013: 'system' undefined; предполагая, что extern возвращает int
1>c:\users\dragos\source\repos\c learning process\c learning process\main.c(22): предупреждение C4473: 'scanf_s' : недостаточно аргументов, переданных для строки формата
1>c:\users\dragos\source\repos\c процесс обучения\c процесс обучения\main.c(22): Примечание: заполнители и их параметры ожидают 2 вариационных аргумента, но 1 был предоставлен
1>c:\users\dragos\source\repos\c learning process\c learning process\main.c(22): Примечание: отсутствующий вариационный аргумент 2 требуется для строки формата '%s'
1>c:\users\dragos\source\repos\c learning process\c learning process\main.c(22): Примечание: этот аргумент используется в качестве размера буфера
1>сделано построение проекта "c learning process.vcxproj" -- не удалось.
========== Сборка: 0 успешно, 1 неудачно, 0 обновлено, 0 пропущено ==========
Однако,когда я сделал эту программу на c++, я обнаружил, что, например, когда я пишу "вода" с заглавной буквы w, " а " не соблюдает это правило.
Во-вторых,в c++ можно ли определить EOF как нулевой символ?

Rick York

Ваш файл называется main.c, а тип bool не определен в языке C. Если вы измените bool на int, он, вероятно, будет работать лучше. Вам также придется определить истинные и ложные макросы в 1 и 0 соответственно.

Neri-kun

Да,вы правы.Вместо использования bool,true и false,используя int,1 и 0, он будет
скорее всего, сработает лучше.Однако,как насчет чтения массива символов?Если я хочу определить S[size] как char и прочитать его,как я могу это сделать ,как эквивалент cin.getline(S,size) в C++ ,в C ?

Rick York

gets будет читать всю строку текста, пока она не достигнет новой строки или EOF. Это может быть удобно для перенаправления стандартного ввода на чтение из файла и обработки целого набора входных данных. Это позволит вам ввести все ваши тестовые случаи в текстовый файл, а затем обработать их все за один раз. Это очень удобный и распространенный способ делать вещи.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.