2019春第十二周作业
作业:
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3234 |
我在这个课程的目标是 | (1)能够了解二级指针的概念,以及指针数组的应用;(2)了解指针与函数的关系,掌握指针作为函数返回值; |
这个作业在那个具体方面帮助我实现目标 | 二级指针可以帮我实现了指向字符串中的任意一个字母 |
参考文献 | C语言程序设计II |
6-1 计算最长的字符串长度 (15 分)
本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
函数接口定义:
int max_len( char *s[], int n );
其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10
#define MAXS 20
int max_len( char *s[], int n );
int main()
{
int i, n;
char *string[MAXN] = {NULL};
scanf("%d", &n);
for(i = 0; i < n; i++) {
string[i] = (char *)malloc(sizeof(char)*MAXS);
scanf("%s", string[i]);
}
printf("%d\n", max_len(string, n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4
blue
yellow
red
green
输出样例:
6
1)实验代码
int max_len(char*s[],int n)
{
int i,max=0; /*定义变量*/
for(i=0;i<n;i++){
int len=strlen(s[i]);
if(len>max){ /*比较大小*/
max=len; /*交换值*/
}
}
return max; /*返回值*/
}
2)设计思路
3)本题调试中遇到的问题及解决办法
本题没啥问题。
4)运行结果图
6-2 统计专业人数 (15 分)
本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:
struct ListNode {
char code[8];
struct ListNode *next;
};
这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。
函数接口定义:
int countcs( struct ListNode *head );
其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ListNode {
char code[8];
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
int countcs( struct ListNode *head );
int main()
{
struct ListNode *head;
head = createlist();
printf("%d\n", countcs(head));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1021202
2022310
8102134
1030912
3110203
4021205
#
输出样例:
3
1)实验代码
int countcs(struct ListNode*head)
{
int num=0; /*定义变量*/
struct ListNode*p=head;
while (p!=NULL){
if(p->code[1]=='0'&&p->code[2]=='2'){ /*判断专业为计算机的学生*/
num++; /*满足条件则mun++*/
}
p=p->next;
}
return num; /*返回值*/
}
2)设计思路
3)本题调试中遇到的问题及解决办法
本题的段错误是由于先执行后条件,所以可能会因为漏了第一个学生学号的判断。
4)运行结果图
6-3 删除单链表偶数节点 (20 分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = deleteeven(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
1)实验代码
struct ListNode *createlist() /*建立新链表*/
{
struct ListNode *head,*p;
head=(struct ListNode *)malloc(sizeof(struct ListNode)); /*指针申请内存单元*/
p=head;
head->next=NULL;
int n;
while (scanf("%d",&n)!=EOF&&n!=-1){ /*输入整数并判断值是否为-1*/
p->next=(struct ListNode *)malloc(sizeof(struct ListNode)); /*申请内存*/
p=p->next;
p->data=n;
p->next=NULL;
}
head=head->next;
return (head); /*返回*/
}
struct ListNode*deleteeven(struct ListNode*head)
{
struct ListNode *p,*q;
if(head==NULL){ /*链表空*/
return NULL;
}
p=head;
q=p->next; /*从表头的下一个结点搜索所有符合删除要求的结点*/
while(q!=NULL){
if(q->data%2==0){ /*符合q所指结点符合删除要求*/
p->next=q->next;
free(q);
q=p->next;
}
else{
p=p->next; /*p后移一个结点*/
q=p->next; /*q指向p的后一个结点*/
}
}
if(head->data%2==0){
head=head->next;
}
return (head); /*返回*/
}
2)设计思路
3)本题调试中遇到的问题及解决办法
本题主要是参照书上写的,但由于对链表有写不明白,所以在编写函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针出现了一些错误,是由于当n不为-1时并未申请内存。
4)运行结果图
三、预习题
1.所在小组想要开发的项目的名称和目标;
项目:
名称:小游戏:俄罗斯方块;
目标:实现按左右下键进行方块的移动、按上键变形、按空格键暂停、按Esc键游戏结束;当方块的累计高度超过游戏空间高度时结束游戏。
2.项目主体功能的描述;
int mian()
{
startup(); //初始化
beforegame(); //游戏开始前的画面
GreateRandonSqare; //产生随机方块
CopySqareToBack; //将方块贴入背景
while(1)
{
double start = (double)clock()/CLOCKS-PER-SES; //定时函数
show(); //显示函数
UpdateWithInput(); //与用户有关的输入
UpdateWithoutInput(); //与用户无关的输入
if(Score<10)
{
if((double)clock()/CLOCKS-PER-SEC - start<1.0/3)
Sleep((int)((1.0/3 - (double)clock()/CLOCKS-PER-SEC + start) *1000));
}
else if(Score>=10)
{
if((double)clock()/CLOCKS-PER-SEC - start<1.0/5)
Sleep((int)((1.0/5 - (double)clock()/CLOCKS-PER-SEC + start) *1000));
}
}
getch();
closegraph();
return 0;
}
//函数的声明
void gotoxy(int x,iny y);//清屏
void startup();//初始化
void show();//显示函数,清全屏
voud UpdateWithoutInput(); //与用户无关的输入
void UpdateWithInput(); //与用户有关的输入
void GreateRandonSqare();//随机显示图形
void CopySqareToBack();//把图形写入背景数组
void SqareDown();//下降
void SqareLeft();//左移
void SqareRight();//右移
void OnChangeSqare();//变形
void ChangeSqare();//除长条和正方形外的变形
void ChangeLineSqare();//长条变形
int CanSqareChangeShape();//解决变形bug
int CanLineSqareChange();//解决长条变形bug
int gameover();//判断游戏是否失败
int CanSqareDown();//若返回继续下降,返回则代表到底,不下降
int CanSqareDown2();//若返回继续下降,返回则代表到底,不下降 ,与方块相遇
int CanSqareLeft();//若返回继续左移,返回则代表到最左边,不在左移
int CanSqareLeft2();//若返回继续左移,返回则代表到最左边,不在左移,与方块相遇
int CanSqareRight();//若返回继续左移,返回则代表到最右边,不在右移
int CanSqareRight2();//若返回继续左移,返回则代表到最右边,不在右移,与方块相遇
void PaintSqare();//画方块
void Change1TO2();//到底之后数组由1变2
void ShowSqare2();//2的时候也画方块到背景
void DestroyOneLineSqare();//消行
3.现阶段已做的准备工作;
正查阅资料,看游戏程序设计书
4.小组成员名单和进度安排。(课程设计阶段:13-17周)
小组成员名单:
20188748 | 黄春艳 |
2088759 | 张文颐 |
20187488 | 谢康宁 |
进度安排:
| | | |
|---|----|----|----|
|日期|安排|遇到的问题|解决方法|
四、学习感悟
本次老师讲课的内容主要是由概念扩展到是如何实现的,听懂了它们的主要区别,还有本次作业第一第二题感觉还好,就是第三题是使用单向链表写的,所以有点懵,有些还不懂如何使用,第三题主要是参照书上例题来理解。
五、结对编程感受
讨论第三题的时候我俩都不知道如何下手,从书中看了一下例题与概念,我们主要是交流了慨念性的问题。
六、学习进度表
周/日期 | 这周所花时间 | 代码行 | 学到的知识简介 | 目前比较迷惑的问题 |
3/4-3/9 | 4个半小时 | 37 | 1、建立文件,读取文件数据并储存;2、用户信息的加密和校验;3、FILE文件类型的运用 | 1、不会用加密算法以及FILE文件类型的运用 |
3/10-3/17 | 10个小时 | 90 | 1、二维数组的运用 | 1、有关数组的一些运用还不怎么明白 |
3/18-3/22 | 10个小时 | 91 | 1、冒泡排序法和选择排序法;2、二分法查找;3、二维数据:定义、引用、初始化,二维数组与矩阵。 | 1、冒泡排序法和选择排序法有点混淆。 |
3/25-3/29 | 12小时 | 84 | 1、字符串与字符的区别。 | 指针的运算不知道怎么算,弄不清 |
4/1-4/5 | 15小时 | 79 | 1、什么是指针;2、指针的基本运算;3指针变量的初始化。 | 不太懂得如何运用指针数组 |
4/8-4/12 | 10小时 | 82 | 1、指针、数组和地址之间的关系;2、数组名可以作为函数的参数;3、指针和数组可以实现相同的操作 | 1、组名作为函数参数的用法。 |
4/15-4/19 | 8小时 | 123 | 1、常用字符串函数以及使用指针操作字符串的方法;2、动态内存分配。 | 1、定义结构变量的运用不太清楚。 |
4/22-4/26 | 6小时 | 76 | 1、结构的概念与定义以及嵌套定义;2、结构变量的定义和初始化。 | 1、无类型名该如何使用尚存疑问 |
4/29-5/3 | 1个半小时 | 0 | 1、结构指针;2、结构数组。 | 1、结构指针还不太懂。 |
5/6-5/10 | 10小时 | 20 | 1、能够使用递归函数进行编程;2、掌握宏的基本用法;3、掌握编译预处理的概念。 | 编程题2、3、4不会做 |
5/13-5/17 | 10小时 | 71 | 1、了解二级指针的概念,以及指针数组的应用;2、了解指针与函数的关系,掌握指针作为函数返回值。 | 1、单向链表有些不懂。 |
六、表格和折线图
时间 | 代码行数 | 博客字数 |
第一周 | 0 | 0 |
第二周 | 37 | 400 |
第三周 | 90 | 694 |
第四周 | 91 | 1613 |
第五周 | 84 | 1410 |
第六周 | 79 | 2608 |
第七周 | 109 | 2550 |
第八周 | 123 | 2843 |
第九周 | 76 | 2935 |
第十周 | 0 | 2367 |
第十一周 | 20 | 4692 |
第十二周71 | 2983 | |