while循环语句语法结构
while(表达式)
循环语句:
如果while后的表达式为非零或真,则会循环执行里面的循环语句,直到表达式为0或假,它才会停止循环
比如:我想打印1-10个数
int main()
{
int i = 1; //初始化
while(i<=10) //判断部分
{
printf("%d",i);
i++; //循环的调整部分
}
return 0;
}
while语句三个部分,初始化、判断、调整一旦有一个发生了改变,那么while语句就会发生改变。
break与continue的差别
break在while中的用法
int mian(){
int i = 1;
while (i <= 10){
if(5 == i)
break;
printf("%d",i);
i++;
}
return 0;
}
Console:
1 2 3 4
在while循环中,break用于永久的终止循环。
continue在while中的用法
int mian()
{
int i = 1;
while()
{
if(5 == i)
continue;
printf("%d",i);
i++;
}
return 0;
}
Console:
1 2 3 4
和加了break的while循环不一样的是加了continue的程序,在打印出1234之后,就会卡死。
是因为,在while循环中,continue的作用是跳过本次循环continue后面的代码,直接去判断部分,看是否进行下一次循环。
getchar
getchar:获取一个字符,如果获取的是正确的字符就得到的是字符,如果获取的是错误的字符,就会输出EOF
EOF - end of file - 文件结束标志
int mian()
{
int ch = getchar();
//printf("%c\n",ch);
putchar(ch); //输出一个字符
return 0;
}
int mian()
{
int ch =0;
//ctrl+z - getchar 就读取结束
while((ch = getchar())!EOF)
{
putchar(ch);
}
return 0;
}
做一个案例:
我输入密码之后要确认密码,输入的密码为5998
int mian()
{
char password[20] ={0};
printf("请输入密码:");
scanf("%s",password); //因为password存的就是地址值,所以不用加地址符号
printf("请确认密码(Y/N)");
//清理缓冲区
getchar(); //处理掉多余的 '\n'
int ch = getchar();
if('Y' == ch)
{
printf("密码输入成功\n");
}else{
printf("密码输入失败\n");
}
return 0;
}
Console:
请输入密码:5998
请确认密码(Y/N): Y
密码输入成功
如果我想要输入的密码中含有空格的话,通过上面的代码能实现吗?
int mian()
{
char password[20] = {0};
printf("请输入密码:");
scanf("%s",password);
printf("请确认密码:");
getchar();
int ch = getchar();
if('Y' == ch)
{
printf("密码输入成功\n");
}else{
printf("密码输入失败\n");
}
return 0;
}
Console:
请输入密码:5998 xtt
请确认密码(Y/N):密码输入失败
通过上面代码可以看出,如果是加了空格的密码会导致直接失败,原因和上一个例子的\n一样,空格被获取了,那我怎么才能解决这个问题?
int mian()
{
char password[20] = {0};
printf("请输入密码:");
scanf("%s",password);
printf("请确认密码:");
//清理缓存区的多个字符
int temp = 0;
while(temp = getchar() != '\n')
{
;
}
int ch = getchar();
if ('Y' == ch)
{
printf("密码输入成功\n");
}else{
printf("密码输入失败\n");
}
return 0;
}
Console:
请输入密码:5998 xtt
请确认密码(Y/N): Y
密码输入成功
添加一个while循环,来把多余的东西清除掉,就能加上空格来作为密码了。
for循环语法结构
//初始化 //判断 //调整 ——> //类比while循环
for(表达式1 : 表达式2 : 表达式3)
循环语句;
同样是打印1-10,用for来实现
int mian()
{
int i = 0;
//表达式1 //表达式2 //表达式3
for( i = 1; i <= 10; i++ )
{
printf("%d",i);
}
return 0;
}
break和continue在for循环中的注意事项
同样是打印1-10,使用了break和continue语句的循环有什么不同?
break的使用
int mian()
{
int i = 0;
//表达式1 //表达式2 //表达式3
for( i = 1; i <= 10; i++ )
{
if(5 == i)
break;
printf("%d",i);
}
return 0;
}
Console:
1 2 3 4
continue的使用
int mian()
{
int i =0;
for( i = 1; i <= 10; i++)
{
if(5 == i)
continue;
printf("%d",i);
}
return 0;
}
Console:
1 2 3 4 6 7 8 9 10
break和continue同样在for循环里出现了不同,break同样是直接跳出了这个for循环,而continue同样是只结束continue之后的语句,直接进入下一个判断,和while循环不一样的是,for循环的调整改到了判断语句里,并不在continue之后,所以在运行的时候,它并没有像while语句一样重复循环导致 卡死,而是跳过了5转而执行下一步操作。
for循环的一些注意事项:
1.在for循环体内,尽量不要修改循环变量,防止for循环失去控制。
就如:
int mina()
{
int i =0;
for(i = 1; i <= 10; i++)
{
printf("%d",i);
i = 5;
}
return 0;
}
如果改变了循环变量的值,加了一个i=5,则控制台会打印出无限个6,陷入死循环。
2.判断部分的省略 ——>判断部分恒为真
int main()
{
//判断部分的省略,会导致判断部分恒为真
for(;;)
{
printf("hehe\n");
}
return 0;
}
控制台会一直打印hehe,陷入死循环。
do…while循环
do…while语句的语法:
do
循环语句:
while(表达式);
和while循环语法不同的是,它多了一个do,差别在于,do…while循环是先执行do里面的循环语句,才去执行后面的while表达式。
同样是打印1-10,使用do…while来实现这个功能
int mian()
{
int i = 0;
do
{
printf("%d",i);
i++;
}while( i <=10 )
return 0;
}
Console:
1 2 3 4 5 6 7 8 9 10
break语句在do…while里的使用
同样打印1-10,使用break看看会有什么结果
int mian()
{
int i = 0;
do{
if(5 == i)
break;
printf("%d",i);
i++;
}while( i <= 10)
return 0;
}
Console:
1 2 3 4
continue在do…while循环的使用
int mian()
{
int i = 0;
do{
if( 5 ==i )
printf("%d",i);
continue;
i++;
}while(i<=10)
return 0;
}
Console:
1 2 3 4
和while一样的结果,使用break依然是跳出循环,而使用continue语句到4依然会卡死。
和while语句不一样的是,do语句的特点是:循环至少执行一次。
计算n的阶乘
int mian(){
int i = 0;
int j = 1;
int num = 0;
scanf("%d",&num);
for( i=1;i<=num;i++){
j *= i;
}
printf("%d\n",j);
return 0;
}
计算1!+2!+3!+…+10!
int mian(){
int i=0;
int a = 0;
int b = 0;
int sum = 0;
for( i=1; i<=10; i++){
b=1;
for( j=1; j<=i; j++){
b *= j;
}
sum += b;
}
printf("%d\n",sum);
return
}
代码优化
其实
3!=321 = 32!
2!=21=2*1!
int mian()
{
int i=0;
int a=0;
int sum=0;
for( i =1; i<=10; i++)
{
a *=i;
sum += a;
}
return 0;
}
在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=…<=[n-1]的数组中查找x。
二分法查找
int mian()
{
int arr[] ={1,2,3,4,5,6,7,8,9,10};//定义数组
int num =7; //要查找的数字
int size = sizeof(arr) / sizeof(arr[0]); //数组的元素个数
int left = 0;
int right = size -1;
while(left<=right)
{
int temp = (left + right) /2;
if(arr[temp] < num){
left = temp +1;
}
else if(arr[temp]> num){
right = temp -1;
}
else
{
printf("查找的数下标为:%d\n",temp);
break;
}
}
if(left > right)
{
printf("数组中没有这个数\n");
}
return 0;
}
编写代码,演示多个字符从两端移动,向中间汇聚。
要求控制台打印:xi huan ni
#include
int mian()
{
char arr1[]="xi huan ni";
char arr2[]="**********";
int left =0;
int right = strlen(arr)-1;
while(left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr2[right];
printf("\s\n",arr2);
Sleep(1000); //睡眠1秒
system("cls"); //清空屏幕
left++;
right--;
}
printf("\s\n",arr2);
return 0;
}
编写代码实现,模拟用户登录情景,并且只能登录3次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序。)
#include
int main()
{
int i =0;
//假设正确的密码是字符串5998
char password[20] ={0};
for( i =0; i <= 3; i++)
{
printf("请输入密码:");
scanf("%s",password);
//if(password == "5998") err,比较两个字符串不能用==,使用strcmp
if(strcmp(password,"5998")==0);//密码相同为0,不同为1
{
printf("登陆成功\n");
break;
}else{
printf("密码错误");
}
}
if( 3 == i){
printf("登录失败\n");
}
return 0;
}
单选题
答案为C
A.错误,if 语句可以后接一个大括号,大括号里可以跟多个语句。
B.错误,if 语句中0表示假,但是非0的数表示真,不一样是1表示真。
C.正确。
D.错误,else讲究就近原则。
答案为C
A.正确。
B.正确。
C.正确,default可以放在任意位置,不要求顺序
D.正确。
int func(int a)
{
int b;
switch(a)
{
case 1:b =30;
case 2:b =20;
case 3:b =16;
default:b =0;
}
return b;
}
A.30
B.20
C.16
D.0
答案为D
因为func虽然给的值为1,进去的值为1,应该执行case1,b=30,但是case1的语句执行过后,并没有break语句来结束循环,而是继续进行下去,直到default语句执行完,输出b=0。
编程题
题目1:
从小到大输出
题目内容:
写代码将三个整数按从小到大输出。
例如:
输入:2 3 1
输出:3 2 1
int mian()
{
int a =0;
int b =0;
int c =0;
//输入
scanf("%d %d %d",&a,&b,&c);
//排序
if(a<b){
int temp =a;
a = b;
b = temp;
}
if(a<c){
int temp =a;
a = c;
c = temp;
}
if(b<c){
int temp =b;
b = c;
b = temp;
}
printf("%d %d %d\n",a,b,c);
return 0;
}
题目2:
打印3的倍数的数
题目内容:
写一个代码打印1-100之间所有3的倍数的数字
int mian()
{
int i;
int temp;
for( i =1; i <=100; i++){
if( i%3 == 0) {
printf("%d",i);
}
}
return 0;
}
题目3:
最大公约数
题目内容:
给定两个数,求这两个数的最大公约数
int mina()
{
int a;
int b;
scanf("%d %d\n",&a,&b);
while(1)
{
if( m% max == 0 && n % max ==0)
{
printf("最大公约数为:",max);
break;
}
}
return 0;
}
题目4
题目名称:
打印润年
题目内容:
打印1000年到2000年之间的润年
int mian(){
int i = 0;
for( i = 1000; i<=2000 ; i++){
//判断是不是润年
//1.被4整除,不能被100整除是闰年
//2.能被400整除是闰年
if( i % 4 == 0 ){
if( y %100 != 0 ){
printf("%d",y);
}
}
if( y % 400 == 0 )
{
printf("%d",y);
}
}
return 0;
}
方法二:
int mian()
{
int i =0;
for( i=1000; i<=2000; i++){
if(( i % 4 ==0 ) && ( i % 100 !=0) || ( y % 400 == 0)){
printf("%d",i);
}
}
return 0;
}
题目5
题目名称:
打印素数
题目内容:
写一个代码:打印100-200之间的素数
int mian()
{
int i = 0;
int j = 0;
for( i = 100; i <=200; i++)
{
for( j = 2; j < i; j++ )
{
if( i % j != 0)
{
printf("%d",i);
}
if( i % j == 0)
{
break;
}
}
}
return 0;
}