第三次作业(第二学期)

作业要求一 (20分)

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

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


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


3)一道编程题:

作业要求二(65分)

题目6-1 输出月份英文名

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:简单的根据所给数字输出其对应的月份英文,故要先判断其月份是否有效。
第二步:有效月份进入switch语句,根据数值返回相应字符串。

(2)流程图(4分)
2.实验代码(2分)

char *getmonth( int n )
{   
    
	if(n>12||n<1)
	{return 0;
	}
	else
	{
		switch (n)
		{case 1:return "January" ;
		 case 2:return "February"  ;
		 case 3:return "March";
		 case 4:return "April" ;
	 	 case 5:return "May" ;
		 case 6:return "June" ;
		 case 7:return "July";
		 case 8:return "August";
		 case 9:return "September";
		 case 10:return "October";
	     case 11:return "November";
		 case 12:return "December" ;
		}
	}
 } 

3.本题调试过程碰到问题及解决办法(4分)

题目6-2 查找星期

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:定义指针数组将各星期英文名进行储存。
第二步:从星期天开始依次比较字符串,若找到相同字符串,返回下标。
第三步:若没找到相同字符串则在循环结束后返回-1。

(2)流程图(4分)

2.实验代码(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)
     {
	 return i;
		 }	
	}
	return -1;
	
}

3.本题调试过程碰到问题及解决办法(4分)

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

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:将第一条字符串的长度作为max的值与后续字符串长度进行比较。
第二步:如果max小于某字符串长度则将该字符串长度赋值给max。
第三步:如果max值大于该字符串长度,则继续与下一字符串进行比较。
第四步:循环结束,返回max。

(2)流程图(4分)
2.实验代码(2分)

int max_len( char *s[], int n )
{   int i;
    int t;
    int length;
	int max=strlen(s[0]);
	for(i=0;i<n;i++)
	{ length=strlen(s[i]);
	if(max<length)
	{
		t=length;
		length=max;
		max=t;
	}
	}
	
	return max;	
 } 

3.本题调试过程碰到问题及解决办法(4分)

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

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:首先识别题目所给的2个字符,对其是否出现进行标记,并记录下其下标。
第二步:根据其字符出现情况进行判断语句。
第三步:若未识别到开始字符,则直接输出换行并返回空。
第四步:若只识别到开始字符,则从开始字符输出到结束,并返回所输出的这些字符。
第五步:若识别到起始与结束字符,则输出包括其在内的字符,并返回从开始字符到结尾的所有字符。

(2)流程图(4分)
2.实验代码(2分)

char *match( char *s, char ch1, char ch2 )
{   int i,m=0;
    char *q;
    int mark=-1,flag=-1;
    int biaoji1=0,biaoji2=0;
   for(i=0;;i++)
   {if(*(s+i)=='\0')
   {break;
   }
   if(*(s+i)==ch1&&mark==-1)
   {mark=i;
   }
   if(*(s+i)==ch2)
   {if(biaoji2!=1||i<biaoji1)
   { flag=i;
   biaoji2=1; 
   biaoji1=flag;
   }
  }
   }
   if(mark==-1)
   {
   	printf("\n");
   	*s='\0';
   return s;
   }
   if(mark!=-1&&flag!=-1)
   {
   	for(i=mark;i<=flag;i++)
   	{
		   if(i==flag)
		   {printf("%c\n",*(s+i));
		   }
	  else
	  {   printf("%c",*(s+i));
	  } 
	   }
   	return (s+mark);
   }
   if(mark!=-1&&flag==-1)
   {
   	printf("%s\n",(s+mark));
   	return (s+mark);
   }
}

3.本题调试过程碰到问题及解决办法(4分)
我认为PTA代码的审核标准并不完善。例如ch1等于ch2,ch2前后出现2次等情况。

6-1 奇数值结点链表

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:分别创建2个新的链表。
第二步:通过识别所给链表各数值的奇偶性,将其给至不同的链表。
第三步:返回2个链表的头结点。

(2)流程图(4分)
2.实验代码(2分)

struct ListNode *readlist()
{  int i;
   struct ListNode *head=NULL,*t,*end;
   
   for(i=0;;i++)
  {t=(struct ListNode*)malloc(sizeof(struct ListNode)); 
  scanf("%d",&t->data);
  	if(t->data==-1)
	{end->next=NULL;
	
	break;
	}
	if(head==NULL)
  {
  head=t;
 end=t;
  }
else
{end->next=t;
end=t;
}

    } 
	return head; 
    }
