C博客作业03--函数

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

截图展示本次题目集排名分数截图。PTA题目集至少完成2/3,否则倒扣-2分

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

整理这两周学习主要知识点,并能对每个知识点介绍简单案例或语法。不要截图ppt,自己文字书写。知识点包含:

1.1 函数定义、调用、声明

1.1.1函数定义与声明

  • 函数定义就是指函数的具体实现过程,交代清函数的功能。

  • 声明一般位于头文件中,告知编译器这儿有个叫xxx的函数,声明有这么一个函数的存在,但并不实现。

  • 定义是指对函数功能的确立,包括指定函数名,函数值类型,形参类型和函数体等,它是一个完整独立的函数单位。而声明的作用是把函数的各种信息告知编译系统,以便在调用该函数时按照此进行检查。(例如函数名是否正确,实参与形参的类型和个数是否一致)

  • 在函数调用前若未作声明,则编译器会将函数类型默认为int型。

  • 如果被调用函数的定义出现在主函数前,可以不必加以声明,因为此时编译器已经预先知道了函数的信息,可以说函数定义本身也是一种声明。

1.1.2函数调用

举个栗子:

#include <stdio.h>

void swap(int x,int y)
{
    int temp;
    temp=x;
    x=y;
    y=temp;
    printf("x=%d,y=%d\n",x,y);
}

void main()
{
    int a=6;
    int b=8;
    swap(a,b);
    printf("a=%d,b=%d\n",a,b);
}
  • 运行结果为x=8,y=6,a=6,b=8。实参a和b并没有实现数值交换,体现了函数在调用时的单向传递性。

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

  • 全局变量:全局变量是定义在函数外的变量,作用域为整个程序,如果在一个函数中改变了全局变量的值,将会影响到所有函数。

  • 局部变量:只在定义它的函数内有效,离开了函数体就会无效。

  • 静态局部变量:只在定义它的函数内有效。不同于一般的局部变量的是,它在每次调用后会保留上一次调用后的值,以这个值来参与下一次函数的调用。

1.3 C数据类型及注意点

每个数据类型特点及其相关知识的扩展。如浮点误差、字符型数据输入问题等等

基本数据类型

  1. char:字符型;
  2. short:短整型;
  3. int:整型;
  4. long:长整型;
  5. float:单精度浮点型;
  6. double:双精度浮点型

浮点误差的解决方案

因为二进制数值可以准确表示整数,所以可以将小数乘以10或100等变成整数,然后做整数运算,最后再除回10或100等变成小数以获得精确结果。

字符型数据的输入

  1. scanf输入:
    scanf(“%c”,&a);可以用来输入一个字符,放在循环体中用于输入多个字符,也可用scanf(“%c”,&a);输入字符数组。
  2. getchar()输入:
    用while((a=getchar)!=\n)语句实现多个字符的输入。

1.4 C运算符

  • 算数运算符:
    +(加),—(减),*(乘),/(除),%(取余),++(自加),--(自减)
  • 关系运算符:
    ==(恒等于),!=(不等于),>=(大于等于),<=(小于等于)
  • 逻辑运算符:
    &&(与),||(或),!(非)
  • 赋值运算符:
    =(把右边操作数赋值为左边操作数)
    +=(加且赋值)
    -=(减且赋值)
    <<=(左移且赋值)

=(右移且赋值)
&=(按位与且赋值)
^=(按位异或且赋值)
|=(按位或且赋值)

  • 位运算符:
    <<(二进制左移运算符)

(二进制右移运算符)
2.综合作业(6分):小学生口算表达式自动生成系统
口算题参考网站

一、基本功能要求:
1.至少完成一个年级的口算题自动出题系统,尽量完成3个年级的出题设计。
2.注意每个年级运算数要求,运算数和运算符要随机生成
3.用户每选择一个难度级别后必须输入题目数量,能统计用户的正确率。用户每算一题,若错误,给出正确答案。 用户中途退出,不继续做题,需要有个提示操作可中途退出。

二、注意

  1. 请先画流程图理清数据处理流程,再进入代码编写。理清系统需要设计的模块。
    2.流程图中,对应一个模块内容,务必设计函数封装,不要把代码都放main或某一个函数中。独立功能代码块、重复功能代码块、各种异常情况要单独封装函数处理,让程序的扩展性更强。
  2. 软件界面必须友好,多加文字提示,能让用户自己当前做什么,接下来怎么做,每步操作可以退到主菜单界面。
    4.注意异常数据处理,如除0错误、不合法数据、临界数据,系统保证运行时候不崩溃。

