bit课程笔记(6)

分支与循环相关练习

练习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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值