C语言博客作业03--函数

这个作业属于哪个班级 C语言--网络2011/2012
这个作业的地址 C博客作业03--函数
这个作业的目标 学习如何设计函数、C语言基本数据类型
姓名 邓宏

0.展示PTA总分(0----2)

1.本章学习总结(4分)

函数作用:简化代码书写,增加代码可读性
语法:

void gcd( int x, int y );//函数声明
int main()
{...}
void gcd( int x, int y )//函数定义,注意函数中的变量与主函数无关,需从新定义
{
//该函数无返回值,不用return
}
int gcd( int x, int y );//函数声明
int main()
{...}
void gcd( int x, int y )//函数定义,注意函数中的变量与主函数无关,需从新定义
{
return ?;
}

1.1 函数定义、调用、声明

void gcd( int x, int y );
int gcd( int x, int y );//注意函数中的变量与主函数无关,需重新定义

1.2 全局变量、静态局部变量

全局变量:加在各函数外,各函数该变量默认值被定义
静态局部变量:在函数中被定义,只用于函数

1.3 C数据类型及注意点

每个数据类型特点及其相关知识的扩展。如浮点误差、字符型数据输入问题等等
返回值为整形用int
返回值为双精度用double
无返回值用void

1.4 C运算符

函数调用:你定义的函数()
学习体会:
很实用,可以简便代码,使代码条例更清楚

2.综合作业(6分):小学生口算表达式自动生成系统

2.1.模块流程图

请梳理各模块流程图,在编程前先画流程图再写代码。代码中有修改,流程图也跟着修改。二级模块,可以再画流程图展示。

一年级模块流程图

二年级模块流程图

三年级 模块流程图

2.2.函数功能及全局变量介绍

介绍你用到核心函数接口及全局变量。

void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
int Getvalue(int grade);//生成随机数
int Getsymbol(int grade);//生成随机符号

全局变量:无

2.2.1.全局变量

没用到,作用:定义一个所有函数都可以用的默认变量

2.2.2 菜单相关函数

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
void OperateMenu()//游戏操作界面
{
	char option;
	int i;
	int temp;
	system("cls");//清屏

	do
	{
		system("cls");
		printf("******************************************\n");
		printf("1.一年级口算\n");
		printf("2.二年级口算\n");
		printf("3.三年级口算\n");
		printf("4.退出系统\n");
		printf("******************************************\n");
		printf("请输入您的选择:");
		scanf(" %c", &option);
		switch (option)
		{
		case '1':
			system("cls");
			GradeOneMenu();
			//GradeOneMenu();
			break;
		case '2':
			system("cls");
			GradeTwoMenu();
			break;
		case '3':
			system("cls");
			GradeThreeMenu();
			break;
		case '4':
			printf("\n谢谢您的参与!\n");
			Sleep(500);
			exit(0);
		default:
			printf("您输入不对,只能输入1,2,3,4,请重输!\n");
			Sleep(500);
		}
	} while (!(option >= '1' && option <= '4'));
}

2.2.2 出题相关函数

随机数函数:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
int Getvalue(int grade)//生成随机数
{
	int value;
	switch (grade)
	{
	case 1:value = 1 + rand() % 9;break;
	case 2:value = 1 + rand() % 100;break;
	case 3:value = 11 + rand() % 90;break;
	}
	return value;
}

随机符号函数:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
int Getsymbol(int grade)//生成随机符号
{
	char symbol;
	int value=0;
	switch (grade)
	{
	case 1:value = rand() % 2;break;
	case 2:value = rand() % 4;break;
	}
	switch (value)
	{
	case 0:symbol = '+';break;
	case 1:symbol = '-';break;
	case 2:symbol = '*';break;
	case 3:symbol = '/';break;
	}
	return symbol;
}

