• 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 函数代码部分截图

    • 本系统代码总行数:313
    • 头文件
    • 插入学生信息
    • 删除学生信息
    • 总分排序

    1.2.4 调试结果展示

    基础功能展示

    • 新增学生信息

    • 修改学生成绩信息

    • 删除学生成绩信息

    • 插入新的学生信息

    • 排序


    • 查询学生信息

    • 退出系统

    非法输入结果展示

    • 在没有学生信息的情况下无法进行修改、删除、排序等功能

    其它非法输入代码还未添加

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

    • 系统如果记住了先前的运行结果导致修改后运行结果无法显示,可以先执行运行->清除后再编译运行。
    • 新增学生信息中,输入信息应该存放在第count个位置,不是第i个位置,否则新增信息会把原本的学生信息覆盖掉。

    二、截图本周题目集的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("请输入要拆分的数字
    ");
         int n;
         scanf("%d",&n);
         int ret = 0;
         ret = q(n,n);
         printf("该数字一共有的拆分方法数
    ");
         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)²
      错误:#define SQR(x) x*x 宏替换后 -> y=x+y*x+y≠(x+y)²
      正确:#define SQR(x) (x)*(x)宏替换后 -> y=(x+y)*(x+y)=(x+y)²

    1.2.文件包含

    • 文件包含的格式:
      #include<需包含的文件名>#include"需包含的文件名"
      1.双引号,是指系统先在源程序所在的目录查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去找。
      2.尖括号,系统将直接按照系统指定的标准方式到有关目录中去寻找。

    2.学习体会

    • 这周的内容学起来有点乱,特别是指针进阶这一部分内容,还需要总结学习。
    • 这周的作业学生成绩管理系统,代码量增多,也是新的作业方式,多文件工程,对我有难度。
    • 一学期快结束了,前面的一些知识点也要着手复习总结,接下来应该是更忙碌的一个月了。
  • 相关阅读:
    1.选择排序法
    24.桌面移动qq
    23.控制语句题目
    23.位运算实现加法
    22.dll调用技术
    21.MFC进制转换工具
    2.CString转换到char*
    20.原码反码补码及图形化界面
    11gR2 Agent 简介
    RAC数据库后台进程介绍
  • 原文地址:https://www.cnblogs.com/smtwula/p/8157971.html
Copyright © 2020-2023  润新知