Вопрос программирования C - Ветвление - PullRequest
1 голос
/ 04 июня 2011

Напишите программу, которая читает ввод до # и сообщает количество раз, когда происходит последовательность ei.

У меня небольшая путаница с последовательностью, такой как 'ieei', когда компилятор вводит 3-й 'e', но никогда не получает 'i' с getchar(), почему и если кто-то может улучшить это до меня, это будет хорошо? *

char ch;
int sq=0;

while ((ch = getchar()) != '#')
{
    if (ch == 'e')
    {
        ch = getchar();

        if (ch == 'e')
            ch = getchar();

        if (ch == 'i')
            sq++;
    }
}

printf("Sequence occurs %d %s\n", sq, sq == 1 ? "time" : "times");

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

На мой взгляд, проще всего сохранить результат последнего getchar() в переменной, а не иметь лишний getchar() внутри цикла.

char ch;
int sq=0;
char lastCh = ' ';

while((ch=getChar())!='#') {
  if(lastCh=='e' && ch=='i')
    sq++;
  lastCh=ch;
}

Это дает правильный результат, независимо от того, сколько e в строке или что-то еще, и разрывается на первый # символ.

0 голосов
/ 04 июня 2011

Я испытываю желание реализовать это как:

char ch=0;
int sq=0;

do{
    if( (ch=( ch=='e'? ch:getchar() )) == 'e' && (ch=getchar()) == 'i' )
        ++sq;
}while(ch!='#');

Но он использует ?: и && для потока управления, что может сбивать с толку особенно новичков.

Если подумать, развернуть его не так сложно:

char ch=0;
int sq=0;

do{
    if( ch!='e' ) ch = getchar();

    if( ch == 'e' ){

        ch = getchar();

        if( ch == 'i' ) ++sq;
    }

}while(ch!='#');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...