注:
1.随机数相减时为若结果负号,两数字互换
2.相除时可用num2=num1*随机数,保证除数结果为整数
3.用right/count算正确lv
一年级:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
void GradeOneMenu()//一年级
{

	while (1)
	{
		system("cls");
		printf("*********************一年级小朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/

		printf("是否继续答题/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;
		}
		if(ch=='y')//选择答题
		{
			/*答题模块*/
			int i, count=0,right=0;
			printf("请输入你要写的题数:");
			scanf("%d", &count);
			for (i = 1;i <= count;i++)
			{
				char choose;
				printf("如果你想退出打出a,若想继续请打回车\n");
				scanf("%c", &choose);
				choose=getchar();
				if (choose == 'a')break;
				int num1, num2, answer, rightkey = 0;
				char symbol;
				srand((unsigned)time(NULL));
				num1 = Getvalue(1);
				num2 = Getvalue(1);
				symbol = Getsymbol(1);
				if (num1 < num2)
				{
					int temp;
					temp = num1;
					num1 = num2;
					num2 = temp;
				}
				printf("%d%c%d=", num1, symbol, num2);
				scanf("%d", &answer);
				switch (symbol)
				{
				case '+':rightkey = num1 + num2;break;
				case '-':rightkey = num1 - num2;break;
				}
				if (answer == rightkey)
				{
					right++;
					printf("Good job!\n");
				}
				else
				{
					printf("Error!");
					printf("正确答案:%d\n", rightkey);
				}
				Sleep(1000);
				system("cls");
			}
			double accuracy=0;
			if (i >= 2)
			{
				accuracy = right * 1.0 / count;
				printf("正确率:%.2f\n", accuracy);
				if (accuracy >= 0.9999)printf("现在各位观众给我全体起立!");
				else if (accuracy >= 0.8)printf("很牛逼!");
				else if (accuracy >= 0.6 && accuracy <= 0.8)printf("分不在高,及格就行。");
				else if (accuracy <= 0.6 && accuracy >= 0.0001) printf("不行啊,多捞啊!");
				else printf("年轻人耗子尾汁。");
				Sleep(2000);
			}
		}
	}

}

二年级:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
void GradeTwoMenu()//二年级
{

	while (1)
	{
		system("cls");
		printf("*********************二年级小朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/

		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;
		}
		if (ch == 'y')//选择答题
		{
			/*答题模块*/
			int i, count = 0, right = 0;
			printf("请输入你要写的题数:");
			scanf("%d", &count);
			for (i = 1;i <= count;i++)
			{
				char choose;
				printf("如果你想退出打出a,若想继续请打回车\n");
				scanf("%c", &choose);
				choose = getchar();
				if (choose == 'a')break;
				int num1, num2, answer, rightkey = 0;
				char symbol;
				srand((unsigned)time(NULL));
				symbol = Getsymbol(2);
				if (symbol == '*')
				{
					num1 = Getvalue(1);
					num2= Getvalue(1);
				}
				else if (symbol == '/')
				{
					num2 = Getvalue(1);
					num1 = Getvalue(1) * num2;
				}
				else
				{
					num1 = Getvalue(2);
					num2 = Getvalue(2);
				}
				if (num1 < num2)
				{
					int temp;
					temp = num1;
					num1 = num2;
					num2 = temp;
				}
				printf("%d%c%d=", num1, symbol, num2);
				scanf("%d", &answer);
				switch (symbol)
				{
				case '+':rightkey = num1 + num2;break;
				case '-':rightkey = num1 - num2;break;
				case'*':rightkey = num1 * num2;break;
				case'/':rightkey = num1 / num2;break;
				}
				if (answer == rightkey)
				{
					right++;
					printf("Good job!\n");
				}
				else
				{
					printf("Error!");
					printf("正确答案:%d\n", rightkey);
				}
				Sleep(1000);
				system("cls");
			}
			double accuracy = 0;
			if (i >= 2)
			{
				accuracy = right * 1.0 / count;
				printf("正确率:%.2f\n", accuracy);
				if (accuracy >= 0.9999)printf("现在各位观众给我全体起立!");
				else if (accuracy >= 0.8)printf("很牛逼!");
				else if (accuracy >= 0.6 && accuracy <= 0.8)printf("分不在高,及格就行。");
				else if (accuracy <= 0.6 && accuracy >= 0.0001) printf("不行啊,多捞啊!");
				else printf("年轻人耗子尾汁。");
			}
		}
	}

}

三年级:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include"expression"
void GradeThreeMenu()//二年级
{

	while (1)
	{
		system("cls");
		printf("*********************三年级小朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/

		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;
		}
		if (ch == 'y')//选择答题
		{
			/*答题模块*/
			int i, count = 0, right = 0;
			printf("请输入你要写的题数:");
			scanf("%d", &count);
			for (i = 1;i <= count;i++)
			{
				char choose;
				printf("如果你想退出打出a,若想继续请打回车\n");
				scanf("%c", &choose);
				choose = getchar();
				if (choose == 'a')break;
				int num1, num2, answer, rightkey = 0;
				char symbol;
				srand((unsigned)time(NULL));
				symbol = Getsymbol(2);
				if (symbol == '/')
				{
					num2 = Getvalue(3);
					num1 = Getvalue(2) * num2;
				}
				else
				{
					num1 = Getvalue(2);
					num2 = Getvalue(2);
				}
				if (num1 < num2)
				{
					int temp;
					temp = num1;
					num1 = num2;
					num2 = temp;
				}
				printf("%d%c%d=", num1, symbol, num2);
				scanf("%d", &answer);
				switch (symbol)
				{
				case '+':rightkey = num1 + num2;break;
				case '-':rightkey = num1 - num2;break;
				case'*':rightkey = num1 * num2;break;
				case'/':rightkey = num1 / num2;break;
				}
				if (answer == rightkey)
				{
					right++;
					printf("Good job!\n");
				}
				else
				{
					printf("Error!");
					printf("正确答案:%d\n", rightkey);
				}
				Sleep(1000);
				system("cls");
			}
			double accuracy = 0;
			if (i >= 2)
			{
				accuracy = right * 1.0 / count;
				printf("正确率:%.2f\n", accuracy);
				if (accuracy >= 0.9999)printf("现在各位观众给我全体起立!");
				else if (accuracy >= 0.8)printf("很牛逼!");
				else if (accuracy >= 0.6 && accuracy <= 0.8)printf("分不在高,及格就行。");
				else if (accuracy <= 0.6 && accuracy >= 0.0001) printf("不行啊,多捞啊!");
				else printf("年轻人耗子尾汁。");
				Sleep(2000);
			}
		}
	}

}

2.3.运行结果截图,测试用例。

登录界面:

登录界面2:

书写题数:

判断是否继续后给出题目:

答对:

答错:

答题结果1:

答题结果2:

2.4.大作业中编程技巧总结

1.srand函数:可通过修改种子将rand生成随机数变为真随机数
2.编菜单互动

posted @ 2020-11-28 23:35  年少不知头发贵  阅读(198)  评论(1编辑  收藏  举报