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

一、PTA实验作业

递归法对任意10个数据按降序排序

1.本题PTA提交列表

2. 设计思路

设置递归出口当n等于1时直接返回
设置每一次函数要做的事返回一个最大的值放在数组最后一位。

3.代码截图

二、学生成绩管理系统(考虑到学号有的时候也可能是有字母的所以没有判断,但是若是纯数字其实只要遍历数组用isdigit的库函数来判断就好了)

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

1.2.2 截图展示你的工程文件

1.2.3 函数代码部分截图

本系统代码总行数:535

头文件

修改学生信息

总分排序代码

插入学生信息及学生成绩信息代码

删除学生信息

1.2.4 调试结果展示

菜单:(考虑到使用者可能会在使用的某一步想要返回主菜单后面加了一句提示使用者)

添加功能:

验证任何一部我想返回都可以返回(指的是任何一个函数内相反回主菜单都可以实现)

若添加的人数超过了系统限定人数会有提示

我设定的最大科目是10课超过了也会有提示

分数我的最大设定是100分超过了就会有提示

课程号重复输入的话也会要求重新输入

学号重复的话一样会要求重新输入

程序结束了之后还会提示你是否要打出成绩表可选择

修改功能:

找不到学号的话也会有提示

找不到课程号的话也会有提示

修改成绩不合理也会提示

还可以实现连续更改和打出表格并且修改的可以连带平均分和总分发生改变

原本信息

现在信息

删除功能:

没查到学号会提醒

找不到课程号一样会提醒

可实现连续删除

并且平均分总分会相对应改变


原本分数

修改了
结果

显示所有学生成绩信息

没有学生信息的时候会提醒一句以防用户懵逼

能够分别按照总分和平均分进行排序。


能够根据学号查询学生信息。


可实现连续查询并且可实现查不到学号提醒

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

四、阅读代码

我选了两个代码做比较汉诺塔问题(运用循环实现和递归实现)

#include<iostream>  
#include<algorithm>  
#include <stack>  
#include <cstdio>  
#include<cmath>  
using namespace std;  
int temp1=-1, temp2=-1;  
char s[4] = { 'q','a','b','c' };//为了解题简便,我是从1开始算的  
stack<int> a[4];  
int c1 = 0;  
int rank1[4];  
bool compare(int a1,int b1) { //给栈顶元素排序用  
    if (a[a1].top() >= a[b1].top())  
        return true;  
    if (a[a1].top() < a[b1].top())  
        return false;  
    return false;  
}  
bool move1(int before,int after) {   //移动物块  
    if ((a[after].top() - a[before].top())%2==0)  
        return false;  
    a[after].push(a[before].top());  
    a[before].pop();  
    temp1 = before; temp2 = after;  //记录上一次移动的物块位置  
    printf("%c -> %c\n",s[temp1],s[temp2]);//printf比cout要快  
    c1++;  
    return true;  
}  
int main(){  
    int i, N;  
    cin >> N;  
    a[1].push(N+1);          //保证栈不会为空  
    for (i = 0; i < N; i++)  
        a[1].push(N-i);   //初始化  
    a[2].push(N + 2);  
    a[3].push(N+3);  
    if (N % 2 == 1) {        //N为奇数还是偶数,第一次移物块到哪里是不同的  
        move1(1, 3);  
        temp1 = 1;  
        temp2 = 3;  
    }  
    else {  
        move1(1, 2);  
        temp1 = 1; temp2 = 2;  
    }  
    for (i = 1; i <= 3; i++)//初始化栈排序表  
        rank1[i] = i;  
    int tt;  
    while (c1 < pow(2, N) -1) {  
        sort(rank1 + 1, rank1 + 4, compare);//按compare函数排序  
            if (temp2 == rank1[2]) { //刚移动过的物块不会再被移动  
                if(tt==temp1)   //别问我为什么,找规律找出来的  
                    move1(rank1[3], rank1[2]);  
                else  
                    move1(rank1[3], rank1[1]);  
            }  
            else  
                move1(rank1[2], rank1[1]);  
        tt = rank1[2];   
    }  
}  

递归的在书上,
循环大概思路是运用到栈来解决的虽然看不太懂但是,能看出循环和递归在某一些问题上的复杂程度确实相差太多了

五、本周学习总结

1.介绍本周学习内容

本周我们学习了指针进阶和文件管理,文件管理这个其实就是将我们一个长长的代码里面的函数分装成一个个文件,就像是一个大大的包装我们拆分成一个个的小包装,这个应用和适合在多人共同完成一个文件的时候只要每一个人去写一个函数能够实现自己的功能再组合在一起有点像终端中的ping命令,而指针进阶就相对比较乱了,其实指针进阶最乱的应该是二阶指针与二维数组,其实只要理解了指针的空间分配就不会乱再加上一级*只是地址二级才是内容就会好理解。比如*a是地址*a+1就是地址加上1也就是第一行的首元素地址加1变成a[0][1]由于它是二阶指针一个*只能到地址就可以得到正确的理解,再如*(a+1)可以先理解成*(a+1)+0这样就变成了第一行的第0个元素的地址。再乱的话,在我理解上应该可以把所有的判断分成三部曲第一判断是二级还是一级指针,第二看它有一个还是两个*一个只能是地址两个则是对应位置内容,第三个改写成*(a+n)+x就代表第n行第x列的地址。

2.学习体会

感觉最近上的内容比较多比较灵活尤其是指针这一块的应用思路都非常巧妙,所以我应该还会花更多的时间去摸透这块内容。

posted @ 2017-12-31 23:06  这个人有毒啊  阅读(527)  评论(2编辑  收藏  举报