C语言第十一次博客作业---函数嵌套调用

一、实验作业

1.1 PTA题目

题目:递归实现顺序输出整数

1. 本题PTA提交列表

2. 设计思路

printdigits函数
定义整型变量result存放结果
if n是10的倍数
    result=n
else
    取n的个位数赋值给result
    递归调用printdigits(n/10)
输出result

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

①递归出口错误。零的情况考虑错误。

②修改递归出口后正确。

1.2 学生成绩管理系统

1.2.1 画函数模块图,简要介绍函数功能

1.2.2 截图展示你的工程文件

1.2.3 函数代码部分截图

本系统代码总行数:XXXX

要求截图你的头文件、插入学生信息及学生成绩信息代码、删除学生成绩信息代码、总分排序代码。

代码中务必加入必要的注释。

1.2.4 调试结果展示

要求分别展示菜单、每个命令运行结果,对非法数据必须有检验并提示,如用户学号输入非法、或者输入重复学号,提示插入失败。查询不到相应学生信息给予提示等等。

测试样例越多,分值越高

1.2.5 调试碰到问题及解决办法。

二、截图本周题目集的PTA最后排名。

PTA排名

PTA提交列表

三、阅读代码

题目:整数拆分

给定一个整数n,输出这个整数拆分的可能总数

例如:n==6有

6

5+1

4+2    4+1+1

3+3    3+2+1     3+1+1+1

2+2+2     2+2+1+1        2+1+1+1+1

1+1+1+1+1+1

共11种分解方法,所以输出应该为11。

#include <stdio.h>
int q(int n,int m) //n为要拆分的数字,m为所拆部分中最大值
{
    if(n == 1|| m == 1)
        return 1; 

    else if(n < m)
        return q(n,n);

    else if(n == m)
        return 1 + q(n,n - 1);

    else if(n > m)
        return q(n,m-1)+q(n - m,m);
}
 int main ()
 {
     printf("请输入要拆分的数字\n");
     int n;
     scanf("%d",&n);
     int ret = 0;
     ret = q(n,n);
     printf("该数字一共有的拆分方法数\n");
     printf("%d",ret);
     return 0;
 }

分析:

① 当n=1时,只有一种划分{1};

②当m=1时,只有一种划分{1,1,....1,1,1};

③当n=m时,根据划分中是否包含n,可以分为两种情况: (1)划分中包含n的情况,只有一个{n};  (2)划分中不包含n的情况,使用不大于n-1的整数进行拆分;所以此时 q(n,n) = 1 + q(n, n - 1)。

④当n<m时,使用比n大的数进行拆分没有意义,所以此时相当于q(n,n)

⑤当n>m时,这时候有两种情况:

(1)使用m对n进行拆分,拆分出来的情况最大的数是m,剩下的所有数加起来为n-m,问题变成使用不大于m的整数对n-m进行拆分,所以此时为q(n-m,m)

(2)使用小于m的数对n进行拆分,使用小于m的数对n进行拆分,表示为q(n,m-1)

所以此时q(n,m) = q(n - m,m) + q(n, m - 1)。

综上,①②属于回归条件,③④属于特殊情况,⑤为通用情况,属于递归的方法,其本质主要是通过减少n或m以达到回归条件,从而解决问题。

递归表达式:

四、本周学习总结

1.介绍本周学习内容

1.1.宏(宏替换)

  • 宏定义的格式:#define 宏名标识符 宏定义字符串

    注:

    1.不是真正的C语句,行尾不用加分号

    2.常采用大写字母串作宏名,宏名与宏定义字符串间用空格分隔,所以宏名中间不能用空格

    3.宏定义字符串是任意字符串,中间可以有空格,以回车符做结束

    4.如果宏定义字符串后面跟分号,编译预处理时把分号也作为宏替换内容

    5.宏定义可以嵌套使用

    #define PI 3.1415926
    #define S PI*r*r
  • 宏的用途

    1.符号常量,如PI、数组大小的定义

    2.简单的函数功能实现

    3.当程序中需要多次书写一些相同内容时,不妨把它写成宏

    例:

    #define LONG_STRING "it represent a long string that   is used as an example."

    使用方式:printf(LONG_STRING )

    注:

    1.#define最后面跟的“”表示该行未结束,与下一行合起来成为完整一行

    2.LONG_STRING 代表带引号的字符串,因此printf()中不必再加引号

  • 带参数的宏定义

    #define  宏名(参数表)  宏定义字符串

    注:

    1.参数表中只有参数名称,没有类型说明

    2..宏名和小括号必须紧挨着;小括号不能省略

    3.如果替换文本中有括号,则进行宏替换时必须有括号;反之,如果替换文件中本身没有括号,则宏替换时不能随便加括号。

    4.宏替换不作计算。

    例:求y=(x+y)2

    错误:#define SQR(x) x*x 宏替换后 -> y=x+y*x+y≠(x+y)2

    正确:#define SQR(x) (x)*(x)宏替换后 -> y=(x+y)*(x+y)=(x+y)2

1.2.文件包含

  • 文件包含的格式:

    #include<需包含的文件名>#include"需包含的文件名"

    1.双引号,是指系统先在源程序所在的目录查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去找。

    2.尖括号,系统将直接按照系统指定的标准方式到有关目录中去寻找。

