博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019春第十一周作业
阅读量:5041 次
发布时间:2019-06-12

本文共 6848 字,大约阅读时间需要 22 分钟。

时间 博客字数 代码行数
第二周 1010 45
第三周 1479 92
第四周 2586 74
第五周 2308 68
第六周 1791 112
第七周 2043 99
 第八周 2422 118
第九周 2511 87
第十周 3338 0
第十一周 3236 214

一、本周作业头

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里
我在这个课程的目标是 能够使用递归函数进行编程
这个作业在那个具体方面帮助我实现目标 学会用递归函数快速解决问题
参考文献

《C语言程序设计》

 

二、单选题

2-1宏定义“#define DIV(a, b) a/b”,经DIV(x + 5, y - 5) 引用,替换展开后是()。
(1分)
  1. x + 5 / y - 5
  2. (x + 5 / y – 5)
  3. (x + 5) / (y - 5)
  4. (x + 5) / (y - 5);
 
2-2定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b的值进行交换,下列表述中正确的是()。
(1分)
  1. 不定义参数a和b将导致编译错误
  2. 不定义参数a、b、t将导致编译错误
  3. 不定义参数t将导致运行错误
  4. 不需要定义参数a、b、t类型
 
2-3如果所有的变量按照下面的程序进行定义和声明,那么在main()函数中所有可用的变量为 ()。
(2分)
void fun(int x){      static int y;    ……    return;}int z;void main( ){       int a,b;    fun(a);    ……}
  1. x,y
  2. x,y,z
  3. a,b,z
  4. a,b,x,y,z
 
2-4如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为( )。
(1分)
  1. 静态变量
  2. 动态变量
  3. 外部变量
  4. 内部变量
 
2-5下面说法中正确的是()。
(1分)
  1. 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
  2. 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
  3. 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
  4. 静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
 
2-6凡是函数中未指定存储类别的局部变量,其隐含的存储类型为( )。
(1分)
  1. 自动(auto)
  2. 静态(static)
  3. 外部(extern)
  4. 寄存器(register)
 
2-7在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。
(1分)
  1. extern
  2. register
  3. auto
  4. static
 
2-8将一个函数说明为static后,该函数将 ( )。
(1分)
  1. 既能被同一源文件中的函数调用,也能被其他源文件中的函数调用
  2. 只能被同一源文件中的函数调用,不能被其他源文件中的函数调用
  3. 只能被其他源文件中的函数调用,不能被同一源文件中的函数调用
  4. 既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用

 

 

三、基础题

7-1 汉诺塔问题* (10 分)
 

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

题图1.jpg

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

输入格式

圆盘数 起始柱 目的柱 过度柱

输出格式

移动汉诺塔的步骤

每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。

输入样例

3a c b

输出样例

1: a -> c2: a -> b1: c -> b3: a -> c1: b -> a2: b -> c1: a -> c 实验代码:
1 #include
2 void Hanoi(int n,char x,char y,char z); 3 int main () 4 { 5 int n; 6 char x,y,z; 7 scanf("%d\n",&n); 8 scanf("%c %c %c ",&x,&y,&z); 9 Hanoi(n,x,y,z);10 }11 void Hanoi(int n,char x,char y,char z)12 { 13 if(n==1)14 { 15 printf("%d: %c -> %c\n",n,x,y); 16 } 17 else18 { 19 Hanoi(n-1,x,z,y); 20 printf("%d: %c -> %c\n",n,x,y); 21 Hanoi(n-1,z,y,x); 22 }23 }

 

设计思路:

本题调试过程中碰到的问题及解决办法:

     没有问题,根据老师上课讲得,再照着书本依次写就可以了

运行结果:

 

 

输出样例:

Hello ?AI: hello! Good to chat   with youAI: good to chat with youcan   you speak Chinese?AI: I can speak chinese!Really?AI: really!Could you show me 5AI: I could show you 5What Is this prime? I,don 't knowAI: what Is this prime! you,don't know 实验代码:
 

设计思路:

本题调试过程中碰到的问题及解决办法:

运行结果:

 

 

四、挑战作业

