В процессе отладки в окне cmd при нажатии enter курсор переходит на следующую строку вместо выполнения программы - C (СИ)
Формулировка задачи:
Привет! Я новичок, изучаю Си по Керниган и Ричи.
Столкнулся проблемой при выполнении задания:
"Напишите программу, печатающую гистограмму длин слов из файла ввода. Самое легкое - начертить гистограмму горизонтально; вертикальная ориентация требует больших усилий."
После запуска отладки появляется окно cmd, в котором я ввожу необходимые символы, после чего нажимаю enter и вместо запуска выполнения программы, курсор переходит на следующую строку. Среда - MS VS 2012.
Частенько сталкиваюсь с таким поведением, но обычно получается решить вопрос, в этот раз не вышло. Подскажите, а о чем стоит задумываться в первую очередь при таком поведении программы?
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXWORD 80 /* максимальное количество слов */
/* т. е. длина нашей гистограммы */
/* гистограмма длин слов (вертикальная) */
main(){
int i, j, c, state;
int lenword[15], nextword, maxword;
nextword = 0;
for(i = 0; i < 15; i++)
lenword[i] = 0;
state = OUT;
while((c = getchar()) != EOF && nextword < 15){
if(c == ' ' || c == '\n' || c == '\t'){
if(state == IN){
/* запоминаем самое длинное слово,
это будет высота нашей гистограммы */
if(lenword[nextword] > maxword)
maxword = lenword[nextword];
nextword++;
state = OUT;
}
}
else{
if(state == OUT)
state = IN;
lenword[nextword]++;
}
}
/* печатаем гистограмму */
for(i = 15; i > 0; i--){
for(j = 0; j < nextword; j++){
if(lenword[j] >= i)
putchar('#');
else
putchar(' ');
}
putchar('\n');
}
}Решение задачи: «В процессе отладки в окне cmd при нажатии enter курсор переходит на следующую строку вместо выполнения программы»
textual
Листинг программы
#include<stdio.h>
#include<conio.h>
#define MAX_WORDS 100 //максимальное кол-во введенных слов, учитываемых в гистограмме
const char exit_char='*'; // символ окончания ввода
int main(){
char с;
int lenword[MAX_WORDS],i,j,currword=0;
bool in_word=0;
for(i=0; i<MAX_WORDS; i++)
lenword[i]=0;
while((c = getchar())!= EOF && c!=exit_char && currword<MAX_WORDS)
{
if(c<'A' || c>'z')
{
if(in_word)
{
currword++;
in_word=0;
}
}
else
{
in_word=1;
lenword[currword]++;
}
}
if(c==exit_char && in_word && currword<MAX_WORDS)
currword++;
if(!currword)
puts("no words entered");
for(i=0;i<currword;i++)
{
putchar('\n');
for(j=0;j<lenword[i];j++)
putchar('#');
}
getch(); // задержка перед выходом
return 0;
}
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки (stdio.h и conio.h).
- Определяется максимальное количество слов, которые будут учитываться в гистограмме (MAX_WORDS).
- Задается символ, который обозначает окончание ввода (exit_char).
- В основной функции int main() инициализируются переменные: с (для хранения введенного символа), lenword[MAX_WORDS] (массив для подсчета количества символов в каждом слове), i, j, currword (для хранения индексов и счетчика текущего слова).
- Задается начальное значение для всех элементов массива lenword[].
- Запускается цикл while, который выполняется до тех пор, пока не будет введен символ конца файла (EOF), не будет введен символ окончания ввода (exit_char) и пока не будет достигнуто максимальное количество слов (MAX_WORDS).
- Внутри цикла проверяется, является ли введенный символ буквой от 'A' до 'z'.
- Если символ не является буквой, то проверяется, находится ли в данный момент в слове (in_word). Если это так, то увеличивается счетчик слова (currword) и сбрасывается флаг in_word.
- Если символ является буквой, то устанавливается флаг in_word и увеличивается счетчик в соответствующем слове (lenword[currword]).
- Если введено слово из гистограммы, то выводится символ новой строки, а затем выводится гистограмма (массив lenword[]) с помощью символа '#'.
- Если введено слово, но оно не учтено в гистограмме (lenword[i] < MAX_WORDS), то выводится сообщение об ошибке
no words entered. - Если введено корректное слово и выполнены условия, то программа ожидает нажатия клавиши для продолжения работы.
- В конце программы вызывается функция getch(), которая приостанавливает выполнение программы до тех пор, пока пользователь не нажмет клавишу.
- Программа возвращает 0, что означает успешное выполнение.