一、while循环
1. 简单while循环
例如:输出0-20之间的整数:
2. 通用形式
while(expression)
statement;
注意:statement部分可以是以;结尾的简单语句,也可以是以 {} 括起来的复合语句。
二、 getchar()和putchar()
定义:单字符输入/输出函数(输入/输出函数简称I/O函数)。
1. 缓冲区
C语言程序是如何处理键盘输入的呢?
分为缓冲输入和无缓冲输入:
2. getchar()函数
输入字符。ch = getchar();效果和scanf(“%c” , &ch);效果一样。
getchar()函数输入时有缓冲区。
例如:确认密码程序
此时无法输入Y/N,因为在scanf()函数读完后,缓冲区内存在\n未被读取,紧接着getchar()函数将留在缓冲区内的\n读取,代码结束。
修改:
在scanf()函数后多加个getchar()函数,用于拿走缓冲区内留的\n。
3. putchar()函数
输出字符。putchar(ch);效果和printf(“%c” , ch);效果一样。
例如:输入和输出相同字符。
4. EOF
(1)定义
用getchar()读取文件,检测到文件结尾时将返回一个特殊值,即EOF(end of file)。通常,EOF定义在stdio.h文件中,且值为-1。
注意:EOF作为一个值,标志着检测到文件结尾,并不是一个符号。
(2)echo_eof.c程序
#include<stdio.c>
int main()
{
int ch;
//char类型变量只能表示0-255的无符号整数,但EOF的值是-1,所以用int。
//且getchar()作为单字符输入函数,其实际返回值的类型也是int。
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
echo_ecof.c程序能把用户输入的内容拷贝到屏幕上,并在读到EOF时停止。
三、do while循环
1.定义
出口条件循环:do while循环,即在循环的每次迭代之后检查测试条件,这会保证该循环至少执行一次。
2. 通用形式
do
statement
while (expression);
例如:图1中while循环输入的 “输出0-20之间的整数:”该如何用do while循环表达?
四、for循环
1. 定义
2. 通用形式
for(initialize;test;update )
statement;
initialize:初始化
test:测试条件
update:更新调整
注意:三个表达式也可以是不同的变量。
例如:图1中while循环输入的 “输出0-20之间的整数:”该如何用for循环表达?
3. break和continue在for循环中
(1)break
(2)continue
注意:continue语句在for循环中与while循环中略有不同。在for循环中,执行到continue后跳转道update(即本例题中的num++),然后继续循环直至结束。
4. 语句省略
for循环可以省略一个或多个表达式,只要整个循环中包含能结束循环的语句即可。
(1)initialize语句省略
例如:打印“嘻嘻”
未省略initialize语句:
打印“嘻嘻”数=3(i=0、1、2)*3(j=0、1、2)=9个
省略initialize语句:
打印“嘻嘻”数=1(i=0)*3(j=0、1、2)=3个
所以,初学阶段,尽量不省略initialize语句,避免发生错误。
(2)test语句省略
省略test表达式被视为恒为真。
5. for循环建议
(1)不可在for循环体内修改循环变量,防止其失去控制;
for循环中()内update语句已经是循环变量了,不要在statement语句内再修改循环变量;
(2)建议for语句的循环控制变量的取值采取“前闭后开区间”的写法。(只是建议,不是要求)
五、运算符
1. 其他赋值运算符
scores += 2 与 scores = scores + 20 相同;
scores -= 2 与 scores = scores - 2 相同;
scores *= 2 与 scores = scores * 2 相同;
scores /= 2 与 scores = scores / 2 相同;
scores %= 2 与 scores = scores % 2 相同。
六、练习
注意练习方法:
先在脑海中(或者纸上)写出思路(可图解),再根据语法规则写代码。
如果不会需要学习别人的代码,先理清别人的思路,再按照学到的思路(或者加上自己的见解)写代码。
练习1:求n的阶乘(n!)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
int n = 0;
int num = 1;
scanf("%d",&n);//别忘了加上&符号!!!
while (i<=n)
{
num *= i;//num*=i 与 num=num*i 相同
i++;
}
printf("%d",num);
return 0;
}
练习2:求1! + 2! + 3! + … … + 10!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
int num1 = 1;
int num2 = 0;
for (i = 1; i <= 10;i++)
{
num1 *= i;
num2 += num1;
}
printf("%d", num2);
return 0;
}
练习3:编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "Welcome to Jelly's Channel";//引入两个数组arr1和arr2
char arr2[] = "##########################";
int left = 0;//数组最左边第一个的下标是0
int right = strlen(arr1) - 1;//strlen()函数是求数组长度的函数,需要引头文件<string.h>
while (left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s",arr2);//%s是字符串的转换说明
Sleep(500);//Sleep()函数意为在屏幕上停留时间,单位毫秒(本题中是睡眠0.5s),需要引头文件<windows.h>
system("cls");//system()函数意为清空屏幕(本题中以达到动态滚动的效果)
left++;
right--;
}
printf("%s", arr2);//使最后呈现的效果保留在屏幕上
return 0;
}