2018第三次作业。

未来两周学习内容

  • 指针数组
  • 指向指针的指针
    • 用指针数组处理多个字符串
  • 命令行参数
  • 指针作为函数的返回值
  • 链表
    • 链表的概念
    • 链表的常用操作

作业要求一 (20分)

完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里,一次PTA作业任选一道题目给出设计思路、流程图、源代码和错误记录,其他题目可只给出设计思路、源代码和错误记录。另外将每次PTA作业的提交列表贴在博客里,每次5分。

1)C高级第三次PTA作业(1)

6-1 输出月份英文名

实验代码

char *getmonth( int n )
{
    char *month;
    char *mon[12] = {"January","February","March","April","May","June","July","August","September","October","November","December" };
    month = NULL;
    if(n <= 0 || n > 12)
        return month;
    month = mon[n - 1];
    return month;
}

设计思路

第一步:将十二个月的名称分别赋值给一维数组指针,定义用于返回的数据类型。
第二步:遍历数组,满足若n在(1-12)范围则将month第n-1行的首元素的地址赋给一开始定义的数据。
第三步:返回变量的地址值。
 
流程图

6-2 查找星期

实验代码

int getindex( char *s )
{
  int i;  
  char *a[7]= { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };  
  for (i = 0; i < 7; i ++)  
    {  
        if (strcmp(s, a[i]) == 0) 
        break;  
    }  
  if (i == 7)
   i = -1;  
  return i;  
}

设计思路

第一步:将一个星期每天的英文分别赋值给一维数组指针,定义一个整型变量,赋初值为0。
第二步:遍历一维数组,用strmcp函数比较数组中每行元素与输入的字符串是否相同,若相同,则令此时的行数等于一开始定义的整型变量,且跳出循环。
第三步:返回整型变量值。

6-3 计算最长的字符串长度

实验代码

int max_len( char *s[], int n )
{
  int a[n],i,k,max = 0;
  for(i = 0;i < n;i ++)
  {
      char *b = s[i];
    for(k = 0;;k ++)
    {
      if(b[k] == '\0')
      {
      a[i] = k;
      break;
      }
    }
    if(a[max] < a[i])
    max = i;
  }
  return a[max];
}

设计思路

第一步:s数组,计算出每行元素的长度。
第二步:在for循环中进行比较,定义int型max,赋初值为0,当行元素的长度大于max,则将长度的值赋给max。
第三步:返回max的值。

6-4 指定位置输出字符串

实验代码

char *match( char *s, char ch1, char ch2 )
{
    int i = 0,k;
    for(;s[i] != 0;i ++)
    {
        if(s[i] == ch1)
        {
            for(k = i;s[k] != 0;k ++)
            {
                printf("%c",s[k]);
                if(s[k] == ch2)
                break;
            }
            printf("\n");
            return s+i;
        }
    }
  printf("\n");
    *s = '\0';
  return s;
} 

设计思路

第一步:先遍历s字符数组,找到与ch1相同时s的下标,并将下标值赋给一个整型变量,定义为j。
第二步:在确定下标后,定义一个指针字符s,将&s[i]赋给s,后跳出循环。
第三步:从上面的j开始,循环字符数组s,在循环中分情况,若s[i] != ch2,则输出s[i],反之则输出s[i]加换行,且返回temp。
第四步:循环结束后,输出换行及返回s。

2)一道编程题:

有一个axb的数组,该数组里面顺序存放了从1到a*b的数字。其中a是你大学号的前三位数字,b是你大学号的后四位数字,比如你的学号是2017023936,那么数组大小是201 x 3936,数组中顺序存放了1到791136(201和3936的积)的整数. 要求用筛选法,把该数组里的质数找出并打印出来,打印格式为5个质数一行,数字间用空格隔开。

筛选法具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

 

 

3)C高级第三次PTA作业(2)

6-1 奇数值结点链表

实验代码

struct ListNode *readlist()
{
  struct ListNode *p,*head,*n;
  head=(struct ListNode*)malloc(sizeof(struct ListNode));
  n=head;
  while(1)
  {
      p=(struct ListNode*)malloc(sizeof(struct ListNode));
      scanf("%d",&p->data);
    if(p->data==(-1))
    break;
    n->next=p;
    n=p;
  }
  n->next=NULL;
  return head->next;
}
struct ListNode *getodd( struct ListNode **L )
{
  struct ListNode *i,*j,*k,*h1,*h2;
  j=h1=(struct ListNode*)malloc(sizeof(struct ListNode));
  h1->next=NULL;
  k=h2=(struct ListNode*)malloc(sizeof(struct ListNode));
  h2->next=NULL; 
  i=*L;
  int n=0;
  for(;i;i=i->next)
  {
    if((i->data)%2==1)
    {
    j->next=i;
    j=i;
    }
    else
    {
    k->next=i;
    k=i;
    }
  }
  j->next=NULL;
  k->next=NULL;
  *L=h2->next;
  return h1->next;
}

设计思路

第一步:分别创建2个新的链表。
第二步:通过识别所给链表各数值的奇偶性,将其给至不同的链表。
第三步:返回2个链表的头结点。

6-2 学生成绩链表处理

实验代码

struct stud_node *createlist()
{
  struct stud_node *p,*head,*n;
  head=(struct stud_node*)malloc(sizeof(struct stud_node));
  n=head;
  while(1)
  {
      p=(struct stud_node*)malloc(sizeof(struct stud_node));
      scanf("%d ",&p->num);
      if(p->num==0)
    break;
    scanf("%s %d",&p->name,&p->score);
    n->next=p;
    n=p;
  }
  n->next=NULL;
  return head->next;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
    struct stud_node *p,*k;
    p=(struct stud_node*)malloc(sizeof(struct stud_node));
    k=p;
    for(;head;head=head->next)
    {
        if((head->score)>=min_score)
        {
            k->next=head;
            k=head;
        }
    }
    k->next=NULL;
    return p->next;
}

设计思路

第一步:建立链表,通过循环进行赋值。若序号为0时,使链表最后一个节点指向空。
第二步:输入条件值,在链表中,对每个低于条件值的节点进行删除。
第三步:返回删除操作后的链表头结点。

6-3 链表拼接

实验代码

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
    struct ListNode *h,*p,*i,*k;
    h=(struct ListNode*)malloc(sizeof(struct ListNode));
    p=h;
    i=list1;
    k=list2;
    while(i!=NULL&&k!=NULL)
    {
        if(i->data<k->data)
        {
            p->next=i;
            i=i->next;
        }
        else
        { 
            p->next=k;
            k=k->next;
        }
        p=p->next;
    }
    while(i)
    {
        p->next=i;
        i=i->next;
        p=p->next;
    }
    while(k)
    {
        p->next=k;
        k=k->next;
        p=p->next;
    }    
    p->next=NULL;
    return h->next;
}

设计思路

第一步:将链表1,2各值分别赋值给一数组。
第二步:通过对数组排序得到的有序数组,将数组各元素赋值回一个新链表。
第三步:返回链表头结点。

要求三、学习总结和进度(15分)

1、总结两周里所学的知识点,回答下列问题?

     (1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?

     (2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。

     (3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?

2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。

GIT: https://git.coding.net/ShiWithZhou/HI.git

3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。

董雅洁 http://www.cnblogs.com/exo123/p/8798720.html

莯菸 http://www.cnblogs.com/sun031915/p/8836088.html

揆空 http://www.cnblogs.com/zxy980612/p/8858885.html

4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间

 

 

posted @ 2018-04-22 11:11  shilcz  阅读(393)  评论(7编辑  收藏  举报