分支与循环相关练习
练习1:查找数字
二分查找算法
在一个有序数组中查找具体的某个数字n,本题仅探究是否存在,不探究个数
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 10;//设定需要查找的目标数字
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;
}
练习2
编写代码,演示多个字符从两端移动向中间汇聚
#include <stdio.h>//引printf函数
#include <string.h>//引strlen函数
#include <windows.h>//引Sleep函数
#include <stdlib.h>//引system函数
int main()
{
char arr1[] = {"welcome to bit !!!!!!"};
char arr2[] = {" "};
int left = 0;
int right = strlen(arr1) - 1;//等价于int right=sizeof(arr1)/sizeof(arr1[0])-2;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];//用arr1最左右端的字符替换arr2同位置的字符
printf("%s\n", arr2);
Sleep(1000);//休息1秒
system("cls");//清屏 system();执行系统命令的函数
left++;
right--;
}
return 0;
}
int right = strlen(arr1) - 1;//等价于int right=sizeof(arr1)/sizeof(arr1[0])-2;
因为字符串包括\0,所以用除法计算出元素个数后找末端下标应减2,strlen()函数从字符串开头位置依次向后计数,直到遇见\0,不包括\0,然后返回值,最终得到字符串长度。
练习3
注意点1
if(password=="123456")//error,==不能用来比较两个字符串是否相等,应该使用库函数-strcmp
if(strcmp(password,"123456")==0)//正确写法
注意点2
scanf("%d,%d,%d",&a,&b,&c);
前面%d间有”,“时,则输入时也要有”,“,格式完全一致
建议书写成
scanf("%d%d%d",&a,&b,&c);
练习4:辗转相除法
求两个数最大公约数的算法——辗转相除法:用较大的数除以较小数,再用除数去除第一余数,再用第一余数去除第二余数,如此反复,直到最后余数时0为止,此时最后除数就是最大公约数。
#include <stdio.h>
int main()
{
int m, n, r;
scanf("%d%d", &m, &n);
while (r = m % n)//最终表达式结果为0,跳出循环
{
m = n;
n = r;
}
printf("%d\n", n);
}
练习5:打印闰年
if(((year%4==0)&&(year%100!=0))||(year%400==0))
printf("%d",year);
练习6:分数求和
1/1+1/2+1/3+...+1/100求和
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0.0;//浮点型变量一定要有小数点
for (i = 1; i <= 100; i++)
{
sum += 1.0 / i;//在sum原来的基础上加1/i
}
printf("%lf\n", sum);//1/1+1/2+1/3+...+1/100
return 0;
}
1/1-1/2+1/3+...+1/99-1/100求和
#include <stdio.h>
int main()
{
int i = 0, flag = 1;
double sum = 0.0;
for (i = 1; i <= 100; i++)
{
sum += flag * 1.0 / i;
flag = -flag;
}
printf("%lf\n", sum);//1/1-1/2+1/3+...+1/99-1/100求和的一种解法
return 0;
}
练习7:打印乘法口诀表
printf("%d*%d=%2d",i,j,i*j);//打印两位数字右对齐,如果不够两位用空格补齐
2*2= 4
3*2= 6
4*2= 8
5*2=10
6*2=12
printf("%d*%d=%-2d",i,j,i*j);//左对齐
2*2=4
3*2=6
4*2=8
5*2=10
6*2=12
时间戳
时间戳:当前计算机的时间-计算机的起始时间(1970.1.1.0:0:0)=...秒
srand()是用来初始化随机种子数,这里通过当前时间来获得这个随机种子,time的值每时每刻都不同,所以种子不同,产生的随机数也不同。然后调用rand(),它会根据提供给srand()的种子值返回一个随机数。
#include <stdio.h>
#include <time.h>
int main()
{
int a;
srand((unsigned)time(NULL));
a = rand();//rand()所能返回的随机数最大值为32767,若想生成1~100的整数,a=rand()%100+1;
printf("%d", a);
return 0;
}
goto语句
C语言提供了可以随意滥用的goto语句和标记跳转的标号,理论上goto语句没有必要,实践中没有goto语句也可以写出代码。
但某些情况下,goto语句有其妙用,最常见的用法就是终止某些程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
这些情况下用break是达不到目的的,他只能从最内层的循环退出到上一层循环。
适用场景
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
...
error: