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

    作业要求一 (20分)

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


    (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的全部质数。

    2.实验代码(2分)

    #include <stdio.h>
    int main ()
    {
        int a=201,b=3945;
        int *p = (int *)malloc((a*b) *sizeof(int));
        int *q = (int *)malloc((a*b) *sizeof(int)); 
        int i=0,j;
       for(i=0;i<(a*b);i++)
      {
         p[i] = i+1;
        }
        for(i=0;i<(a*b);i++)
     {
        for(j = i+1;j<=(a*b);j++) 
    	{
            if((p[i] !=1) && ( p[j] != 1) ){
                if(p[j]%p[i] ==0) 
    			{
                        p[j] = 1;
                    }
                }
            }
        }
        j=0;
        for(i=0;i<(a*b);i++) 
        {
            if(p[i] != 1)
        	     {
                printf(" %d",p[i]);
                j++;
            } 
            if(j == 5)
    	     {
                printf("
    ");
                j=0;
            }
        }
    }
    

    作业要求二(65分)

    6-1 输出月份英文名

    1.设计思路(6分)

    第一步:本题要求通过字符串指针实现函数,可以返回一个给定月份的英文名称。
    第二步:定义整形变量n,通过switch语句,判断每一条语句,如果是就按数字输出月份,否则执行default,输出NULL
    第三步:按要求返回主函数并输出。

    2.实验代码(2分)

    部分代码:

     char *getmonth( int n )
    {
        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";
    	    default:return NULL;
         } 
    } 
    

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

    错误原因:n=i时的返回值取地址错误
    改正方法:改为*(month+i-1)即可,为第n-1行首元素的地址

    6-2 查找星期(15 分)

    1.设计思路(6分)

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

    2.实验代码(2分)

    部分代码

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

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

    6-3 计算最长的字符串长度(15 分)

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步:遍历s数组,运用strlen函计算出每行元素的长度。利用for循环遍历数组,使用strlen函数求出每个字符串的长度,max最初为首个字符串的长度,遇到比它长的就把len赋给
    max。
    第二步:定义循环变量i,最大值max和长度len。
    第三步:返回max的值。
    (2)流程图(4分)

    2.实验代码(2分)

    部分代码

    int max_len( char *s[], int n )
    {
        int a,c=0,b,q[20]={0};
        for(a=0;a<n;a++)
        {
    	    for(b=0;*(*(s+a)+b)!='';b++)
    	    {}
    	    q[a]=b;
        }
        c=q[0];
        for(a=0;a<n;a++)
        {
    	    if(q[a]>c)
    	    {
    		    c=q[a];
    	    }
        }
        return c;
    } 
    

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

    遇到的问题:指针((s+i)+j)!=''弄错了
    改正方法:应该是用指针的指针来判断。

    6-4 指定位置输出字符串(20 分)

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步:先遍历s字符数组,找到与ch1相同时s的下标,并将下标值赋给一个整型变量,定义为b。
    第二步:在确定下标后,定义一个指针字符c,将&s[i]赋给c,后跳出循环。
    第三步:从上面的j开始,循环字符数组s,在循环中分情况,若(s+a) != ch2,则输出(s+a),反之则输出*(s+a)加换行,且返回c。

    2.实验代码(2分)

    部分代码

    char *match( char *s, char ch1, char ch2 )
    {
        int a,b;
        for(a=0;*(s+a)!='';a++)
        {
    	    if(*(s+a)==ch1)
    	    {
    	      char *c=  &s[a];
    		    for(b=a;(*(s+b)!=ch2)&(*(s+b)!='');b++)
    		    {
    			    printf("%c",*(s+b));
    		    }
    		    if(*(s+b)!='')
    		    printf("%c",*(s+b));
    		    printf("
    ");
    		    return c;
    	    }
        }
        printf("
    ");
        return s+a;
    }
    

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

    遇到的问题:%c输出的应该是指针(s+i),而不是s+i
    改正方法:将s+i改成
    (s+i),程序运行成功。

    6-1 奇数值结点链表(20 分)

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步:在struct ListNode *readlist函数中,将输入的值存储在链表里,且用while循环时条件为输入的值不为-1,在while循环内对p进行动态分配,切记在完全输入以后,末尾结点
    的next为空,返回链表的头结点。
    第二步:在getodd函数中,根据要求对链表结点中date的值进行分类判断,将数值为偶数的date存储在一个新的链表中,另将为奇数的存储在一个新的列表中。
    第三步:需考虑若最后新建链表有可能为空的情况。最后按照要求返回要求链表的头结点。
    (2)流程图(4分)

    2.实验代码(2分)

    部分代码

        struct ListNode *readlist()
    {
        int number;
        struct ListNode *p = NULL,*head = NULL,*tail = NULL;
        scanf("%d",&number);
        while(number!=-1 && number>0 ) 
        {
            p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->data = number;
            if(head == NULL) 
            {
                head = p;
            } else 
            {
                tail->next = p;
            }
            tail = p;
            scanf("%d",&number); 
        }
        if(head == NULL) 
        {
            return NULL;
        } 
        tail->next = NULL;
        return head;
    }
    struct ListNode *getodd( struct ListNode **L )
    {
      struct ListNode *p = *L,*head1 = NULL,*r = NULL,*r1 = NULL,*L1 = NULL;
      while(p!=NULL&&p->data>0) 
      {
        if(p->data%2!=0)
        {
            if(head1 == NULL) 
            {
                head1 = p;
            } else 
            {
                r->next = p;
            }
            r = p;
        } else 
        {
            if(L1 ==NULL) 
            {
                L1 = p;
            } else 
            {
                r1->next = p;
            }
            r1 = p;
        }
        p = p->next;
      }
      if(head1==NULL)
      {
        return NULL;
      } else 
      {
        r->next = NULL;
      }
      if(L1==NULL) 
      {
        *L = NULL;
      } else 
      {
        r1->next = NULL;
       *L = L1; 
      }
        return head1;
    }
    

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

         课程学习过程中,对链表的结构,表示很不清晰。
         改正方法:询问同学后才明白。
    

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

    6-1 奇数值结点链表

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步:在struct stud_node *createlist() 函数中将输入的学号,姓名和分数存储到链表中,while循环的条件为学号不为0,因当学号为0时不需要输入姓名及分数,即结束,因此需
    明确必须在判断学号不为0的情况下才可以输入姓名和成绩,返回链表的头结点。
    第二步:在deletelist函数中遍历链表的结点,若结点中的分数小于规定的值则释放此结点的内存,需注意若最终结点全被释放完内存,即返回的头结点为空的情况。
    第三步:将判断后链表的头结点返回主函数。
    (2)流程图(4分)


    2.实验代码(2分)

    struct stud_node *createlist() 
    {
     int num,score;
     char name[20]; 
     struct stud_node *p,*head=NULL,*tail=NULL;
     p = (struct stud_node*)malloc(sizeof(struct stud_node));
     scanf("%d",&num);
    
     while (num != 0)
        {
            p = (struct stud_node *)malloc (sizeof (struct stud_node));
            scanf ("%s %d", p->name, &p->score);
            p->num = num;
        
            if (head == NULL)
                head = p;
            else
                tail->next = p;
            tail = p;
            scanf ("%d", &num);
        }
        return head;
    }
    struct stud_node *deletelist( struct stud_node *head, int min_score )
    {
      struct stud_node *L=head,*head1=NULL,*tail1=NULL;
      while(L!=NULL) 
      {
        if(L->score>=min_score)
      {
        if(head1==NULL) 
        {
            head1 = L;
           } else 
           {
            tail1->next = L;
           }
           tail1 = L;
      } else
      {
    
       }
       L=L->next;
      }
      if(head1==NULL) {
        return NULL; 
      } else 
      {
        tail1->next =NULL;
      }
      return head1;
    } 
    

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

    未在readList子函数中加上tail->next = p.
    改正方法:加上了tail->next = p。

    6-2 学生成绩链表处理(20 分)

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步:在createlist函数中将输入的学号,姓名和分数存储到链表中,while循环的条件为学号不为0,因当学号为0时不需要输入姓名及分数,即结束,因此需明确必须在判断学号不为0的情况下才可以输入姓名和成绩,返回链表的头结点。
    第二步:在deletelist函数中遍历链表的结点,若结点中的分数小于规定的值则释放此结点的内存,需注意若最终结点全被释放完内存,即返回的头结点为空的情况。
    第三步:将判断后链表的头结点返回主函数。
    (2)流程图(4分)

    2.实验代码(2分)

    struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) 
    {
       struct ListNode *p1=list1;
         int length=0;
         int array[100];
         for(p1=list1;p1!=NULL;p1=p1->next) 
         {
            array[length] = p1->data;
             length++;
         } 
         p1=list2;
         for(;p1!=NULL;p1=p1->next)
         {
            array[length] = p1->data;
             length++;
         } 
         int i,j,t;
         for(i=0;i<length-1;i++)
         {
            for(j=i+1;j<length;j++)
            {
                if(array[j]<array[i]) 
                {
                  t =array[j];
                  array[j]=array[i];
                  array[i] = t;
                 }
             }
         }
         struct ListNode *q,*head1 = NULL,*tail1=NULL;
         i=0;
         while(i<length) 
         {
            q = (struct ListNode *)malloc(sizeof(struct ListNode));
            q->data = array[i];
             if(head1 == NULL) 
             {
                head1 = q;
            } else 
            {
                tail1->next = q;
            }
             tail1 = q; 
             tail1->next = NULL;
             i++; 
      }
         return head1;
    }  
    

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

    在函数deletelist中while循环的结束后,忘记加tail1->next =NULL
    改正方法:加上tail1->next =NULL。

    6-3 链表拼接(20 分)

    1.设计思路(6分)

    (1)主要描述题目算法(2分)
    第一步: 根据题目要求,题目是进行链表排序,定义一个数组,先将链表里的数据储存在数组中,通过数组进行排序操作;
    第二步:数组排序完之后,再通过for语句遍历;
    第三步:把数组里的值重新赋给链表;

    2.实验代码(2分)

      struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) 
       {
       struct ListNode *p1=list1;
       int length=0;
       int array[100];
       for(p1=list1;p1!=NULL;p1=p1->next) 
        {
        array[length] = p1->data;
         length++;
        } 
        p1=list2;
        for(;p1!=NULL;p1=p1->next)
         {
          array[length] = p1->data;
         length++;
         } 
         int i,j,t;
         for(i=0;i<length-1;i++)
         {
           for(j=i+1;j<length;j++)
           {
              if(array[j]<array[i]) 
              {
              t =array[j];
              array[j]=array[i];
              array[i] = t;
               }
            }
          }
           struct ListNode *q,*head1 = NULL,*tail1=NULL;
          i=0;
           while(i<length) 
          {
           q = (struct ListNode *)malloc(sizeof(struct ListNode));
           q->data = array[i];
            if(head1 == NULL) 
           {
            head1 = q;
           } else 
           {
                tail1->next = q;
            }
             tail1 = q; 
             tail1->next = NULL;
             i++; 
      }
         return head1;
    } 
    

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

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

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

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

    答:指针数组是存放指针的数组,即是数组的形式,但数组中的元素为指针,而指针又叫指针变量是存放指针的变量,即存放地址的变量;二级指针可以对指针数组的地址进行操作。

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

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

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

    答:当每个字符串长度不同时,可以节省空间,而且不易出现内存分配问题。不可以。因为未初始化的指针可能会指向一些不确定的地址。

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

    截图

    git地址:(https://git.coding.net/smj031915/dexqdcczy.git)

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

    董雅洁:(http://www.cnblogs.com/exo123/p/8798720.html)
    王姝雯:(http://www.cnblogs.com/phsudie/p/8759331.html)
    张心悦:(http://www.cnblogs.com/zxy980612/p/8858885.html)

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

    表格

    折线图

  • 相关阅读:
    C#深入浅出 修饰符(二)
    HDU 5785 Interesting
    HDU 5783 Divide the Sequence
    HDU 5781 ATM Mechine
    UVA 714 Copying Books
    uva 1471 Defense Lines
    UVA 11134 Fabled Rooks
    UVA 11572 Unique Snowflakes
    UVA 11093 Just Finish it up
    UVA 10954 Add All
  • 原文地址:https://www.cnblogs.com/sun031915/p/8836088.html
Copyright © 2011-2022 走看看