zoukankan      html  css  js  c++  java
  • 第三次作业(第二学期)

    作业要求一 (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)=='')
       {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("
    ");
       	*s='';
       return s;
       }
       if(mark!=-1&&flag!=-1)
       {
       	for(i=mark;i<=flag;i++)
       	{
    		   if(i==flag)
    		   {printf("%c
    ",*(s+i));
    		   }
    	  else
    	  {   printf("%c",*(s+i));
    	  } 
    	   }
       	return (s+mark);
       }
       if(mark!=-1&&flag==-1)
       {
       	printf("%s
    ",(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分)
    表格:

    折线图:

  • 相关阅读:
    .Net 更容易的使用配置文件 SuperConfig
    .Net 5分钟搞定网页实时监控
    记一次sql server 性能调优,查询从20秒至2秒
    [asp.net mvc 奇淫巧技] 05
    [asp.net mvc 奇淫巧技] 04
    [asp.net mvc 奇淫巧技] 03
    [asp.net mvc 奇淫巧技] 02
    ECharts 实现人民的名义关系图谱 代码开源
    C# 快速高效率复制对象另一种方式 表达式树
    Asp.net SignalR 应用并实现群聊功能 开源代码
  • 原文地址:https://www.cnblogs.com/xmb1547828350/p/8764221.html
Copyright © 2011-2022 走看看