【C语言程序设计笔记】

C语言程序设计笔记---008

  • C语言三大语法结构综合练习题
    • 1、练习题
      • 1.1、计算n的阶乘
      • 1.2、计算10!+9!.....+1!的和
      • 1.3、在一个有序数组中查找具体的某个数字n.
      • 1.4、多个字符由两端开始移动,向中间汇聚
      • 1.5、模拟用户登录情况,并且只能登录三次(只可以输入三次密码的机会)
      • 1.6、将三个整数,从大到小输出
      • 1.7、给定两个数,求这两个数的最大公约数
      • 1.8、打印1000年到2000年之间的闰年
      • 1.9、打印100~200间的素数
    • 2、综合题
      • 2.1、综合题1
      • 2.2、综合题2

C语言三大语法结构综合练习题

1、练习题

1.1、计算n的阶乘

说明:n! = 1234…*(n-1)*n

/*例程1.1*/
#include <stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int k = 1;
	printf("请输入所求n的阶乘:");
	scanf("%d",&n);
	for (i = 1; i <= n; i++)
	{
		k = k*i;//根据阶乘的性质,用k存储自身与i的变量,实现阶乘
	}
	printf("%d\n",k);
	return 0;
}

1.2、计算10!+9!…+1!的和

/*例程1.2*/
#include <stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int k = 1;
	int sum = 0;
	//方法一:
	for (n = 1; n <= 10; n++)
	{
		k = k*n;
		sum = sum + k;
	}
	//方法二:
	for (n = 1; n <= 10; n++)
	{
		k = 1;//注意:计算n阶乘之前需要将K置1
		//阶乘运算
		for (i = 1; i <= n; i++)
		{
			k = k*i;
		}
		//阶乘的和
		sum = sum + k;
	}
	printf("%d\n", sum);
	return 0;
}

1.3、在一个有序数组中查找具体的某个数字n.

a、二分查找法
b、如:1 2 3 4 5 6 7 8 9 10
c、通过下标和来**/2**进行计较筛选

/*例程1.3*/
#include <stdio.h>
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int num = 7;//要查找的数字
	//在arr有序数组中查找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]<num)
		{
			left = mid + 1;//右下标没变,左下标加1,构成新范围查找
		}
		else if (arr[mid]>num)
		{
			right = mid - 1;//左下标没变,右下标减1,构成新范围查找
		}
		else
		{
			printf("找到了,具体数的下标:%d\n", mid);
			break;
		}
	}
	if (left > right)//左下标与右下标交错
	{
		printf("超出范围,找不到\n");
	}
	return 0;
}

1.4、多个字符由两端开始移动,向中间汇聚

如:
welcome to beijing!!!!!!
########################
w######################!
we####################!!
........
welcome to beijing!!!!!!
/*例程1.4*/
#include <stdio.h>
#include <string.h>//调用strlen()需要的头文件
#include <windows.h>//调用sleep()与system()需调用的头文件
int main()
{
	char arr1[] = "welcome to beijing!!!!!!";
	char arr2[] = "########################";
	//定义下标
	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);//延迟1000ms//注意:首字母大写
		system("cls");//清空屏幕
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

1.5、模拟用户登录情况,并且只能登录三次(只可以输入三次密码的机会)

说明:如果密码输入正确,则提示登录完成,如果三次均输入错误,则强制退出程序。假设正确密码是字符串:“123456”

