本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。
下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。
上一篇:从0开始学c语言-12-循环执行语句(2)for语句_阿秋的阿秋不是阿秋的博客-CSDN博客
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语 言有九种控制语句,可以分为以下三类:
1. 条件判断语句也叫分支语句: if 语句、 switch 语句;
2. 循环执行语句: do while 语句、 while 语句、 for 语句;
3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。
目录
3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
5. 编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
do……while()语句
这语句的特点就是至少执行一次,是先执行后判断是否循环的。
语法结构
do
循环语句;
while(表达式); //注意这个分号
执行流程
代码演示
int main()
{
int i = 1;
do
{
printf("%d\n", i);
i++;
} while (i < 10);
return 0;
}
上面这段代码可以打印1-9的数字,我们改动一下
这样你就会知道啥叫先执行的魅力了~
break和continue
break依旧是直接跳出循环,continue跳过它之后的语句来到判断部分。
练习
1.算出n的阶乘
思路:例如求5!
首先5!=5*4*3*2*1
为了能够输出+1的数字相乘,我们需要使用循环语句。
循环条件有三个部分
初始化部分、判断部分、调整部分
初始化部分:应该是从1开始,因为所有阶乘都有1
判断部分:我们需要从1乘到5,也就是说我们需要设置一个变量,让它小于等于5
调整部分:+1
循环语句中便是每次循环的数字相乘了,但是我们还需要一个变量来储存这个相乘的结果。
那么算下来有三个变量
1、阶乘的变量
2、循环条件的变量
3、结果的变量
那代码就会是这样
int main()
{
int a = 0; //循环变量
int n = 0; //求n的阶乘
int c = 1; //从1开始乘
scanf("%d", &n); //输入n
for (a = 1; a <= n; a++)
{
c *= a; //c是局部变量,上一次循环的值会保留
}
printf("%d\n", c);
return 0;
}
2. 计算 1!+2!+3!+……+10!
我们上面已经算出了任意一个数的阶乘,那么接下来就需要让它们加起来而已!
这个思路很宽广,大家自己想想,我就不带着想了。
一开始我写的比较复杂
int main()
{
int a = 1;
int n = 2; //条件需要变量
int c = 1; //每个阶乘的结果
int he = 0; //相加的结果
while (n < 12)
{
for (; a < n; a++) //因为是大循环中的小循环,所以没进行初始值的设定
//否则每次小循环的结果都一样
{
c *= a;
he += c;
}
n++;
}
printf("%d\n", he);
return 0;
}
然后又写了这个
int main()
{
int a = 0;
int n = 0;
int c = 0; //阶乘结果
int he = 0; //相加结果
for(n=1;n<=10;n++)
{
c = 1; //初始化,试试去掉的效果
for(a=1; a <= n; a++)
{
c *= a;
}
he += c;
}
printf("%d\n", c);
printf("%d\n", he);
return 0;
}
c=1很重要,需要每次置1才能让小循环正确输出阶乘的结果。
大循环输出10个数并加起来每个小循环后的阶乘,小循环进行阶乘。
然后,又写了这个
int main()
{
int n = 0;
int c = 1;
int he = 0;
for (n = 1; n <= 10; n++)
{
c *= n; //10的阶乘等于10*9的阶乘
he += c;
}
printf("%d\n", he);
return 0;
}
每次循环后的c都是n的阶乘,这种写法更加简洁一些。
简单来说就是n的阶乘=n*(n-1)的阶乘,而这种写法的原理就是这个。
3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
利用数组的下标来寻找数字,我们使用二分法来提高查找效率。
二分法就是从中间去找,去不断和你要查找的数字对比,进而不断缩小范围。
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0; //左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1; //右下标
int key = 7; //要寻找的值
int mid = 0; //中间值
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
break;
}
if (left <= right)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
return 0;
}
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
这玩意对小白来说很难自己独立敲出来,看代码理解吧。
#include <windows.h>
#include <string.h>
#include <stdio.h>
int main()
{
char aqiu1[] = "victory and peace";
char aqiu2[] = "*****************"; //给两个可以交换元素的数组
int left = 0;
int right = strlen(aqiu2) - 1; //字符串长度-1
//定义了左右下标
while (left <= right) //一直到左右下标互换后跳出循环
{
aqiu2[left] = aqiu1[left];
aqiu2[right] = aqiu1[right];
printf("%s\n", aqiu2);
Sleep(500); //单位是毫秒,s要大写,要用新的头文件,睡眠半秒
system("cls"); //清空屏幕
left++;
right--;
}
printf("%s\n", aqiu2);
return 0;
}
如果不清空屏幕,那么每次输出都会换行,打印出来的效果很不美观。
5. 编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
#include <windows.h>
#include <string.h>
#include <stdio.h>
int main()
{
printf("请输入密码\n");
char password1[20] = { 0 };
char password2[20] = { 0 };
int time = 0;
scanf("%s", password1);
Sleep(1000);
for (time = 1; time <= 3; time++)
{
/*char password2[20] = { 0 };*/ //我想加上初始化来着,看来scanf每次都是新取的密码
printf("请再次输入确认密码\n");
scanf("%s", password2);
/*if (password1==password2)*/ //这样写不行
//两个字符串比较,应该用strcmp,引用string头文件,比较的是两个字符串的ASCII码
/*if (strcmp(password1, "123") == 0)*/ //假设密码123,这么写也可
if (strcmp(password1, password2) == 0)
{
printf("密码正确");
return 0;
}
else
printf("密码错误,亲\n");
}
printf("超过最大次数,请明天再来");
return 0;
}
strcmp比较的是对应字符的ASCII码值,
if(password1 == password2)这种写法是比较两个字符串首字符的地址。
比较地址是没有意义的,因为地址会变,哪怕储存的内容相同。