7-3 ***八皇后问题 (20 分)
 

在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。

现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。

输入格式

正整数 n (0 < n ≤ 12)

输出格式

若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。

要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。

输入样例1

3

输出样例1

None

输入样例2

6

输出样例2

. Q . . . .. . . Q . .. . . . . QQ . . . . .. . Q . . .. . . . Q .. . Q . . .. . . . . Q. Q . . . .. . . . Q .Q . . . . .. . . Q . .. . . Q . .Q . . . . .. . . . Q .. Q . . . .. . . . . Q. . Q . . .. . . . Q .. . Q . . .Q . . . . .. . . . . Q. . . Q . .. Q . . . .

 

实验代码: 设计思路: 本题调试过程中碰到的问题及解决办法: 运行结果:
7-1 求迷宫最短通道 (20 分)
 

递归求解迷宫最短通道的总步长。输入一个迷宫,求从入口通向出口的可行路径中最短的路径长度。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径上经历的最短的总步长。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走。

输入格式:

输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)

输出格式:

若有可行的通道则输出一个整数,代表求出的通道的最短步长;若没有通道则输出"No solution"

输入样例:

101 1 1 1 1 1 1 1 1 11 0 0 1 0 0 0 1 0 11 0 0 1 0 0 0 1 0 11 0 0 0 0 1 1 0 0 11 0 1 1 1 0 0 0 0 11 0 0 0 1 0 0 0 0 11 0 1 0 0 0 1 0 0 11 0 1 1 1 0 1 1 0 11 1 0 0 0 0 0 0 0 11 1 1 1 1 1 1 1 1 1

上述输入代表的是如下这样一个迷宫:

大小为10的迷宫示意图.PNG

其中红色的小方块是障碍物,蓝色的小方块是空位,白色的小圆连起来是一条从入口到出口的通道,两个圆之间代表一个步长。

输出样例:

14
实验代码: 设计思路: 本题调试过程中碰到的问题及解决办法: 运行结果:

 

五、预习作业

第十二周的教学内容是:第十一章 指针进阶

请大家查阅资料,思考如下问题:

请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)

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

资料来源(和)

 答:

数组指针:

这位一个指针,在32位机器上,大小为四个字节。
例:
int (*p)[4];
上面即为一个数组指针的写法,解读为:指向一个大小为4的int型数组。
 

 

如上图可得,p为一个指向有四个int类型的数组。
*p=数组首元素值;
&p = 指针p的地址,相当于一个二级指针。
指针数组:
这是数组,大小为   sizeof(数组名);
 
int *p[4];
 上面为一个指针数组,其中p表示数组名称,p中存放了4个指针,每个指针都是指向int型。
 

 

根据上面的图可知,现在的 p 表示的就是整个数组了。数组里面装的是4个指向  int  类型的指针。
*p = 数组p中首元素的值,即为一个指针。
&p = 为数组p的首地址。
 
上述的两种情况,从形式上看为,一种形式有括号,另一种形式为不加括号
这是考虑到 “优先级”,[ ]的优先级大于*。
 
指针函数:

为一个指针,指向函数,在32位机器上,大小为4.

void (*p)(int,int);

 

由上图可清晰的看出,p表示指向一个返回值为空,参数列表为(int,int)的函数。

函数指针:

定义
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名)   (参数)
如下:
int (*fun)(int x,int y);
1
函数指针是需要把一个函数的地址赋值给它,有两种写法:
fun = &Function;
fun = Function;
12
取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
12
两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。
示例
int add(int x,int y){
    return x+y;
}
int sub(int x,int y){
    return x-y;
}
//函数指针
int (*fun)(int x,int y);
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //第一种写法
    fun = add;
    qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
 //第二种写法
    fun = &sub;
    qDebug() << "(*fun)(5,2) = " << (*fun)(5,3)  << fun(5,3);
    return a.exec();
}
12345678910111213141516171819202122
输出如下:
(*fun)(1,2) =  3
(*fun)(5,2) =  2 2
12
上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。
 
