2019春第十二周作业

2019春第十二周作业

这个作业属于哪个课程 C语言程序设计Ⅱ
这个作业要求在哪里 第十二周作业
我在这个课程的目标是 能够使用c语言实现基本的程序设计,以至最后能够设计出较大的项目
这个作业在哪个具体方面帮助我实现目标 学习指针的进阶,指针函数、函数指针、指针数组、数组指针等
参考文献 C语言程序设计(第3版); C Primer Plus (第6版)

一、本周完成的作业

题目1. 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 a=0,i;
    for (i=0; i<n; i++) {
        if (strlen (*(s+i)) > a)
            a = strlen (*(s+i));
    }
    return a;
}

2)、设计思路

3)、本题调试过程碰到的问题及解决方法

4)、运行结果图

题目2. 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 sum=0;
    while (head!=NULL) {
        if (head->code[1]=='0'&&head->code[2]=='2')
            sum++;
        head=head->next;
    }
    return sum;
}

2)、设计思路

3)、本题调试过程碰到的问题及解决方法

4)、运行结果图

题目3. 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()
{
	int n;
  struct ListNode *head=NULL,*tail=NULL,*t=NULL;
  scanf("%d",&n);
  while(n!=-1)
  {
    t=(struct ListNode *)malloc(sizeof(struct ListNode));
    t->data=n;
    t->next=NULL;
    if(head == NULL) 
	   head=t;
    else 
	   tail->next=t;
       tail=t;
       scanf("%d",&n);
  }
  return head;
}
struct ListNode *deleteeven( struct ListNode *head )
{
  struct ListNode *a=NULL,*b=NULL;
  for(a = head; a != NULL; a = a->next)
  {
    if(a->data%2 == 0)
    {
      if(a == head)
      {
        head = head->next;
        free(a);
      }
      else 
      {
        b->next = a->next;
        free(a);
      }
    }
    else 
	   b = a;
  }
  return head;
}

2)、设计思路


3)、本题调试过程碰到的问题及解决方法

这道题本来不怎么会,还好周五补课,老师又重点讲了链表的知识。听懂了很多,比之前好很多,虽然再看题目任然有点不懂,但已经好多了,借鉴时,看大佬代码也起码能看懂,由于对链表这一块实在不怎么会,所以感觉自己写的话,很难写出来。
另外还看到了一个之前不怎么知道的知识点,“data”,如图,

4)、运行结果图

预习作业

名称:双人飞机对战
目标:两个人的对战游戏,控制两台飞机用子弹攻击对方,并闪避对方的子弹。
项目主体功能: 1. 飞机控制
2..子弹发射
3.击中对方
4.障碍物的产生,与击毁
5.子弹升级
现阶段已做的准备工作:团队协商、任务分配
小组成员名单:陈安平、刘凯、宋官昊。
任务进度:前期准备

学习进度条

周/日期 这周所花的时间 代码行数 学到的知识点简介 目前比较迷惑的问题
3/2-3/8 三天六小时 50 1、定义、运用文件指针;2、如何打开、关闭文件3、如何读出指定文件中的数据;4、如何向指定文件中写入数据; 字符、字符串有什么区别?二者输入、输出有没有很大不同?什么才算字符串?什么算字符?在文件中二者有没有差别?
3/9-3/15 四天三小时 180 1、运用二维数组解决问题,矩阵的判断;2、对一组数的所有子数组求和 如何在输出时利用数组的性质
3/16-3/22 三天八小时 210 1、二维数组加深理解,二维数组与矩阵;2、选择排序法解决问题;3、二分查找法 二分查找法这周没练习,只是看看书上例题大致懂了,不知道真正应用时能否掌握。
3/23-3/29 三天两小时 120 1、判断回;文2、字符数组的概念及其简单运用;3、一些简单的与字符数组相关的暂时没接触补充知识,一些函数,用法等。 在作业运用文件指针时,一开始总是出现从文件里输不出来结果,打印不出来,后来发现可能与自己输入时格式未搞好,本来不应该出现的空格出现了,导致打印不出来结果。文件指针还不是很熟练
3/30-4/5 两天 150 1、指针的含义,变量、地址、指针变量等间的关系;2、指针变量的初始化,运用指针做一些简单运算;3、指针与数组之间的关系 在用指针处理字符串时,应怎样定义指针变量
4/6-4/12 三天 200 1、更深一步掌握指针与数组间的关系;2、懂得指针可以实现数组的一些功能;3、指针在碰到字符数组时的应用 在代码中,如果遇到要输出单个字符,%s与%c有什么区别? scanf()与 getchar 两种输入方式有区别吗?会不会在有些情况下能影响到输出结果?
4/13-4/19 两天 170 1、学习了与字符串有关的一些字符串处理函数;2、学习了利用指针实现内存动态分配 究竟什么情况下采用内存动态分配?具体要采用哪一种动态内存分配?
4/20-4/26 两天 135 1、学习了结构及结构变量的定义与运用 如果运用递归函数解决问题,虽然使代码简化了,更美观了。但会导致相同的运算重复进行,占内存。感觉递归弊大于利。
4/27-5/3 一天 1、复习了结构与数组、指针间的关系,两者之间是如何进行替换利用;
5/4-5/10 三天 165 1、学习了递归程序的设计;2、宏的基本定义;3、文件包含等内容; 链表知识点看了看,不是很懂
5/11-5/17 三天 148 1、学习了指针函数、函数指针、指针数组、数组指针;2、讲了链表的部分知识。 链表不是很会,可能是书看的少了

三、学习感悟

感觉这周的课就有点难度了,前面几周写的时候都很轻松,突然碰到这些比较难的东西,吃不消。感觉只凭老师上课讲的话,远远不够啊,自己下去也要在抽空看书,而且如果课前能够预习,提前对这些知识有一点概念,就会轻松很多。题目方面,前两题一开始没有很大难度,就是第三题链表,不是很懂,就托了一天。

结对编程感想

结对时,队友题目还没怎么写,而我只能在前两题上面给予他帮助。然后两个人针对第三题,先是瞎讨论了一番,发现并不会,然后看看书,最后还是看了别人的代码,看了看,有的写得很超前,看不懂,有的能看懂,不怎么理解,总之慢慢搞吧。

表格-折线图

时间 累计代码行数 累计博客字数
第一周 80 275
第二周 50 883
第三周 180 1303
第四周 210 1849
第五周 120 1988
第六周 150 2717
第七周 200 3000
第八周 170 2820
第九周 135 2855
第十周 3945
第十一周 165 4934
第十二周 148 2654

posted @ 2019-05-17 20:56  编号9527·  阅读(297)  评论(0编辑  收藏  举报