/*例程1.5*/
#include <stdio.h>
#include <string.h>//运用strcmp()函数需要调用的头文件
int main()
{
	int i = 0;
	char password[20] = {0};
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s",password);
		//注意:%s才是字符串的格式符
		//scanf("%d",&password);//注意:数组名本身就是地址,所以不加取地址符&
		//if ("123456" == password)//注意:字符串之间的比较,不可以之间==判断
		//需要strcmp(stm1,stm2)字符串比较函数
		//比较stm1y与stm2的ASCII的值相等则,返回值为0
		//stm1>stm2则返回1
		//stm1
		if (strcmp(password, "123456") == 0)
		{
			printf("密码正确\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	//三次密码均错误
	if(i > 3)
	{
		printf("密码错误强制退出\n");
	}
	return 0;
}

1.6、将三个整数,从大到小输出

方法一:

/*例程1.6*/
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int t = 0;
	int m = 0;
	printf("请输入第一个数:");
	printf("\n");
	scanf("%d",&i);
	printf("请输入第二个数:");
	printf("\n");
	scanf("%d", &j);
	printf("请输入第三个数:");
	printf("\n");
	scanf("%d", &t);
	if (i < j)
	{
		m = i;
		i = j;
		j = m;
		if (i < t)
		{
			printf("Max = %d\n",t);
			printf("Mid = %d\n", i);
			printf("Min = %d\n", j);
		}
		else if (j < t)
		{
			printf("Max = %d\n", i);
			printf("Mid = %d\n", t);
			printf("Min = %d\n", j);
		}
		else//t
		{
			printf("Max = %d\n", i);
			printf("Mid = %d\n", j);
			printf("Min = %d\n", t);
		}
	}
	else//i>j
	{
		m = j;
		j = i;
		i = m;
		if (j < t)
		{
			printf("Max = %d\n", t);
			printf("Mid = %d\n", j);
			printf("Min = %d\n", i);
		}
		else if (i < t)
		{
			printf("Max = %d\n", j);
			printf("Mid = %d\n", t);
			printf("Min = %d\n", i);
		}
		else//t
		{
			printf("Max = %d\n", j);
			printf("Mid = %d\n", i);
			printf("Min = %d\n", t);
		}
	}
	return 0;
}

方法二:

/*例程1.6*/
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d",&a,&b,&c);//注意:空格原样输入
	if (a < b)//将较大值赋值给a--a>b
	{
		int temp = a;//交换变量//可思考进阶,封装函数实现,然后调用
		a = b;
		b = temp;
	}
	if (a < c)//将较大值赋值给a---a>c
	{
		int temp = a;
		a = c;
		c = temp;
	}
	if (b < c)//将较大值赋值给b---b>c
	{
		int temp = b;
		b = c;
		c = temp;
	}
	printf("%d %d %d\n",a,b,c);
	return 0;
}

1.7、给定两个数,求这两个数的最大公约数

说明:最大公约数:辗转相除法,比较两个数,用大的数对小的数取余,直到余数为零时,得到的(小的数)被除数就是最大公约数
方法一:

/*例程1.7*/
#include <stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	printf("请输入第一个整数:");
	scanf("%d",&m);//24
	printf("请输入第二个整数:");
	scanf("%d",&n);//12
	int temp = 0;
	while (temp = m%n)//判断余数真假,真执行
	{
		m = n;
		n = temp;
	}
	printf("最大公约数为:%d\n",n);//取出余数为零时,被余数n,即最大公约数
	//扩展:最小公倍数---m*n/最大公约数
	return 0;
}

方法二:

/*例程1.7*/
#include <stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	printf("请输入两个整数:");
	scanf("%d %d",&m,&n);
	int max = 0;
	//假设最大公约数max就是m与n的较小值
	if (m < n)
	{
		max = m;
	}
	else
	{
		max = n;
	}
	while (1)
	{
		if (m%max == 0 && n%max == 0)//说明max满足同时整除m与n
		{
			printf("最大公约数为:%d\n",max);
			break;
		}
		max--;//从较小值减1,直到出现公因数
	}
	return 0;
}

1.8、打印1000年到2000年之间的闰年

说明:闰年:能被4整除,不能被100整除的是闰年;或者能被100和400同时整除的也是闰年

