C程序设计问题-分支
编写一个程序,将输入读取到#,并报告序列ei出现的次数 我对序列没有什么混淆,比如编译器输入第三个C程序设计问题-分支,c,C,编写一个程序,将输入读取到#,并报告序列ei出现的次数 我对序列没有什么混淆,比如编译器输入第三个'e',但从不使用getchar()获取'I',为什么,如果有人能在我之前改进这一点就好了 char ch; int sq=0; while ((ch = getchar()) != '#') { if (ch == 'e') { ch = getchar(); if (ch == 'e') ch = getchar();
'e'
,但从不使用getchar()
获取'I'
,为什么,如果有人能在我之前改进这一点就好了
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");
在我看来,最简单的方法是将最后一个
getchar()
的结果保存在一个变量中,而不是在循环中有一个额外的getchar()
char ch;
int sq=0;
char lastCh = ' ';
while((ch=getChar())!='#') {
if(lastCh=='e' && ch=='i')
sq++;
lastCh=ch;
}
无论一行中有多少个
e
,这都会给出正确的结果,并在第一个#
字符处中断。在我看来,最简单的方法是将最后一个getchar()
的结果保存在一个变量中,而不是在循环中有一个额外的getchar()
char ch;
int sq=0;
char lastCh = ' ';
while((ch=getChar())!='#') {
if(lastCh=='e' && ch=='i')
sq++;
lastCh=ch;
}
无论一行中有多少个
e
,并且在第一个#
字符处中断,这都会给出正确的结果。我尝试将其实现为:
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!='#');
我很想将其实现为:
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!='#');
检查内部“#”不是目的,内部getchar的唯一目的是获取下一个char@highlevelcoder但是,如果内部getchar得到一个
,那么您就输了,并且您的问题陈述中没有任何内容可以排除“abcde”
。简单地实现一个能记住上次读取结果的状态机是最容易的。我同意上面的说法,我只是在尝试添加一点,#无论如何都应该停止循环执行,这就是为什么我不介意。执行/读取直到#检查内部的“#”不是目的,内部getchar只有获取下一个的目的char@highlevelcoder但是,如果内部getchar得到一个
,那么您就输了,并且您的问题陈述中没有任何内容可以排除“abcde”
。简单地实现一个能记住上次读取结果的状态机是最容易的。我同意上面的说法,我只是在尝试添加一点,#无论如何都应该停止循环执行,这就是为什么我不介意。执行/读取直到#如果您输入“eei#”,那么sq
仍然是0。您是对的。修正了(在if
语句中增加了一些控制流)。这确实非常混乱。写这样的代码是没有意义的。@Alexandre然后提出你自己的观点,这家伙至少表现出了一些努力!我不是选民。我只是觉得这个代码(第一个版本)很难阅读。如果你输入“eei#”,那么sq
仍然是0。你是对的。修正了(在if
语句中增加了一些控制流)。这确实非常混乱。写这样的代码是没有意义的。@Alexandre然后提出你自己的观点,这家伙至少表现出了一些努力!我不是选民。我只是觉得这个代码(第一个版本)非常不可读。你的char
(以及到目前为止每个答案中的一个)应该是int
getchar()
返回一个int
,专门用于通知调用方错误(或EOF)。将从getchar()
返回的值转换为typechar
可以有效地禁用对添加的作业标记中的输入错误(或EOF)的检测。如果错误,请删除。(家庭作业问题没问题,特别是这样问)。这不是家庭作业,为什么会是?!您的char
(以及到目前为止每个答案中的一个)应该是int
getchar()
返回一个int
,专门用于通知调用方错误(或EOF)。将从getchar()
返回的值转换为typechar
可以有效地禁用对添加的作业标记中的输入错误(或EOF)的检测。如果错误,请删除。(家庭作业问题没问题,特别是这样问)。这不是家庭作业,为什么会是?!