二级指针:
指针变量也是变量,是变量就有地址 ;所以变量地址的指针就是二级指针变量
int main(){ int a = 10; int *pa = &a;                     //整型指针变量pa保存整型变量a的地址 
int **ppa = &pa;                 //ppa保存pa的地址 
printf("%d\n", **ppa);           //两次解引用,找到a的值为10 return 0;}
单向链表:

单向链表包含两个域,一个是信息域,一个是指针域。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。

优点:单向链表增加删除节点简单。遍历时候不会死循环。(双向也不会死循环,循环链表忘了进行控制的话很容易进入死循环);缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。

 void printList(PNode phead)
{
    PNode pCur = phead;
    while (pCur)
    {
        printf("%d ",pCur->data);
        pCur = pCur->next;
    }
    printf("\n");
}
 
 

六、学习感悟

太难了,几度崩溃,百度搜的答案好复杂,我读不懂,坐等待老师讲解

七、描述结对编程过程和结对编程的优缺点

我们一起做完选择题和编程题第一题,后面的题目我们是真的不会了,真心尽力了。

八、学习进度条

 

累积代码行和博客字数:

时间 博客字数 代码行数
第二周 1010 45
第三周 1479 92
第四周 2586 74
第五周 2308 68
第六周 1791 112
第七周 2043 99
 第八周 2422 118
第九周 2511 87
第十周 3338 0
第十一周 3236 214
周/日期 这周所用时间     代码行 学到的知识点简介 目前比较迷惑的问题  
3/9-3/15 10小时左右 200左右 自学二维数组 对矩阵的上下三角形的一些规律,运用的不熟练
3/16-3/22 8小时左右 260左右 选择排序法和冒泡法 对题目进行思路分析不够全面
3/23-3/29 10小时30分钟左右 220左右 在定义指针变量时需要使用指针声明符 * ,但指针声明符并不是指针的组成部分 什么是指针变量的初始化
3/30-4/5 7小时左右 180左右  理解变量、内存单元和地址之间的关系;掌握定义指针变量,使用指针变量  如何使用指针实现函数调用返回多个值
4/6-4/12 8小时左右 200左右 使用指针实现函数调用返回多个值 老师上课的表格,我还不能完全运用
 4/13-4/19  9小时左右 236左右  可以根据运行时的实际存储需求分配适当的存储区  还不能分清什么时候用数组什么时候用字符串
4/20-4/26 7小时左右 220左右 了解结构的概念和定义 结构的定义形式还有其他类型吗
4/27-5/1 2小时左右 0 对于PTA 上同一个题目有不同的解法,有了了解

感觉有时候数组和指针可以在代码中互

5/2-5/10 6小时左右

210左

能够使用递归函数进行编程,掌握宏的基本用法 对新学的知识不能熟练掌握

转载于:https://www.cnblogs.com/TheMatrixOfTYY/p/10846022.html

你可能感兴趣的文章
XMPP语音聊天解决方案 (待论证 正打算写)
查看>>
golang convert integer to float number
查看>>
数据结构C语言版--动态顺序表的基本功能实现(二)
查看>>
【CSS3】内联、内部、外部样式,样式优先级、层叠、继承
查看>>
数值函数ROUND(四舍五入),TRUNC(不四舍五入),MOD
查看>>
[毕业生的商业软件开发之路]开发第一个Windows应用程序
查看>>
AcWing 204. 表达整数的奇怪方式 (线性同余方程组)打卡
查看>>
web api 返回数据XML JSON
查看>>
Squid中文权威指南
查看>>
截取最后一个特定字符
查看>>
Python使用QRCode模块生成二维码
查看>>
Android端百度地图API使用详解
查看>>
NavigationBar设置
查看>>
IO端口和IO内存的区别及分别使用的函数接口
查看>>
夺命雷公狗---node.js---10之POST的接收
查看>>
自定义的JavaScript定时器
查看>>
smarty对数组进行json_encode
查看>>
Django model 字段类型及选项解析(二)
查看>>
《Linux命令行与shell脚本编程大全》第十四章 处理用户输入
查看>>
189. Rotate Array 从右边开始翻转数组
查看>>