练习任务

写一段代码,打印100-200之间的素数,素数也叫质数,是指大于1且只能被1或者自身整除的整数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	for(i = 100;i <= 200;i++)
	{
		//判断i是否为素数
		//1.试除法
		for(j=2; j<i;j++)
		{
			if(i%j==0)
			{
				break;
			}
		}
		if(j == i)
		{
			printf("%d ",i);
		}
	}
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

优化上述代码,思路是,非素数的特点是一定可以写出两个因数相乘的形式,并且较小的那个因数必然小于等于这个非素数开平方。由此,我们的判断范围就缩小了。(开平方函数sqrt())

#include<stdio.h>
#include<math.h>

//int main()
//{
//	//优化,一个数不是素数
//}

int main()
{
	int i = 0;
	int j = 0;
	for(i = 100;i <= 200;i++)
	{
		//判断i是否为素数
		//1.试除法
		for(j=2; j <=  sqrt(1.0*i);j++)
		{
			if(i%j==0)
			{
				break;
			}
		}
		if(j > sqrt(1.0*i))
		{
			printf("%d ",i);
		}
	}
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

使用sqrt()函数需要声明头文件math.h 。在实际书写的过程中遇到了关于sqrt有多个重载函数问题,解决方案在 关于sqrt有多个重载函数问题的解决方案-CSDN社区

我在上面使用的方法是使用sqrt(1.0*i)来增加开平方的精度,至于原因我的理解是开根号大多数都是开出的小数,与我们定义的整型相矛盾。(有本书《素数求解的n种办法》)


下一题,输出10个数中的最大值:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int arr[]= {-1,-2,-3,-4,-5,-6,-7,-8,-9,-10};
	int sz = sizeof(arr)/sizeof(arr[0]);
	int max = arr[0];
	int i = 0;
	for(i= 1;i < 10;i++)
	{
		if(arr[i] > max)
		{
			max = arr[i];
		}
	}
	printf("最大值为%d\n",max);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.


下一题,写出一个乘法口诀表:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//乘法口诀表
int main()
{
	int i = 0;
	int j = 0;
	int result = 0;
	for(i = 1; i<10;i++)
	{
		for(j = 1;j <= i;j++)
		{
			result = i*j;
			printf("%d*%d=%d	",i,j,result);
		}
		printf("\n");
	}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

运行结果有点好看:

8.3C语言学习日志_#include


下一个,猜数字游戏:1,由电脑来生成一个随机数 2,猜数字,猜大了或猜小了会提示 3,要求由基本的可视化菜单

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{
	int a = 0;
	int guess = 0;
	int flag = 1;
	while(flag)
	{
		printf("###################\n");
		printf("游戏开始!\n");
		printf("请猜猜我心中的数字是多少? ");
		a = rand()%100;
		while(1)
		{
			scanf("%d",&guess);
			if(guess>a)
			{
				printf("噗噗!猜的有点大哦,再猜:");
			}else if(guess<a)
			{
				printf("你猜小啦!再猜:");
			}else
			{
				printf("恭喜你!猜对啦!!\n");
				break;
			}
		}
		printf("再玩一局吧!\n");
		printf("(再玩一局请扣1,退出游戏请扣0):");
		scanf("%d",&flag);
	}
	printf("游戏结束!\n");
	printf("###################\n");
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

运行结果:

8.3C语言学习日志_#include_02

这里使用了库函数rand(),随机生成一个整数。需要声明stdlib.h,另外我们用rand()%100取余操作确保我们要猜的值不会大的太离谱,范围定在0-99,两层while循环嵌套实现我们的功能。


听了老师的课,优化了一下菜单,让他看起来更好看一些:

时间戳是什么呢:当前计算机的时间减去计算机的起始时间(1970.1.1.00:00:00),单位是0秒,它的特点是始终在变化,可以作为一个随机起点来使用。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("***********************************\n");
	printf("*****   1.play       0.exit  ******\n");
	printf("***********************************\n");
}

int main()
{
	int a = 0;
	int guess = 0;
	int flag = 1;
	do
	{
		printf("***********************************\n");
		printf("游戏开始!\n");
		printf("请猜猜我心中的数字是多少? ");
		srand((unsigned)time(NULL));
    	//使用srand函数给rand随机值设置起始种子,为了保住每次循环种子都不一样
    	//我们将时间戳作为变量给srand函数,这里需要引用头文件time.h
		a = rand()%100;
		while(1)
		{
			scanf("%d",&guess);
			if(guess>a)
			{
				printf("噗噗!猜的有点大哦,再猜:");
			}else if(guess<a)
			{
				printf("你猜小啦!再猜:");
			}else
			{
				printf("恭喜你!猜对啦!!\n");
				printf("再玩一局吧!!\n");
				break;
			}
		}
		menu();
		scanf("%d",&flag);
	}while(flag == 1);
	printf("游戏结束!\n");
	printf("***********************************\n");
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

优化后的运行结果:

8.3C语言学习日志_#define_03


goto语句

goto语句在理论上是没有必要的,不建议经常使用。goto可以指定位置跳转,并且是无条件的。但是在某些情况下goto语句还是有用的,最常见的用法就是终止程序在某些深层嵌套的结构的处理过程,例如一次跳出两层或三层循环。

使用goto语句实现一个关机程序,有点整蛊的感觉,只有输入我是猪才会取消关机:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//60 秒后关机关机 shutdown -s -t 60
//取消关机 shutdown -a
//system() 执行系统命令
int main()
{
	char stop[20]= {0} ; 
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,将取消关机\n");
	printf("请输入:");
	scanf("%s",stop);
	if(strcmp(stop,"我是猪")==0)
	{
		system("shutdown -a");
	}else
	{
		goto again;
	}
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.