/*例程1.8*/
#include <stdio.h>
int main()
{
	int year = 0;
	int year1 = 0;
	int year2 = 0;
	int count = 0;
	
	for (year = 1000; year <= 2000; year++)
	{
		
		//能被4整除,不能被100整除的
		year1 = year % 4;//条件一:能被4整除
		year2 = year % 100;//条件二:不被100整除
		//方法一:
		//if ((year1 == 0) && (year2 != 0))
		//{
		//	printf("闰年:");
		//	printf("%d\n",year);
		//	count++;
		//}
		能被100和400同时整除的
		//if (year % 400 == 0)
		//{
		//	printf("闰年:");
		//	printf("%d\n", year);
		//	count++;
		//}
		//方法二:
		if ((year1 == 0) && (year2 != 0) || (year % 400 == 0))
		{
			printf("闰年:");
			printf("%d\n", year);
			count++;
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

1.9、打印100~200间的素数

说明:素数—质数:指的是“大于1的整数中,只能被1和这个数本身整除的数”,被称为素数

/*例程1.9*/
#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断素数:2->i-1之间的数去试除i,看能否整除
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if(i%j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
			{
				break;
			}
		}
		if (j == i)//当j = i时,说明,在2~(i-1)之间没有可以整除的数,所以是素数
		{
			printf("素数:");
			printf("%d\n",i);
			count++;
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

引用标志flag的思想优化代码:

/*例程1.9*/
#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断素数:2->i-1之间的数去试除i,看能否整除
		int j = 0;
		int flag = 1;//假设标志i为素数
		for (j = 2; j < i; j++)
		{
			if (i%j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
			{
				flag = 0;//不是素数
				break;
			}
		}
		if (flag == 1)//是素数
		{
			printf("素数:");
			printf("%d\n", i);
			count++;
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

引用sqrt()开平方函数和偶数的性质(i+=2)优化代码:
如:m = ab—>a和b中至少有一个数是 <= 开平方后的m
m=16–16=4
4=2*8
相当于直接减少一半的取模运算 ,从而提高效率

/*例程1.9*/
#include <stdio.h>
#include <math.h>//调用sqrt()需要调用的头文件
int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)//i+=2,筛选掉了偶数,因为偶数能被2整除,可直接不计算,提高了运算效率
	{
		//判断素数:2->i-1之间的数去试除i,看能否整除
		int j = 0;
		int flag = 1;//假设标志i为素数
		for (j = 2; j <= sqrt(i); j++)//sqrt(i)筛选掉不符合的数,提高运算速率
		{
			if (i % j == 0)//如果被,除了1和i本身以外的数j整除了,那么此时i不是素数
			{
				flag = 0;//不是素数
				break;
			}
		}
		if (flag == 1)//是素数
		{
			printf("素数:");
			printf("%d\n", i);
			count++;
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

2、综合题

2.1、综合题1

说明:写一个猜数字小游戏
规则
(1)自动产生一个(1~100)的随机数
(2)如果猜错,屏幕提示猜的数偏大或者偏小,然后继续猜,直到猜对数字
(3)游戏可一直进行,不用每次都点运行,除非自行退出

/*综合题例程1*/
#include <stdio.h>
#include <stdlib.h>//调用srand(),rand(),system()
#include <time.h>//调用time()需要声明的头文件

void menu()//游戏菜单
{
	printf("***************************************\n");
	printf("***************************************\n");
	printf("**************1.play game**************\n");
	printf("**************0.game over**************\n");
	printf("***************************************\n");
	printf("***************************************\n");
}
//实现随机数字和猜数字的功能
void game()
{
	//生成随机数
	//srand()函数,随机值起点
	//根据输出结果得到,一个随机的固定值,不满足随机值
	//所以提出时间戳概念,一个变化的值,作为srand参数,那么可实现功能
	//时间戳:可将实时时间转换为数值,单位秒s,即格式化时间戳
	//time(NULL);
	//srand((unsigned int)time(NULL));
	//位置放在main()里,因为每次玩游戏只需要生成一次随机值起点,不用开始游戏每次都生成
	int ret = rand()%100+1;//%100的余数是0~99,+1,范围为1~100
	//生成随机的函数rand(),查MSDN可知,返回整型,其取值范围0~32767
	//注意:使用rand()前,需要提前调用srand(参数),参数为unsigned int型,srand()是随机起始点
	//printf("%d\n",ret);
	//猜数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d",&guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜中啦!!\n");
			break;
		}
	 }
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//这里不需要time的返回值参数,所以给NULL
	//需要的是time的定义,即获取系统时间这个作为变量,使得srand()变化随机值的起点
	//(unsigned int)将time(NULL)强制类型转换为unsigned int型
	do
	{
		menu();
		printf("请选择(0/1):");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("game over 退出游戏\n");
			break;
		default:
			printf("输入无效,请重新选择!\n");
			break;
		}
	} while (input);//判断input是否为真,真1执行,假0不执行
	return 0;
}

2.2、综合题2

说明:写一个关机整蛊程序(温馨提示:请适度酌情使用)
规则
(1)只要运行,电脑将在规定时间内关机,当输入:我是猪,才解除关机
(2)基于windows–命令窗口
(3)shutdown(关机命令):shutdown -s -t 60
(4)-s关机设置,-t关机时间设置 60时间单位秒s
(5)shutdown(接触关机命令):shutdown -a
(6)结合操作系统,自启动服务器,无限套娃,请适度酌情使用

/*综合题例程2*/
#include <stdio.h>
#include <stdlib.h>//调用system()函数需申明的头文件
//system()函数---执行系统命令的函数
#include <string.h>//调用strcmp()需要声明的头文件

int main()
{
	char input[20] = {0};
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
	scanf("%s",input);
	if (strcmp(input,"我是猪") == 0)//注意:字符串的比较不能直接==比较,需用strcmp()函数
	{
		system("shutdown -a");
	}
	else
	{
		goto again;//应用goto语句,实现循环功能
	}
	return 0;
}

你可能感兴趣的:(C语言程序设计,c语言,笔记,算法,开发语言,c++)