c语言循环语句,c语言第五章循环结构
【前言】:循环语句增加的知识点很重要。铁汁要和零食一起记。
I. while语句while语句
While(表情)
{
循环语句;
}
【敲黑板】:条件表达式的执行次数比循环体多1次。
循环中的Break语句和continue语句:
break语句在循环中的作用:break是永久终止循环;
continue语句在循环中的作用:continue用于终止这个循环,也就是说continue之后的代码不会在这个循环中执行,而是直接跳转到while语句的判断部分。
1: Getchar()函数原型:
Getchar (void)函数:
读取标准输入缓冲区中的字符,并返回所读取字符的ASCII码值。如果读取失败,返回EOF(-1)
问:getchar()为什么返回字符的ASCII码值?为什么函数的返回值要放在int类型的变量里?不应该放在char类型的变量里吗?
比如:
int ch=0;
ch=getchar();答:
Getchar()返回字符的ASCII码值。ASCII码值是整数,存储在整数变量中没有问题;这也是最重要的一点。getchar()在读取失败时返回EOF。e of的本质是-1(#定义EOF -1),是一个整数值。在char类型中,它不能被存储;结合getchat()函数的原型,将getchar()的返回类型定义为int,那么返回的数据应该存储在int变量中。
Getchar():获取/输入一个字符;
Putchar():输出字符
注意,这两个函数一次只能操作一个字符。没有scanf(),printf()功能齐全。
2.补充:输入缓冲区介绍:
#包含stdio.h
int main()
{
char input[20]={ 0 };
Printf(请输入密码:);
scanf(%s ,输入);//输入abcdef,后跟一个\n
Printf(请确认密码:(Y/N):);
int ch=getchar();
if (ch==Y )
{
Printf(确认成功\ n );
}
其他
{
Printf(确认失败\ n );
}
返回0;
}此时abcdef放入输入缓冲区\n,scan f()函数将ABCDEF读走,留下一个\n,所以\n直接由getchar()读取,所以此时放入ch中\ n,然后我们不会等到确认密码直接输出确认失败。
存在的问题:在这个问题中输入abcdef,然后回车。在我们输入字符(Y/N)之前,直接输出“确认失败”。怎么才能把它变成我们想要的样子?
在scanf()下添加一条语句:getchar();目的只有一个,拿回车键( \n ),
存在的问题:这个改动只能保证输入“abcdef”时的正常执行,但如果输入“abcdef呵呵”,会直接输出“确认失败”。不要相信我。
我输了,什么鬼,怎么又错了!
注意:
scanf(%s ,);//scanf()在读取字符串时遇到空格就停止读取。
分析前面的代码:
#包含stdio.h
int main()
{
char input[20]={ 0 };
Printf(请输入密码:);
scanf(%s ,输入);//scanf()只读“abcdef”
getchar();//getchar()读取一个空格,所以这里有问题。这里的Getchar()只能接受一个字符。我们想要的是它能缓冲
//去掉所有剩余的字符,直到 \n
Printf(请确认密码:(Y/N):);
int ch=getchar();
if (ch==Y )
{
Printf(确认成功\ n );
}
其他
{
Printf(确认失败\ n );
}
返回0;
}是的,这里的getchar()只能取一个字符。我们想要的是它可以占用缓冲区的所有剩余部分,直到它占用 \n 。怎么改?
#包含stdio.h
int main()
{
char input[20]={ 0 };
Printf(请输入密码:);
scanf(%s ,输入);//scanf()只读“abcdef”
//清理缓冲区
int tmp=0;
while ((tmp=getchar())!=\n )
{
;//空语句,什么都不做,只取字符
}
Printf(请确认密码:(Y/N):);
int ch=getchar();
if (ch==Y )
{
Printf(确认成功\ n );
}
其他
{
Printf(确认失败\ n );
}
返回0;
}
就是这样。注意上面的清缓冲功能。
二、对于流通注意事项:
for循环的风格更好,使用频率最高。
建议:
不能在for循环内部修改循环变量,以防止for循环失去控制。建议将for语句中循环控制变量的值写成“先关后开”
比如:
for(I=10;i 10I) //关闭前打开。
for(I=10;i=10I) //Close before和close after(不建议这样写,但也可以用来更好的解释)for循环的一些变体:
可以省略for的初始化、判断和调整;如果省略了中间判断部分,就意味着判断始终为真,构成了一个无限循环。所以如果条件允许,不建议省略。
笔测试问题:
//问:你打印了几次呵呵?
#包含stdio.h
int main()
{
int I=0;
int j=0;
for(;i3;我)
{
for(;j 3;j)
{
printf(呵呵\ n );
}
}
返回0;
}嘿嘿,想必铁汁心里已经有了自己的答案。来看看和正确答案一样吗?
哈哈,说实话,第一次做这道题,我想了九遍,为什么是三遍呢?
看,所以尽量不要省略for循环中的表达式。
添加另一个测试问题:
int I=0;
int k=0;
for(i=0,k=0;k=0;I,k) //k=0赋值,0为假,判断表达式始终为假,循环执行0次。
{
k;
}三。做.while()循环do.while循环与前两个循环的不同之处在于,它的循环体至少执行一次!
做
循环语句;
While(表情);注意:do.while语句使用的场景有限,因此不会经常使用。
四。练习练习1:计算n的阶乘伪码:
int ret=1;
int I=0;
for(I=1;I=n;我)
{
ret=ret * I;
}练习二:计算1!2!3!n!在练习1中,我们知道如何计算n的阶乘,所以计算1!2!3!n!简单多了。
来,先看一个错误演示:
//为了测试方便,我这里简单算到1!2!3!
#包含stdio.h
int main()
{
int I=0;
int ret=1;
int sum=0;
int n=0;
for(n=1;n=3;n)
{
for(I=1;I=n;我)
{
ret=ret * I;
}
sum=sum ret
}
printf(%d\n ,sum);
返回0;
}其实1!2!3!=9,但实际上结果是.
结果是15。为什么?
因为第二个循环中的ret是上一次剩下的值,而我们想在计算完某个数的阶乘一次后,将ret重置为1,然后再计算下一个数的阶乘。
因此,按如下方式重写代码:
//为了测试方便,我这里简单算到1!2!3!
#包含stdio.h
int main()
{
int I=0;
int ret=1;
int sum=0;
int n=0;
for(n=1;n=3;n)
{
ret=1;//注意
for(I=1;I=n;我)
{
ret=ret * I;
}
sum=sum ret
}
printf(%d\n ,sum);
返回0;
}虽然上面的代码是正确的,但是仍然不够高效,其时间复杂度为O (n 2)。仅仅一层循环就能解决吗?其实是有可能的,因为上面的计算已经重复过很多次了。
如上计算,1!2!3!反复计算了很多次。
//ret * 1
//ret * 1 * 2
//ret * 1 * 2 * 3因此将其重写为高效的代码,如下所示:
for(n=1;n=3;n)
{
//n*(n-1)!=n!
ret=ret * n;
sum=sum ret
}
【敲黑板】:我们写算法的时候,不要骄傲。想想怎么更精,所以多学多练!
加油!
,安全有保障。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。