2019春第十二周作业

   
这个作业属于哪个课程 C语言程序设计2
这个作业要求在哪里 2019年春季学期第十二周作业
我在这个课程的目标是 我希望能够通过学习C语言的知识,能够掌握二级指针的概念,以及指针数组的应用;了解指针与函数的关系,掌握指针作为函数返回值;掌握单向链表的概念和操作包括建立、增加、删除、修改、遍历。
这个作业在哪个具体方面帮助我实现目标 这个作业让我通过掌握二级指针的概念,以及指针数组的应用,了解指针与函数的关系,掌握指针作为函数返回值,掌握单向链表的概念和操作包括建立、增加、删除、修改、遍历来解决题目。
参考文献 《C语言程序设计2》

基础作业

题目

计算最长的字符串长度
本题要求实现一个函数,用于计算有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,l,max;
    max=0;
    for(i=1;i<n;i++)
    {
        if(strlen(s[i])>strlen(s[max]))
               max=i;
    }
    l=strlen(s[max]);
    return l;
}

2)设计思路

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

无。

4)运行截图

题目

统计专业人数
本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:

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 )
{
    struct ListNode *p;
    int sum;
    sum=0;

    for(p=head;p!=NULL;p=p->next)
    {
        if(p->code[1]=='0'&&p->code[2]=='2')
         sum++;
    }
    return sum;         
}

2)设计思路

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

1.答案错误,学号是字符元素,在if语句判断时将学号写成了数字元素;

解决办法:将if语句等于0和等于2中的0和2都用单引号引起来。
2.答案错误,for循环之前有个if语句判断phead的情况,也就是将phead的情况单独处理了,但是for语句的初始条件就是p=head,重复了;

解决办法:将for循环之前的if语句判断情况删去。

4)运行截图

题目

删除单链表偶数节点
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:

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()
{
    int num,size=sizeof(struct ListNode);
    struct ListNode *head,*tail,*p;
    head=tail=NULL;

    scanf("%d",&num);
    while(num!=-1)
    {
        p=(struct ListNode*)malloc(size);

        p->data=num;
        p->next=NULL;
        if(head==NULL)
           head=p;
        else
           tail->next=p;
        tail=p;
        scanf("%d",&num);      
    }
    return head;
}

struct ListNode *deleteeven( struct ListNode *head )
{
    struct ListNode *p1,*p2;

    while(head!=NULL&&head->data%2==0)
    {
        p2=head;
        head=head->next;
        free(p2);
    }

    if(head==NULL)
      return NULL;

    p1=head;
    p2=head->next;
    while(p2!=NULL)
    {
        if(p2->data%2==0)
        {
            p1->next=p2->next;
            free(p2);
        }
        else
          p1=p2;
        p2=p1->next; 
    }
    return head;
}

2)设计思路

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

1.编译错误,链表建立函数中else的执行语句tail->next=p打成了tail->=next,手误;

解决办法:改成正确的。

4)运行截图

预习作业

1.所在小组想要开发的项目的名称和目标;

简易五子棋小游戏(暂定)

2.项目主体功能的描述;

暂无。

3.现阶段已做的准备工作;

回顾迄今为止所学的知识,了解游戏开发的步骤。

4.小组成员名单和进度安排。(课程设计阶段:13-17周)

成员:曾丽梅,李东辉,随机一有缘人。
进度安排:暂无。

结对编程

本周除挑战题外的其它题目不难,但在和搭档讨论时发现搭档和我解题的思路不一样,如果要我按照搭档的思路来写代码的话,我又很难写出来。结对编程的优点是可以了解一个题目的另一种思路,进而使自己从另一个思考解决问题的方法,缺点是我们对一个题目都没有思路,或者能力有限时没有办法。

学习感悟

本周学习了二级指针的概念,以及指针数组的应用;了解了指针与函数的关系,掌握了指针作为函数返回值及单向链表的概念和操作(建立、增加、删除、修改、遍历)。这是第一次接触链表这个概念,上周的预习只是大概知道了是用来干嘛的,这周的难点除去挑战题就是关于链表的建立了,这次写作业一开始也是照着书上的写的,并不懂它的真正过程,后来上完课才具体的知道了链表的操作方式,现在真正感觉到对这门课的知识越学越深了,也越来越难了。

学习进度

时间进度条

日期 这周所花时间 代码行 学到的知识点 问题
3.15-3.22 10个小时 130 选择排序,冒泡排序,二维数组 输出完一行数后会自动换行吗
3.22-3.29 13个小时 200 字符型数组的简单使用,字符数组与字符串的区别,二维字符数组的输入及简单判断,对指针的初步了解 指针怎样在自定义函数中返回多个值
3.29-4.05 8个小时 100 变量、内存单元和地址之间的关系;如何定义指针变量,怎样使用指针变量,怎样进行指针变量的初始化;指针变量的基本运算;理解指针作为函数参数的作用;使用指针实现函数调用返回多个值 在自定义函数中将数值赋给指针所指向的变量,要在主函数中输出该值,输出参数是指针,为什么不可以。
4.05-4.12 12个小时 150 数组名作为函数参数的用法,指针、数组和地址之间的关系,指针和数组可以实现相同的操作,strcpy函数的深层理解,for循环与while循环在内存层面的区别 对指针的运用不熟练
4.12-4.19 8个小时 120行 常用字符串函数,如何使用指针操作字符串,动态内存分配。 两个字符串的交换为什么不能通过赋值实现
4.19-4.26 10个小时 120行 使用结构变量与结构数组进行编程,利用结构指针进行操作,并应用于函数传递 有些题目不用结构也能解决,在二者都能解决的情况下,使用结构解决问题有什么优势
5.5-5.10 25个小时 200行 对相对复杂的问题,合理定义程序的多函数结构;使用递归函数进行编程;宏的基本用法;编译预处理的概念 对递归函数的实现步骤总是很模糊
5.10-5.17 8个小时 100行 二级指针的概念,指针数组的应用;指针与函数的关系,指针作为函数返回值,单向链表的概念和操作(建立、增加、删除、修改、遍历) 在链表的使用中,p->next和p->code[1](code是结构的成员变量)表示的是同类的值吗
时间 累计代码行数 累计博客字数
第一周 80 0
第二周 150 400
第三周 250 1600
第四周 380 3200
第五周 580 5110
第六周 680 8110
第七周 830 10910
第八周 950 13510
第九周 1070 17210
第十一周 1270 20745
第十二周 1370 23232

posted @ 2019-05-17 21:05  LeeMayZ  阅读(268)  评论(1编辑  收藏  举报