C博客作业03--函数

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

0.展示PTA总分

1.0本章学习总结

1.1 函数定义、调用、声明

1.函数的定义

函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。比如scanf()、printf()等为库函数,由C语言系统提供定义,编程时直接调用即可;而某些需要用户自己定义,属于自定义函数。

函数定义的一般形式为:

函数类型 函数名(形式参数表)/*函数首部*/  //形参表不能写成 double x,y;函数首部后面不能加分号
{
函数实现过程  /*函数体*/  //用于计算、完成特定工作,并用return返回运算的结果
}

2.函数的调用

函数调用的一般形式为:

函数名(实际参数表)

函数的形参必须是变量,用于接收实参传递过来的值;而实参可以是常量、变量或表达式,其作用是把常量、变量、或表达式的值传递给形参。
参数的传递是单向的,只允许实参把值复制给形参,形参的值即使在函数中改变了,也不会反过来影响实参。

3.函数原型声明

如果自定义函数放在主调函数后面,需要在函数调用前加上函数原型声明。

函数声明的一般格式为:

函数类型 函数名(参数表);//函数声明是一条C语句,要加分号

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

1.全局变量

定义在函数外面而不属于任何函数的变量称为全局变量。作用范围是从函数定义到程序所在文件的结束,他对作用范围内所有的函数都起作用。
一般吧全局变量定义在程序的最前面且可以和局部变量同名

2.局部变量

定义在函数内部的变量称为局部变量

3.静态局部变量

静态变量定义格式:

            static 类型名 变量表

静态变量赋初值只在函数第一次调用时起作用,若没有赋初值,系统将自动赋0,静态变量只能用于所定义函数,而不能用于其他函数。

1.3 C数据类型及注意点

  • 基本数据类型:

  • 强转类型转换:
    使用强制类型转换运算符可以将一个表达式转换成给定的类型,一般形式是:

    (类型名)  表达式;

强制转换是运算符不是函数,(int)x不能写成int(x)

1.4 C运算符

  • 算数运算符
    用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
  • 关系运算符
    用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
  • 逻辑运算符
    用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
  • 位操作运算符
    参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
  • 赋值运算符
    用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
  • 指针运算符
    用于取内容(*)和取地址(&)二种运算。
  • 求字节数运算符
    用于计算数据类型所占的字节数(sizeof)。
  • 特殊运算符
    有括号(),下标[],成员(→,.)等几种。
  • 双目运算符

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

2.1.模块流程图

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

void OperateMenu();//游戏操作界面 
void GradeOneMenu();//一年级
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
int GetValue(int grade);//生成随机操作数函数
char GetSign(int grade);//生成随机运算符函数

2.2.1.全局变量

2.2.2 菜单相关函数

  #include<stdio.h>
  #include<windows.h>
  #include<stdlib.h>
  #include<time.h>

