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
posted @ 2019-05-16 20:58  HCYXDA  阅读(236)  评论(0编辑  收藏  举报