struct ListNode *getodd( struct ListNode **L )
{  struct ListNode *start1,*a,*b,*c,*start2;
    a=*L;
	start1=(struct ListNode*)malloc(sizeof(struct ListNode));
	start2=(struct ListNode*)malloc(sizeof(struct ListNode));
	start1->next=NULL;
	start2->next=NULL;
	b=start1;
	c=start2;
    for(;;)
    {
	if(a==NULL)
	{
	break;
	}
	if(a->data%2!=0)
	{
	b->next=a;
	b=a;
	}
	else
	{
	c->next=a;
	c=a;
	}
	a=a->next;
    
	}
	c->next=NULL;
	 b->next=NULL;
	*L=start2->next;
	return start1->next;
}

3.本题调试过程碰到问题及解决办法(4分)
问题:我的第一个思路是仅创建一个新链表,将偶数剥离出来。并让留下的奇数作为一个链表。遇到了段错误的问题。
解决方法:创建2个新链表。

6-2 学生成绩链表处理

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:建立链表,通过循环进行赋值。当序号为0时,使链表最后一个节点指向空。
第二步:输入条件值。
第三步:遍历链表,对每个低于条件值的节点进行删除。
第四步:返回删除操作后的链表头结点。

(2)流程图(4分)


2.实验代码(2分)

struct stud_node *createlist()
{
	struct stud_node *head=NULL,*t,*end;
	head=(struct stud_node*)malloc(sizeof(struct stud_node));
	end=head;
	for(;;)
	{ t=(struct stud_node*)malloc(sizeof(struct stud_node));
		scanf("%d",&t->num);	
		if(t->num==0)
		{
		break;
		}
		scanf("%s",t->name);
		scanf("%d",&t->score);
	
		if(head==NULL)
		{head=t;
		end=t;
		}
		else
		{end->next=t;
		end=t;
		}	
	}
	end->next=NULL;
return head;
 } 
 struct stud_node *deletelist( struct stud_node *head, int min_score )
 {
 	struct stud_node *a=head,*b=head;
 	for(;;a=a->next)
 	{   if(a==NULL)
 	    {break;
	     }
 		if(a->score<min_score)
 		{if(a==head)
 		{head=a->next;
		free(a);
 		}
		 else
		 {
		 b->next=a->next;
		  free(a);
		 }
		 }
		 else
		 {b=a;
		 }
 		
	 }
	 return head;
 }

3.本题调试过程碰到问题及解决办法(4分)
某个知识点识别出段错误,通过手动分配内存解决。

6-3 链表拼接

1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:将链表1,2各值分别赋值给一数组。
第二步:通过对数组排序得到有序数组。
第三步:将数组各元素赋值回一个新链表。
第四步:返回链表头结点。

(2)流程图(4分)
2.实验代码(2分)

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
    int num = 0;
    int temp[100];
    struct ListNode  *p = list1;
    while(p != NULL)
    {
        temp[num] = p->data;
        num++;
        p = p->next;
    }
    p = list2;
    while(p != NULL)
    {
        temp[num] = p->data;
        num++;
        p = p->next;
    }
    int i,j;
    for(i = 0; i < num; i++)
        for(j = i + 1; j < num; j++)
        {
            if(temp[i] > temp[j])
            {
                int t;
                t = temp[i];
                temp[i] = temp[j];
                temp[j] = t;
            }
        }
      struct ListNode  *newlist = NULL;
      struct ListNode  *endlist = NULL;
      struct ListNode  *q;
      for(i = 0; i < num; i++)
      {
          q = (struct ListNode  *)malloc(sizeof(struct ListNode));
          q->data = temp[i];
          if(newlist == NULL)
          {
              newlist = q;
              newlist->next = NULL;
          }
            if(endlist != NULL)
         {
            endlist->next = q;
         }
         endlist = q;
         endlist->next = NULL;
      }
      return newlist;
}

 

3.本题调试过程碰到问题及解决办法(4分)
问题:我的第一个想法并没有使用数组,而是拿第二个链表的各值与链表1作比较,进行插入操作。修改的3,4个版本皆无法得到全对。遇到过答案错误,运行超时与段错误。原因未知。从调试看来,我对不同情况的插入操作考虑欠佳。
解决方法:选择了通用性强,思路清晰简单更熟悉的方法。即通过转入数组进行排序。


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

1、总结两周里所学的知识点,回答下列问题?(用自己的话表达出你的理解,网上复制粘贴没有分数)(5分)

如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
指针数组即数组中各元素类型为指针。指针数组也是数组的一种,可以用二维指针表示。 一维数组和一维指针可以相互转换使用,二级指针同理。

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


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

用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
无需知道每个字符串的长度。 不可以,未初始化的指针数组可能指向不可用的地址,以致发生错误。

2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
地址:https://git.coding.net/Donahue_Xu/The-Third-Homework2.git
截图:

3、点评3个同学的本周作业
刘炜旗:
赵寅胜:http://www.cnblogs.com/2017023960ZYS/p/8759455.html

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

折线图:

posted on 2018-04-22 19:50  徐铭博  阅读(304)  评论(3编辑  收藏  举报

导航