我的第一个c语言小程序

标题:判断题答题小程序

Author: plc6666
软工专业 工科男
格言:总有人间一两风,填我十万八千梦。

一.程序的由来

本学期学完C语言后,刘老师为了锻炼学生的写代码能力和语言组织能力。特出此题来考察学生。

二.程序的状况

1.程序实现了颜色转换的功能

答对题目用绿色,答错用红色,输入用黄色,不同颜色搭配,使得程序看起来更加的清爽。
下面是代码展示:

void color(const unsigned short textColor)
{
	if(textColor>=0 && textColor<=15)
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textColor);
	else
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

下面是效果图:
在这里插入图片描述

2.程序能随机抽20题,不重复

这点比较难得地方在于出了题目后不应该让其再次被抽中,要避免重复的概率,我想了很久在这点上面,最后再一次偶然的机会下,灵感来了,眼前一亮,我想了出来。
下面是我的代码展示:

struct ti{
	char timu[1000];
	char daan[8];
};
struct ti f[25];
for(i=20;i>=1;i--)
{	
	//求随机数。
	//srand(time(0));与下面效果相同
	srand((unsigned int )time (NULL));
	j=1+rand()%(i);
	......//中间省略了一些代码
	......
	strcpy(f[j].timu,f[i].timu);
	strcpy(f[j].daan,f[i].daan);
	
}

下面是这部分代码的讲解:
这代码的作用就是将随机抽取的题目用完后,将原本放在最后面的题目和答案,占据此题目的下标,除去代码最后几题可能一直重复抽题,题目显示时间过长的问题,从而使得代码运行更加的快。

3.程序能根据你的分数,给出相应的评语

下面是代码展示

void dengji(double s)
{
	color(5);
	if(s>=90){
		printf("很棒哟,请继续保持^_^。");
	}else if(s>=70){
		printf("不错哟,还要继续加油哦^_^。");
	}else if(s>=60){
		printf("才刚及格,还要努力呀。");
	}else{
		printf("还没及格呢>_<,但不要放弃噢,下次一定能行。");
	}
}

下面是效果图
在这里插入图片描述

4.程序有些人性化^ _ ^

(1)输入小写的字母和大写的字母,效果相同,如t和T,二者等价。
(2)当用户不小心输入的字母不为 t or T or f or F,系统会给出提示,并再次给出机会,让其重新输入。(若还是不知悔改,系统会生气哦)
(3)可以在前面输入空格和回车,也可以输入多个单词,但会以第一个单词为答案。
下面是部分代码展示:

		e = 0;
		while(strcmp(tijiao,"f")!=0&&strcmp(tijiao,"F")!=0&&strcmp(tijiao,"t")!=0&&strcmp(tijiao,"T")!=0)
		{
			e ++;
			color(4);
			if(e<=1)printf("提示:请输入t or T or f or F !!!\n");
			else{
				printf("是不是有毛病!请看提示!!!\n");
			}
			color(6);
			scanf("%s",tijiao);
			flag=0;
			while((imp = getchar())!='\n'){
				if(flag==0){
					color(14);
					printf("(按第一个不为空格的单词为你提交的答案)\n");
					flag=1;
				}
			}
		}

下面是效果图:

在这里插入图片描述

三.我遇到的困难及如何解决的

1.在写这个小程序时,我用的是结构体来存储数据,这样的好处是:
(1)方便增加其他题目,如果你想增加题目,只需把题目和答案存到结构体内即可,调用时也可以一起调用,可以更灵活的调用数据。
(2)有利于后续随机抽题的实现,细心的你应该已经发现,在二.2程序能随机抽20题,不重复中我使用的就是结构体。在我没用结构体的时的代码:

	int arr[22];
	memset(arr,511,sizeof(arr));//让arr数组每一个元素都为-1
		for(i=0;;i++)
		{
		//求随机数。
		//srand(time(0));
		srand((unsigned int )time (NULL));
		j=1+rand()%20;
		if(arr[j]!=-1){
			continue;
		}
		arr[j]=1;
	}

这会导致有可能在抽取最后一道题的时候,如果运气不好会一直循环下去,导致时间耗费的比较多,从而成为垃圾程序。

2.在存储你提交的答案时,由于我使用的是scanf(“%s”,tijiao),它遇到空格便停止输入了,但如果你输入了很多单词,它只会读取第一个,其他的留在缓存区里面。
下面是效果图:
在这里插入图片描述
为了解决这个坑,我绞尽脑汁的想,不断在网上查资料,功夫不负有心人。最终想到了用下面这段代码来解决。

	int imp = 0,flag=0;
		while((imp = getchar())!='\n')
		{
		}

这段代码可以帮助我们清除缓存区的数据。下面是效果图:
在这里插入图片描述
以上两点就是我写这个程序遇到的最大的问题,但也是在自己的努力下解决了,所以大家在面临问题的时候也不要放弃呀,相信自己一定能行的,加油(ง •_•)ง!!!

四.写完程序后的心得与体会

刚开始,听到刘老师布置这个任务的时候(特别是说可以输入其他字母的时候),我心想这不是判断题吗,为啥还要输入其他的字母,我当时非常的震惊。后面在深入的去学习如何写这个程序的时候,我才发现刘老师的要求不是很难,后来我便去查资料更深入学习,去让程序变得更加的完美。在学习写这程序的过程中,我明白了自学的重要性,和在网上如何快速的查找自己需要的资料,这种能力培养的重要性。回顾此次的学习,感觉收获满满,使自己在一定的程度上明白了自己的优势和劣势。

五.未来的期待与展望

我希望这次写的程序将只是我迈向高级程序员的第一步,在将来我一定会创作出比这要好的程序。这是我人生新的一个起点,加油!!!!向前冲呀

先赞后看,养成习惯!!!^ _^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持的动力。记得关注我哦!

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值