第十一周编程总结

这个作业属于哪个课程 C语言程序设计II
这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/MS/homework/3206
我在这个课程的目标是 能够使用递归函数进行编程;掌握宏的基本用法;掌握编译预处理的概念
这个作业在哪个具体方面帮助我实现目标 通过PTA作业实践编程学习
参考文献 C语言程序设计
选择题

编程题
7-1 汉诺塔问题* (10 分)
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。

请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。

输入格式
圆盘数 起始柱 目的柱 过度柱
输出格式
移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。
输入样例
3
a c b
输出样例
1: a -> c
2: a -> b
1: c -> b
3: a -> c
1: b -> a
2: b -> c
1: a -> c
1.代码

#include<stdio.h>
void hanio(int a,char w,char n,char m);
int main(void)
{
    int a;
    char k,n,m;
    scanf("%d\n",&a);
    scanf("%c %c %c",&k,&n,&m);
    hanio(a,k,n,m);
    return 0;
}
void hanio(int a,char k,char n,char m)
{
    if(a==1)
    printf("%d: %c -> %c\n",a,k,n);
    else
    {
        hanio(a-1,k,m,n);
        printf("%d: %c -> %c\n",a,k,n);
        hanio(a-1,m,n,k);
    }
}

2.设计思路

3.本题遇到的问题及解决办法
问题:模仿书上245页的汉诺塔代码,但代码运行时出现答案错误
解决办法:重新检查代码,发现自己给定义的变量多加了‘ ’符号,改正后答案正确

4.运行结果

预习题
请大家查阅资料,思考如下问题:
请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)

请用自己的理解回答。如果有引用他人的文字,请一定要标出出处(使用Markdown的链接方式)。

1.数组指针
首先“数组指针”本质是指针,是指向一维数组的指针,定义方法,如:int (p)[n]😭)的优先级更高,表示一个名为p的指针,指向一个整型的、长度为n的数组。如果要把一个二维数组赋给这样的指针,可以这样,如:int b[2][4]; int (p)[4]; (因为要将二维数组b赋给p,而二维数组b的有2行,每一行的长度是4,所以数组指针p的长度定为4)定义完之后赋值方法为 p=b; (将数组b的首地址b[0]或者b[0][0]赋给p),此时p指向b[0][0],若执行p++; 则p指向b[1][0]。

2.指针数组
指针数组的本质是数组,这个数组的元素全都是指针。定义方式如:int p[n]; p是数组名,int是数组的类型,n是数组长度,则p[0]、p[1]、p[2]等都表示这个数组的一个指针,p++; 表示p数组指向下一个数组元素。如果a是个一维数组,要将a首地址赋给p,则p=a是错误的方式,可以写成p=a; 此时p表示指针数组第一个元素的值,a的首地址的值。如果要把二维数组赋给一个指针数组,则在定义之后如int c[3][5]; int p[3]; for(i=0;i<3;i++) p[i]=c[i]; 二维指针数组的各个元素的表示方法:((p+i))和**(p+i)表示第‘i+1’行的第一个元素,(p[i]+j)、((p+i)+j)、((p+i))[j]和p[i][j]都表示第i行的第j个元素。

3.指针函数
指针函数本质是函数,它的返回值是个指针。它的声明形式:类型名 *函数名(参数表),如,int *fact(cahr c,char op);会返回一个类型为int的指针(地址值),而在主函数中用来接收该返回值的也必须是相同类型的指针变量。
4.函数指针
指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

类型说明符 (*函数名)(参数)

其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。

指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
5.二级指针:指向指针的指针
int c=2,d=3; int *pc=&c;

pc是指针变量的存储内容,也就是c的地址

*pc就是对指针的解引用,取出这个c这个地址里面的值

6.单向链表:单向链表是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。链表是使用指针进行构造的列表,并且是由一个个结点组装起来的,因此又称为结点列表。其中每个结点都有指针成员变量指向列表中的下一个结点,head指针指向第一个结点称为表头,而终止于最后一个指向nuLL的指针。

学习感悟
本周学习了递归函数并用其进行编程;学习了宏的基本用法;理解编译预处理的概念。以前总是见到使用宏的情况,但是没去正式了解,这次真正知道了宏的概念,还有编译预处理也经常听到但没没去查过,这周也知道了,真正感觉到对这门课的知识越学越深了,也越来越难了。

结对编程感想
本周作业太难了,和小伙伴只讨论了前面的题目,后面的只能哑口无言,看不懂,只能借看大佬的瞎扯几句话,我们还需要加把劲。

学习进度条

posted @ 2019-05-10 21:51  青衫拓落  阅读(113)  评论(0编辑  收藏  举报