void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
int GetValue(int grade);
int GetSign(int grade);
int main(void)
{
	OperateMenu();//游戏操作界面	
	return 0;
}
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':
			break;
		case '3':
			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 出题相关函数

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

		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;//退回主菜单
		}
		else//选择答题
		{
			/*答题模块*/
			printf("输入你想做的题数:");
			int cnt;//要做的题目数量
			int i;
			double rightPercentage;//正确率
			int value1, value2;
			char sign;
			int answer, realAnswer;
			int rightcnt = 0;
			int temp;

			scanf("%d", &cnt);
			for (i = 1; i <= cnt; i++)//连续输出算式
			{
				value1 = GetValue(1);//1.生成操作数函数
				value2 = GetValue(1);
				sign = GetSign(1);//2.生成随机运算符函数

				if (value1 < value2)
				{
                                   temp = value1;value1 = value2;value2 = temp;
				}
				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
				scanf("%d", &answer);
				switch (sign)
				{
				case '+': realAnswer = value1 + value2;//计算正确答案
				case '-': realAnswer = value2 - value2;
				}
				if (realAnswer == answer)//判断用户的计算结果
				{
					rightcnt++;//正确题目数量
					printf("算对了!");
				}
				else
				{
					printf("算错了-_- 答案是:%d", realAnswer);//用户算错时输出正确答案
				}
                                     
		                	printf("\n");
				        Sleep(2000);
			}
           
                  rightPercentage=rightcnt*1.0/count;
                  Printf("你的正确率是:%.0lf",rightPercentage);
                  Sleep(1000);
			}
			
		}
	}

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

		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;//退回主菜单
		}
		else//选择答题
		{
			/*答题模块*/
			printf("输入你想做的题数:");
			int cnt;//要做的题目数量
			int i;
			double rightPercentage;//正确率
			int value1, value2;
			char sign;
			int answer, realAnswer;
			int rightcnt = 0;
			int temp;

			scanf("%d", &cnt);
			for (i = 1; i <= cnt; i++)//连续输出算式
			{
				
				sign = GetSign(1);//2.生成随机运算符函数
                                if (sign == '*')
				{
					value1 = GetValue(1);
					value= GetValue(1);
				}
				else if (sign == '/')
				{
					value2 = GetValue(1);
					value1 = GetValue(1) * value2;
				}
				else
				{
				       value1 = GetValue(2);
					value2 = GetValue(2);
				}
				if (value1 < value2)
				{
					temp = value1;value1 = value2;value2 = temp;
				}
				
				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
				scanf("%d", &answer);
				switch (sign)
				{
				case '+': realAnswer = value1 + value2; break;
				case '-': realAnswer = value2 - value2; break;
				case '*': realAnswer = value1 * value2; break;
				case '/': realAnswer = value1 / value2; break;
				}
				if (realAnswer == answer)
				{
					rightcnt++;
					printf("算对了!");
				}
				else
				{
					printf("算错了-_- 答案是:%d", realAnswer);
				}
			
		                	printf("\n");
				        Sleep(2000);
			}
                  rightPercentage=rightcnt*1.0/count;
                  Printf("你的正确率是:%.0lf",rightPercentage);
                  Sleep(1000);
		}
	}

}

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

		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')
		{
			Sleep(500);
			OperateMenu();
			return;//退回主菜单
		}
		else//选择答题
		{
			/*答题模块*/
			printf("输入你想做的题数:");
			int cnt;//要做的题目数量
			int i;
			double rightPercentage;//正确率
			int value1, value2;
			char sign;
			int answer, realAnswer;
			int rightcnt = 0;
			int temp;

			scanf("%d", &cnt);
			for (i = 1; i <= cnt; i++)//连续输出算式
			{
				value1 = GetValue(3);//1.生成操作数函数
				value2 = GetValue(3);
				sign = GetSign(2);//2.生成随机运算符函数
                                if (sign == '/')
				{
					Value2 = Getvalue(3);
					Value1 = Getvalue(2) * Value2;
				}
				else
				{
					Value1 = Getvalue(2);
					Value2 = Getvalue(2);
				}
				if (value1 < value2)
				{ 
                                    temp = value1;value1 = value2;value2 = temp;
				}
				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
				scanf("%d", &answer);
				switch (sign)
				{
				case '+': realAnswer = value1 + value2; break;
				case '-': realAnswer = value2 - value2; break;
				case '*': realAnswer = value1 * value2; break;
				case '/': realAnswer = value1 / value2; break;
				}
				if (realAnswer == answer)
				{
					rightcnt++;
					printf("算对了!");
				}
				else
				{
					printf("算错了-_- 答案是:%d", realAnswer);
				}
			                 printf("\n");
				         Sleep(2000);
			}
                  rightPercentage=rightcnt*1.0/count;
                  Printf("你的正确率是:%.0lf",rightPercentage);
                  Sleep(1000);
			
		}
	}

}

1.先对用户询问是否想继续答题,若不想退到主菜单
2.让用户输入题目数量然后连续输出算式,因为涉及到减法且一二年级没有学习负数的运算,三年级没有学习小数运算,
所以当第一个数<第二个数时将二者交换位置以实现在正数范围内的运算
3.让计算机算出正确答案与用户的答案进行比较,记录答题情况,算错时输出正确答案
4.题目全部答完后计算正确率


int GetValue(int grade)//1.生成操作数函数
{
	int value;

	value = 1 + rand() % 9;//10以内
	value = 1 + rand() % 99;//两位数以内
	value = 1 + rand() % 999;//三位数以内

	return value;
}


char GetSign(int grade)//2.生成随机运算符函数
{
	char sign;
	int value = 0;

	switch (grade)
	{
	case 1:value = rand() % 2; break;//一二年级只做加减运算
	case 2:value = rand() % 4; break;//三年级四种运算都可以做
	}
	switch (value)
	{
	case 0:sign = '+'; break;
	case 1:sign = '-'; break;
	case 2:sign = '*'; break;
	case 3:sign = '/'; break;
	}
	return sign;
}

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

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

使用随机种子以实现随机数和随机运算符的生成
用开关语句可以控制四种运算符使代码看起来简洁明了,可读性高

posted @ 2020-11-29 23:52  SmileCHT  阅读(44)  评论(1编辑  收藏  举报