1.for循环
格式:
for(表达式1;表达式2;表达式3)
{
语句;
}
首先来看代码好理解一点
需求:求1~100之间所有数的和
#include <stdio.h>
int main(){
int sum =0;
for (int i = 0; i <= 100 ; ++i) {
sum = sum + i;
}
printf("%d", sum);
return 0;
}
写了这一行代码之后就是觉得for循环和Java的for循环一样的,后面在学习一下,看看有什么不同;
注意:
1.表达式1、表达式2、表达式3之间是用分号“;”分开的,千万不要写成逗号;
2.for()后面什么都不要加;
2.自增自减
(1)i++;就是表示i+1;
i--就是表示i-1;
i++和++i一样,同样i--和--i一样;
暂时不需要知道区别,书中的作者意思就是写成一样的,不要一会i++,一会i--的,这样就是感觉很乱
只有变量才可以自增自减
3.强制类型转换
来看一行代码
需求:
求1 + 1/2 +1/3......
#include <stdio.h>
int main(void) {
//先定义两个变量
int i;
float sum = 0;
//然后相加
for (i = 1; i <=100 ; ++i) {
sum = sum + (float)1/i;
}
printf("%f",sum);
return 0;
}
运行结果:
D:\code\C\st08.exe
5.187378
Process finished with exit code 0
其中这行代码就是强制转换的一行
sum = sum + (float)1/i;
要是不进行强制转换就是后面的值都是小数,回舍去后面的部分,这样子的话,运行结果就只是1 了
在C语言中强制类型转换,强制转换的就是紧跟在后面的值或者变量;
如果需要强制转换一个表达式,那么在这个表达式中应该加上括号;
在上面的强制转换的式子中,float必须加上括号,这样子表示的才是表示强制转换,不然就是语法错误;
这时候还会想到,强制类型转换,是将i转换成其他类型数据了吗,答案是否定的,强制类型转换就是会产生一个临时的值,然后就用这个值进行计算;
4.精度问题
还是上面的问题
在除法中必须必须要有一个数是实数,所以在进行运算的时候,1/i定义成浮点类型的不就是可以了吗,答案是否定的,为什么呢?
因为在计算机中float和double都不能确定数据的精度,我们来写一行代码看一下
#include <stdio.h>
int main(){
double i =2.3;
printf("%.30f",i);
return 0;
}
运行结果如下:
D:\code\C\st09.exe
2.299999999999999822364316059975
Process finished with exit code 0
这时候会发现数据比之前定义的数据小一点点,但是并不是所有的浮点类型都不准确,小数的位数是0的就是准确的,还是写一点代码来看一下
#include <stdio.h>
int main(){
double i =2.0;
double a =3.0;
printf("%.20f %.20f\n",i,a);
return 0;
}
运行结果如下:
D:\code\C\st09.exe
2.00000000000000000000
3.00000000000000000000
Process finished with exit code 0
这时候就是准确的值,所以现在是明白了,为什么将整数转换为浮点
这里有很多的编程题目,但是之前学过Java写过很多了,这里这些题目思路都是差不多,所以暂时不写,以后学习到了数据结构,再来更新题目;
5.while循环
格式:
while(表达式)
{
语句;
}
当表达式是真的就会执行后面的语句,表达式是假的,就不会执行
注意:
1.while(表达式)后面不加分号;
2.加上{ };
案例:
求1~100的和
#include <stdio.h>
int main(){
int sum = 0;
int i = 0;
while(i <= 100){
sum = sum+i;
i++;
}
printf("%d",sum);
return 0;
}
代码是非常的简单;运行结果如下
D:\code\C\st09.exe
5050
Process finished with exit code 0
在这里有一个非常简单的结论,就是在循环次数知道的情况下,一般用for循环,循环次数未知的情况下用while循环;
死循环一般用while(1)就行了;
6.如何看懂一个程序
分三步
- 流程(就是读程序)
- 每条语句的功能(分析每一个语句的功能)
- 试数(带入数据试一试)
7.do...while循环
格式:
do
{
语句;
}
while(表达式);
注意:
- do后面要加{ }
- while(表达式)后面一定要加分号;
- do...while和while不一样,do...while至少会循环一次,但是while则不是;
- getchar()用来吸收scanf遗留在缓冲区的回车;
- 在while循环中有一个getchar()就是真正的清空输入缓冲区,getchar()每次从缓冲区取一个字符只要不是回车就是会一直取下去,知道所有的垃圾字符都取出来,直到回车;
8.break和continue
break可以跳出循环体,也可以跳出Switch;
- break不能用于循环体(for循环、while循环‘do...while循环’)和switch之外的任何一种语句
- break只能跳出一层循环,就是他所在的最里面的循环
- 在switch循环中也只能跳出最近的一个循环,但是switch的多层循环并不多见
continue作用就是结束本次循环,跳过循环体下面没有执行的语句,进入到下一次循环,continue不能在switch中执行
来看一点关于continue的代码
#include <stdio.h>
int main() {
int a;
while(1){
printf("今天星期几(输入数字):\n");
scanf("%d", &a);
switch (a) {
case 1:
printf("今天好好学习C语言!\n");
break;
case 2:
printf("今天好好学习C语言!\n");
break;
case 3:
printf("今天好好学习C语言!\n");
break;
case 4:
printf("今天好好学习C语言!\n");
break;
case 5:
printf("今天好好学习C语言!\n");
break;
case 6:
printf("今天好好学习C语言!\n");
break;
case 7:
printf("今天好好学习C语言!\n");
break;
default:
printf("您输入的数据不存在,请重新输入!\n");
continue;
}
break;
}
return 0;
}
运行结果如下:
D:\code\C\st05.exe
今天星期几(输入数字):
8
您输入的数据不存在,请重新输入!
今天星期几(输入数字):
5
今天好好学习C语言!
Process finished with exit code 0
这时候就是会惊奇的发现可以重新输入星期来从新执行代码;
关于continue我自己的理解就是这样子的,他确确实实的就是跳出了当前的循环当前的循环,然后直接重新执行当前的所在的这个循环,直到输入的语句为合适的值为止;
用上面的例子来说,首先上面的代码中有两个循环,最外层的是一个死循环,在死循环的里面的不是,只有当里面的循环是有结果的情况下才会跳出外面的死循环,程序进行到default之后并没有得到反馈的值,然后就继续执行当前的循环,直到得到反馈的值,说实话这里还不是很理解为什么可以这样做,不过相信在后面的学习中会解决这个问题;
continue在上面的程序中,给了程序重新输入的机会;
9.清空输入缓冲区
1.输入缓冲区
所有从键盘录入的数据,不管是字符还是数字,都是储存在内存中的一个缓冲区,叫做键盘输入缓冲区
2.%d和%c缓冲区的区别
- %d在缓冲区中,空格、回车、tab键都只是分隔符,不会被scanf当成数据取用,当%d遇到这些时只会跳过他们、
- %c中空格,回车,tab都会被取用
来看一点代码
#include <stdio.h>
int main(void){
int a,c;
char b;
printf("一三输入数据,第二个输入符号:");
scanf("%d %c %d",&a,&c,&b);
printf("a=%d c=%c b=%d",a,c,b);
return 0;
}
运行结果如下:
D:\code\C\st11.exe
一三输入数据,第二个输入符号:45
12
a=45 c= b=2
Process finished with exit code 0
4.getchar()
原型:
# incldue <stdio.h>
int getchar(void);
功能就是从缓冲区读取一个字符,这个函数简单好用,有用