2.学习体会

  • 这周的内容学起来有点乱,特别是指针进阶这一部分内容,还需要总结学习。
  • 这周的作业学生成绩管理系统,代码量增多,也是新的作业方式,多文件工程,对我有难度。
  • 一学期快结束了,前面的一些知识点也要着手复习总结,接下来应该是更忙碌的一个月了。

原文地址:https://www.cnblogs.com/smtwula/p/8157971.html

时间: 2024-10-09 14:00:55

C语言第十一次博客作业---函数嵌套调用的相关文章

C语言博客作业--函数嵌套调用

一.实验作业(6分) 本周作业要求: 选一题PTA题目介绍. 学习工程文件应用,设计实现学生成绩管理系统. 学生成绩管理系统要求 设计一个菜单驱动的学生成绩管理程序,管理n个学生m门考试科目成绩,实现以下功能: 命令1:能够新增学生信息,并计算总分和平均分. 能够新增学生成绩信息. (学生按照学号排序,新增学生应该按照学号插入已有数组,并保持有序,插入排序实现) 命令2:根据输入学号和课程号修改学生成绩信息. 命令3:根据输入学号和课程删除学生成绩信息. 命令4:输出显示所有学生成绩信息.(按照

C语言第五次博客作业--函数

一.PTA实验作业 题目1:6-2 简单实现x的n次方 1. 本题PTA提交列表 2. 设计思路 (1)定义函数 mypow( double x, int n ) (2)定义整型变量i为循环变量,浮点型变量sum为阶乘的积 (3)for i=1 to n 重复下面步骤 (4)计算sum=sum*x (5)返回sum的值 3.本题调试过程碰到问题及PTA提交列表情况说明 初始代码是这样的:提交错误为段错误 第二天学霸室友告诉说要用for循环和一个求阶乘的变量,然后我就添加了一个for循环,但是并没

C语言博客作业--函数

一.PTA实验作业 6-1 符号函数 1.本题PTA提交列表 2.设计思路 3..本题调试过程碰到问题及PTA提交列表情况说明. 前面的错误都是由于关系运算符中==写成=导致的 6-6 使用函数输出水仙花数 1.本题PTA提交列表 2.设计思路 1.narcissistich函数(判断number是否为水仙花数) 定义循环变量i,j,a储存每一位上的数,sum总和count位数 for(i=number;i>0;i=i/10)每执行一次count+1 for(k=1;k<=count;k++)

C语言第三次博客作业---单层循环结构

一.PTA实验作业 题目1:最佳情侣身高差 1.实验代码 int N,i; double height; //height表示身高 char sex; //sex表示性别 (height>=1.0&&height<=3.0); (N>0&&N<=10); scanf("%d",&N); for(i=1;i<=N;i++){ scanf("\n%c%lf",&sex,&height)

C语言第五次博客作业

一.PTA实验作业 题目1:6-6 使用函数输出水仙花数 1. 本题PTA提交列表 2. 设计思路 (1) 首先先定义narcissistic函数. (2)定义四个整形变量n,a,d,cnt,sum,cnt用来计算有几位数,sum用来存放每个数的cnt次方的和. (3)进行一个循环,让n=number(防止后面需要用number时它的值发生变化),循环中n=n/10,直到 n<=0结束循环,其中每次循环cnt值都加一,用来计算number有几位数. (4)再进行一个for循环(让a=number

C语言第六次博客作业--数据类型

一.PTA实验作业 题目1: 7-3 倒顺数字串 1. 本题PTA提交列表 2.设计思路 (1) 定义两个整型变量i,n,n为输出的数. (2)输入n. (3)若n的值不为1, for i=1 to i<=n, 输出i和一个空格, end. for i=n-1 to i>1, 输出i和一个空格, end. 输出1. (4)若n==1,则直接输出1. 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 (1)没有考虑只输入1的情况. 解决方法:加入if(n==1)的情况. 题目2:7

C语言第六周博客作业--数据类型

一.PTA实验作业 题目1: 7-6 掉入陷阱的数字 1. 本题PTA提交列表 2.设计思路 定义变量N,i,g=1/位数/,a/各位数字相加的和/,b=0,j,N1,c,d/储存N/; do{ for(i=0;i 3.代码截图 4.本题调试过程中碰到的问题以及解决方案 题目2: 7-4 打印菱形图案 1. 本题PTA提交列表 2.设计思路 int n,a,i,l,j,k,g,h,count=0,count1=0; 输入n if((n-1)%2==0)则继续 由规律可以看出, 上半部分(大三角型

C语言第七次博客作业--一二维数组

一.PTA实验作业 题目1:7-3 出生年 1.本题PTA提交列表 2.设计思路 定义year为年份,number存放要求不同数字个数,count计数不同数位,i,rj,n,flag,u,v. a[4]存放年份各个位数. 输入year,number. for i=year to..... 定义a[4]={0},j=0,n=i. 对n取余再除10,将余数r依次存入a[j++]. count=1 for u=1 to u=3 flag=1 for v=0 to v=u-1 如果a[u]=a[v] f

C语言第八次博客作业--字符数组

一.PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 格式错误:因为我多输出了一个换行 部分正确:当我加了flag=1的时候,结果如图 然后我把flag=1给注释掉,还是部分正确,但是错的位置不一样了,结果如图 然后问了助教,他说我没有处理符号,运行结果有多了#,可是我不太明白怎么处理那个符号,虽然最后帮忙改正确了,可是还是没有弄清楚它 题目2:统计一行文本的单词个数 1. 本题PTA提交列表