循环结构

接着之前的继续写。写一个程序

int main()

{

int ret = 0;

char password[20] = {0};

printf("请输入密码:>”);

scanf("%s", password);

printf("请输入(Y/N):>");

ret = getchar();

if (ret == 'Y')

{

printf(”确认成功“\n”);

else

printf(”放弃确认“\n”);

return 0;

当真正开始输入时,我们会发现结果并不是我们想象的结果,会是输入密码之后请确认y或者n冒号之后直接就是放弃确认。按照我们所想象的那两个应该是输入密码之后,然后要去判断,看看是不是Y,然后再去就确认成功或者放弃确认。但是无论怎么样,他都会直接输出一个放弃确认,所以说这就会发现一些问题。为什么出现问题?要仔细看这一个代码。输入密码之后,scarf这个函数,它就会去读取密码,但scanf和下面的get char都会去读取一个地区叫做输入缓冲区,我们所输入的东西都在这个输入缓冲区里边,当程序刚开始的时候输入缓冲区是空的,什么都没有,所以这时候scanf就在等待,等待你输入。当我们输入了比如说123456之后,但是我们输入数字之后空格一下,后面会有自带的\n,这是一个自带的,也就是我们输入到输入缓冲区里边儿的是123456\n,而scanf函数要读取这个密码,它一旦读取之后呢它读取了123456,它就会去拿走这个123456这个密码,而剩下的这个\n它的ANCII码值是10,后面的getchar会再去读取得到一个10,10并不是Y,所以说它会直接输入放弃确认。那么修改一下。

int main()

{

int ret = 0;

char password[20] = {0};

printf("请输入密码:>”);

scanf("%s", password);

getchar()

printf("请输入(Y/N):>");

ret = getchar();

if (ret == 'Y')

{

printf(”确认成功“\n”);

else

printf(”放弃确认“\n”);

return 0;

在scanf后加了一个getchar,这样就读取走了10,之后的getchar就会等待输入Y/N。但是这样仍然错误。如果我们输入123456 ABCD  。123456空格ABCD空格,那么最后的getchar读取走了ABCD,仍然错误。再次改进,用循环来持续读取:

int main()

{

int ret = 0;

int  ch  =  0;

char password[20] = {0};

printf("请输入密码:>”);

scanf("%s", password);

while((ch = getchar()) != '\n')

{

;

}

printf("请输入(Y/N):>");

ret = getchar();

if (ret == 'Y')

{

printf(”确认成功“\n”);

else

printf(”放弃确认“\n”);

return 0;

把getchar()改为while循环,这样就会让scanf一直读取。避免出现错误。继续再看一个代码:

#include <stdio.h>

int main()

{

while (( ch = getchar() ) != EOF)

{

if ( ch < '0'  ||  ch > '9')

continue:

putchar(ch);

}

return 0;

}

只打印零到9的数字

for循环

前面已经讲到一些:for(expr1;expr2;expr3)

循环语句

写一个简单的程序

int main()

{

int i = 0;

for(i = 1; i <= 10; i++)

{

if(i == 5)

break;

printf("%d", i);

break跳出循环,与while中作用一致,而continue稍有点不同,改成continue:

int main()

{

int i = 0;

for(i = 1; i <= 10; i++)

{

if(i == 5)

continue;

printf("%d", i);

写一下while的:

int i = 1;

while(i <= 10);

{

if (i == 5)

continue;

printf("%d", i);

i++;

}

for中不会死循环,因为赋值,判断后,就执行if语句,continue后就来到i++,所以不会死循环。

for循环控制变量

1、不可在for循环体内改变循环变量,防止循环不受控制

int main()

{

int i = 0;

for(i = 1; i <= 10; i++)

{

if(i = 5)

printf("haha");

printf("hehe");

如果是这样,程序就会死循环。当到达if这一步时,i被赋值为5,打印hehehaha,而回到i++,再到i = 1,会发现循环一直进行,无法停止。

2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

for(i = 1;i < 10)这样就是前闭后开。习惯问题,10就好像代表着10ci循环一样,只是一种习惯问题。

变种1

for语句初始化(赋值),判断,调整都可以省略,但是判断省略后就表示条件恒为真,需谨慎使用。具体看一个例子:

int main()

int i = 0;

for(i = 0; i < 10; i++)
       {

int j = 0;

for( j = 0; j < 10; j++)

{

printf(”hehe\n“);

return 0;

可以打印100个hehe,但是程序可能会感觉繁琐了。前有i = 0了,for语句是否需要再说一遍,如果去掉for语句的初始化部分,结果是十个hehe

变种2:

也有多种条件的:

int x, y;

for(x = 0, y = 0; x < 2 && y < 5; ++x, y++)

{

printf("hehe\n");

}

return 0;

}

此外看一道题:

#include <stdio.h>

int main()

{

int  i  =  0;

int  k =  0;

for(i = 0, k = 0; k = 0; i++, k++)

k++;

return 0;

}

循环根本不进入,k = 0后为假。

do—while循环

do

循环语句;

while(表达式)

打印1~10:

int main()

{

int i = 1;

do

{

printf("%d", i);

i++;

}

while(i <= 10);

return 0;

}

do后有大括号才能写多个语句,否则只能写一个。打印出1后,变为2,2 <=  10,然后再回到循环中,直接进入循环,打印2.....。do while也有break,continue。break总是终止循环,所以只有1234.continue跳过printf,i++,直接到while,然后又回到判断方面,i还是5,形成死循环。

int main()

{

int i = 1;

do

{

if(i == 5);

continue/break;

printf("%d", i);

i++;

}

while(i <= 10);

return 0;

}

到现在为止,所有循环都已经学完,需要做一些总练习。

练习

1、计算n的阶乘

#include <stdio.h>

int main()

{

int i = 0;

int n = 0;

int ret = 1;

scanf("%d", &n);

for ( i = 1; i <= n; i++)

{

ret = ret * i;

}

printf("ret = %d\n", ret);

return 0;

}

2、计算1!+2!+3!。。。10!

#include <stdio.h>

int main()

{

int i = 0;

int n = 0;

int ret = 1;

int sum = 0;

for(n = 1; n <= 10; n++)

{

for (i = 1; i <= n; i++)

{

ret = ret * 1;

}

sum = sum + ret;

printf(“sum = %d\n”, sum);

}

return 0;

}

但是这个效率不高,进阶版:

#include <stdio.h>

int main()

{

int i = 0;

int n = 0;

int ret = 1;

int sum = 0;

for(n = 1; n <= 10; n++)

{

ret = ret * n;

sum = sum + ret;

printf(“sum = %d\n”, sum);

}

return 0;

}

3、在一个有序数组中查找具体的某个数字n,-。编写int binsearch(int x, int v[], int n);功能:在v[0] <= v[1] <= v[2] <= ...<= v[n-1]的数组中查找x。

#include <stdio.h>

int main()

{

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int k =17;

int i = 0;

int sz = sizeof(arr)/sizeof(arr[0]);

for(i = 0; i <sz; i++)

{

if(k == arr[i])

{

printf("找到了,下标是: %d\n", i);

break;

}

}

if (i == sz)
      printf("找不到\n”);

return 0;

但是不够有效,折中想法。

int main()

{

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int k =7;

int sz = sizeof(arr)/sizeof(arr[0]);  //计算元素个数

int left = 0;  左下标

int right = sz - 1;   右下标

while (left <= right)

{

int mid = (left + right)/2;

if(arr[mid] > k)

{

right = mid - 1;

}

else if (arr[mid] < k)

{

left = mid + 1;

}

else

{

printf("找到了,下标是:%d\n", mid);

break;

}

}

if (left > right)

{

printf("找不到\n");

}

return 0;

}

4、编写代码,演示多个字符从两端移动,向中间汇聚

#include <stdio.h>

#include <string.h>

#include <windows.h>

#include <stdlib.h>

int main()

{

char arr[1] = "welcome to bit!!!!!!";

char arr[2] = "##############";

int left = 0;

int right = strlen(arr1) - 1;

while(left <= right)

{

arr2[left] = arr1[left];

arr2[right] = arr1[right];

printf("%s\n", arr2);

Sleep(1000);

system(“cls”);  //执行系统命令的一个函数cls——清空屏幕

left++;

right--;

}

return 0;

}

5、编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确这提示登录成功,如果三次均输入错误,则退出程序。

#include <stdio.h>

#include <string.h>

#include <windows.h>

#include <stdlib.h>

int main()

{

int i = 0;

char password[20] = {0};

for(i = 0; i < 3; i++)

{

pritnf("请输入密码:>");

scanf("%s", password);

if (strcmp(password , "123456")== 0)  //等号不能用于判断字符串相等。应使用一个库函数strcmp

{

printf("登录成功\n“);

break;

if(i == 3)

printf("三次密码均错误,退出程序“);

return 0;

如果字符串相等,strcmp返回0.第一个大于第二个,返回大于0的数值,小于则返回小于0的数值。

以上练习需反复琢磨,新手期需要这样的代码。

结束。

C语言学习记录——유 分支与循环(2)相关推荐

  1. C语言学习分享/分支与循环

    #include <stdio.h> #include <string.h> #include <windows.h> #include <stdlib.h& ...

  2. 循环数组函数c语言,C语言练习题2(分支结构循环结构数组函数2009-2012二级真题)..doc...

    C语言练习题2(分支结构循环结构数组函数2009-2012二级真题). C语言练习题(二) 一 选择题 1.有以下程序 #include void main() { int a: canf(" ...

  3. 包括循环和分支的C语言程序,《C语言程序设计》分支和循环的C程序设计.ppt

    <C语言程序设计>分支和循环的C程序设计.ppt 第三章 分支和循环的C程序设计 问题 一元二次方程根求解算法描述 3.1 程序的基本结构 ⒊循环结构Repetition ⒋复合语句 Co ...

  4. 分支函数c语言,C语言练习题2(分支结构 循环结构 数组 函数2009-2012二级真题 ).doc...

    C语言练习题2(分支结构 循环结构 数组 函数2009-2012二级真题 ) C语言练习题(二) 一 选择题 1.有以下程序 #include void main() { int a: canf(&q ...

  5. Fortran语言学习记录

    Fortran语言学习记录** ** 今天是2020年4月1日,上午终于把微软的Visual Studio 2013(https://blog.csdn.net/wobckr/article/deta ...

  6. C语言学习记录(14)英文单词排序 查找最长的单词

    C语言学习记录 前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习C语言写起,自己本身对程 ...

  7. C语言学习 2.分支语句与循环语句

    文章目录 分支语句与循环语句 1. 什么是语句 2. 分支语句(选择结构) 1. if语句 1.1 if的书写形式 1.2 练习 2. switch语句 2.1 在switch语句中的break 2. ...

  8. C语言分支结构while,C语言学习:分支结构和循环结构的总结(收藏)

    C言语中常用的编程结构有三种(其它编程言语也是如此),它们分别是: 次序结构:代码早年往后顺次履行,没有任何"借题发挥",不越过任何一条句子,一切的句子都会被履行到.挑选结构:也叫 ...

  9. Linux C语言学习记录(Day2-Day4)

    不断有前辈跟我推荐,学习技术要写博客.既可以巩固记忆,又能时时回顾,发现不足.今天尝试写下第一篇! 大一学过C语言,但是仅仅是会解一些很简单的问题,比如鸡兔同笼,一元二次方程组这样的.学的很浅,在后面 ...

最新文章

  1. linux远程脚本事例,ssh远程执行命令方法和Shell脚本实例
  2. 启动转换安装失败 拷贝windows安装文件时出错_系统小技巧:“徒手”创建可启动的VHD系统...
  3. 64位Win10安装Pytorch
  4. 树根c语言,03-树1 树的同构 (C语言链表实现)
  5. 【风控体系】携程基于大数据分析的实时风控体系
  6. [ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
  7. C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.
  8. tensorflow实现宝可梦数据集迁移学习
  9. 安卓APP_ 控件(9)—— PopupWindow弹窗
  10. c语言错误解析-变量声明
  11. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽
  12. linux安装软件imagemagick,Linux系统中怎么安装和使用ImageMagick软件?
  13. 【定位问题】基于matlab GUI RSSI无线定位【含Matlab源码 1054期】
  14. qtp测试 java web_QTP之web常用对象
  15. Dell(戴尔)Alienware(外星人)Alienware Command Center(AWCC)更新失败解决方案(究极版)
  16. Tools - UML绘图工具
  17. 恐怖的aliedit
  18. AMD GPU任务调度(1)—— 用户态分析
  19. 【第3讲】 噪声滤波器的原理
  20. 几何向量:向量乘法(叉乘)

热门文章

  1. 历史上的今天:PHP公开发布;iPhone 4 问世;万维网之父诞生
  2. 数论概论笔记(二)勾股数组
  3. 哈工大c语言编程题,哈工大c语言练习题
  4. 改装智能锁,或是ofo“学习”摩拜的开始!
  5. 高斯混合模型参数估计的EM算法
  6. Linux_网络项目_WEB服务器 设计CGI机制,与CGI处理数据
  7. html两个盒子怎么左右对其,多个div两端对齐
  8. DirectX 3D 简单渲染流程
  9. 模式识别:C-means(K-means)聚类算法与分级聚类(层次聚类)算法
  10. Plants vs. Zombies ZOJ - 4062