Project

一、实验作业

1.全排列

设计思路

定义全局变量 a[10] 初始所有元素为1,数组 out[10] 储存要输出的数,cnt=0记录已排列的数字个数
a[i]==1 , 表示 i 还没排列
main():
输入m.
Arrange(m).
Arrange(int n):
for i=1 to m (从小到大寻找还没排列的数)
     如果a[i]等于1
          a[i]=0 , out[cnt]=i , cnt++.
          如果cnt==m,按顺序输出 out 数组里的元素 , 否则继续排列 Arrange(n-1) .
          当从某层函数中退出时,释放该层排列数为可用状态 a[ out[m-n] ]=1
          同时这一层排列数恢复未排列状态 cnt--
     end
end
        

代码截图

2.学生成绩管理系统.

函数模块图

工程文件

  • 总行数:437

代码截图

头文件:

插入学生信息



删除学生成绩信息代码


排序代码


调试结果展示

  • 添加

  • 删除

  • 修改

  • 查询

  • 排序

  • 数据检查









调试问题

  • 在建立工程过程中,常会因为修改代码而导致代码无法运行和运行崩溃
    没找到好的解决方法,只能将代码复制到新的工程中.

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

三、阅读代码

角谷定理:
输入一个自然数,若为偶数,把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求多少次可得到1。
#include <stdio.h>  
int f(int i)  
{  
    printf("%d ", i);  
    if (i == 1) return 1;  
    if (i %2==1)  
        return f(i * 3 + 1) + 1;  
    else  
        return f(i / 2) + 1;  
}  
int main()  
{  
    int i, w;  
    printf("请输入数字:");  
    scanf("%d", &i);  
    w = f(i);  
    printf("
STEP=%d
", w);  
} 
  • 该代码利用递归不断追溯至 i =1,并利用返回值求步数,
    整段代码很简洁,可以少定义一个step参数计算步骤

四、本周学习总结

本周学习内容

函数的嵌套使用

  • 对于较大的程序,可对其进行模块化处理.
    在一个函数内调用其他函数
    本次工程作业中就要用到这种处理.

链表

  • 链表是一种物理存储单元上非连续、非顺序的存储结构,通过指针的连接顺序实现.
  • 对比数组
    链表对于成员的插入删除十分方便,快捷
    链表在访问成员时需要按节点顺序寻找,数组可以随机访问其中成员.

内存的分配的释放

  • 在代码中,为了节约内存,可以动态生成数据.其利用的是malloc()函数,
    而利用free()函数可以及时释放动态分配得来的空间.
    使用这两种函数前都需要调用库函数 #include<stdlib.h>

宏定义

  • 宏定义末尾不需要加分号
  • 利用宏定义可以提高程序通用性和可读性
  • 宏定义可以嵌套使用
  • 宏定义的缺点:
    无法对宏定义中的变量进行类型检查
    宏定义时如果不对分量加括号,展开时的表达式往往不是想要的
    如 #define MUL(A,B) A*B 调用 MUL(a+b,c) 时展开式为 a+b*c.

二级指针

  • 指向指针的指针,称为二级指针,目的是获取这个地址,其表现形式是地址.
  • 定义方式: (类型名) **(二级指针变量名) .
  • 可以指向指针变量,也可以指向数组.
  • 在A指向B、B指向C的指向关系中,如果A、B、C都是变量,即C是普通变量,B是一级指针变量,存放着C的地址,A是二级指针变量,其中存放着B的地址,则这3个变量分别在内存中占据各自的存储单元.

学习体会

  • 接触并且第一次完成一个工程之后,感觉代码量大大提升,特别一旦对各个数据进行判断正确性,就要多出几行.整体下来就要多出许多代码.而如果要再多出更加细化的判断,代码量肯定会有更大的提升.不过这也能让我们对待自己的程序时能够更加严谨.
原文地址:https://www.cnblogs.com/wu98/p/8126513.html