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

一、实验作业

1.1 PTA题目:递归求简单交错幂级数的部分和

1.1.1设计思路

定义一个范围大的sum来放计算出来的交错幂级数的部分和并赋予初值0
判断输入n的值
如果n为1; return x;
如果n为偶数; sum=sum-pow(x,n)+fn(x,n-1);
如果n为奇数; sum=sum+pow(x,n)+fn(x,n-1);
最后返回sum;

1.1.2代码截图

1.1.3调试问题

  • 一开始没怎么理解递归的含义所以打出的代码是下面这样:

  • 所以得出的结果就是x的n次方的结果。

  • 然后想了很久知道了n在不断的减小,需要记录下变化后的n才可以得到结果,所以把代码改成了:

1.2 学生成绩管理系统

  • 代码总行数:277

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

1.2.2 截图展示你的工程文件

1.2.3 函数代码部分截图

1.2.4 调试结果展示

  • 友好的界面

  • 输入学生信息

  • 输出学生信息

  • 修改成绩

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

  • 在程序可以运行后,出现了名称与分数无法对其的情况

  • 把原来有的计算平均分数和总分的一步,删去了。

  • 因为在每次输入成绩后需要先输入数字2,计算完平均分数和总分后,输出的成绩才会有平均分数和总分,所以为了方便直接删除了计算平均分数和总分的函数,在输出成绩的时候,直接输出平均分数和总分会更直观。



  • 查询错误

  • 因为修改前的代码没有输入num(学号)的语句


  • 间断输入,输出后得到的成绩会改变。



  • 一开始,自己使用的是p->stu->math后改成了

  • 在一开始,使用extern Count会使得程序混乱,然后改成了int Count。


  • 对于插序,我想说,插入一个学生的成绩,其实可以用输入一个学生的成绩,然后排序,就可以不用写另一个函数来插序了。



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

三、阅读代码

#include<stdio.h>
void Swap(int *lhs, int *rhs)  
{  
    int t = *lhs;  
  
    *lhs = *rhs;  
    *rhs = t;  
}  
void FullPermutation(int source[], int begin, int end)  
{  
    int i;  
  
    if (begin >= end) // 找到一个排列  
    {  
        for (i = 0; i < end; i++)  
        {  
            printf("%d", source[i]);  
        }  
        printf("\n");  
    }  
    else// 没有找完一个排列,则继续往下找下一个元素  
    {  
        for (i = begin; i < end; i++)  
        {  
            if (begin != i)  
            {  
                Swap(&source[begin], &source[i]); // 交换  
            }  // 递归排列剩余的从begin+1到end的元素  
            FullPermutation(source, begin + 1, end);  
  
            if (begin != i)  
            {  
                Swap(&source[begin], &source[i]); // 回溯时还原  
            }   
        }  
    }  
}  
int main()  
{  
    int source[30];  
    int i, count;  
    scanf("%d", &count);  
    // 初始化数组  
    for (i = 0; i < count; i++)  
    {  
        source[i] = i + 1;  
    }  
    FullPermutation(source, 0, count);  
    return 0;  
}  
  • 这片代码的用意是实现全排列。
  • 程序的主要思路是:
    1.把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
    2.把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
    3.把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
    可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。

四、本周学习总结

1.介绍本周学习内容

  • 1.1.宏定义(宏替换): #define 宏名 宏定义字符串
  • 1.2宏的用途:1.可以定义字符常量,如可以:'define pi 3.14159'。 2.可以定义某些简单的函数。 3.可以为程序书写带来方便,例如如果一个很长的字符需要多次输出,则可以用宏定义的来代替他。
  • 1.3文件包含的格式: # include “需包含的文件名”,一般是自己设定的包含文件。先在当前文件夹查找,若找不到则再去系统文件找.
  • 1.4编译预处理: #if....#else...#end if,与if else语句不同,当一条程序能够执行时就会自动舍弃另外一段程序.

2.学习体会

  • 本周学会了蛮多不懂的,在刚刚懂的时候没有记录下来,在总结的时候就忘了自己应该要写什么,再加上跨年的假期,所以根本就把要写的都忘了,唉,下次一点要及时记。

  • 我们开始接触了程序的编写,就不仅仅只是做题了,其实一个程序的编写,就是我们平常写题的代码的一个汇总,把它们拼起来就可以了,但是又不是那么的容易,有很多细节性的错误,但是又很难改,感觉到了程序设计的难度了。

  • 但是写出一个可以运行的程序的成就感是很好的,会觉得还想再来一个!

  • 对于刚刚接触的链表,我个人感觉画图是一个很好的理解方式,并且画图也十分直观。

posted on 2018-01-01 22:44  不是本人  阅读(340)  评论(2编辑  收藏  举报

导航