三、进阶功能:
1.每个年级设计二级菜单,选择不同题型出题。不想做题可以返回主菜单。
2.混合运算比如2+3*4运算,注意考虑运算符优先级问题
3.可以设置答题时间,用户超过答题时间,提示不能继续做题,重新选抽题。请查阅C的时间函数。
以下为博客作业需要完成内容:

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

一年级模块流程图
二年级模块流程图
三年级 模块流程图
2.2.函数功能及全局变量介绍
介绍你用到核心函数接口及全局变量。

2.2.1.全局变量
变量名,作用。
未用到全局变量
2.2.2 菜单相关函数
文字介绍函数功能、思路,截图函数代码。

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 '4':

			printf("\n拜拜了您嘞!\n");

			Sleep(500);

			exit(0);

		default:

			printf("别瞎搞,只能输入1,2,3,4,请重输!\n");

			Sleep(500);

		}

	}

2.2.2 出题相关函数
文字介绍函数功能、思路,截图函数代码。
等等

void GradeOneMenu()//一年级

{



	while (1)

	{

		system("cls");

		printf("*********************一年级小朋友好!********************************\n");

		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");

		printf("**如果您不想做,输入n退回主菜单。\n");

		printf("***************************************************************\n");

		char ch;

		scanf("\n%c", &ch);

		if (ch == 'n')

		{

			Sleep(500);

			OperateMenu();

			return;

		}

		if (ch == 'y')//选择答题

		printf("本次题目数为十道\n");
		
			{
				int num1 = 0;//操作数1
				int num2 = 0;//操作数2
				char operation;//随机符号
				int rightAnswer;//正确答案
				int userAnswer;//用户输入的答案
				int t;//临时变量
				int test;//选择做哪种测试
				int right=0;//正确题提数
						 /*答题模块*/
				for (int i = 1; i <= 10; i++)
				{
				printf("1、 加法\n");

				printf("2、 减法\n");

				printf("3、 加减法\n");
			
				scanf("%d", &test);
				/*1.生成操作数函数*/

				num1 = Getvalue();
				num2 = Getvalue();

				/*2.生成随机运算符函数*/

				{
					int n;
					switch (test)
					{
					case 1:n = 1; break;
					case 2:n = 2; break;
					case 3:n = 1 + rand() % 2;; break;

					}
					switch (n)
					{
					case 1:operation = '+'; break;
					case 2:operation = '-'; break;

					}

				}

				/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
				if (operation == '-' && num1 < num2)
				{
					t = num1;
					num1 = num2;
					num2 = t;
				}

				/*4.生成表达式函数,并输出展示*/
				printf("%d%c%d=", num1, operation, num2);
				scanf("%d", &userAnswer);
				switch (operation)//程序计算正确结果
				{
				case '+':
					rightAnswer = num1 + num2;
					break;
				case '-':
					rightAnswer = num1 - num2;
					break;
				}
				//评判答案对错
				if (rightAnswer == userAnswer)
				{
					right++;
					printf("做对这么easy的题不值得夸赞");
				}
				if (rightAnswer != userAnswer)
				{
					printf("不会吧不会吧,不会真有人连一年级的题都做不出来吧!\n");
					printf("正确答案是%d!\n", rightAnswer);
				}
				Sleep(666);
				system("cls");
			}
				double accuracy = (double)right * 0.1;
				printf("你的正确率是%.1f\n", accuracy);

		}
		



		printf("是否继续答题y/n:");

		

	}
int Getvalue();//生成操作数函数

int Getvalue()
{
	int num;
	num = rand() % 51;
	return num;
}

2.3.运行结果截图,测试用例。
截图时候务必在图片中有文字说明该测试数据是什么,不能只有图片。测试数据有错也务必在图片上说明原因。
建议用动图 展示




2.4.大作业中编程技巧总结
总结大作业编程中用到哪些课堂没有学过知识点

  1. 将一个大问题分成几个模块去分别设计,可以使问题简化很多。
  2. 利用好随机数函数,生成随机操作数和随机操作符。
  3. 当两数相减为负数时,引入临时变量t交换两数位置,使输出正数。
    代码提交
    请博客作业页面内容+口算系统的全部代码复制到一个word文档中。(记住,要复制过去,不能截图),文档保存好请提交课堂派的作业中。我们会用课堂派对你写的代码进行查重,请务必要独立完成。
posted @ 2020-11-30 22:32  letmee  阅读(158)  评论(1编辑  收藏  举报