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分)

    表格

    折线图

  • 相关阅读:
    java基础>I/O 小强斋
    动态查找>红黑树(RedBlack Tree) 小强斋
    java基础>I/O 小强斋
    动态查找>红黑树(RedBlack Tree) 小强斋
    1-N的自然数中,少了一个,找出这个数 小强斋
    oracle数据库导入导出 小强斋
    找出N个整数中最大的K个数 小强斋
    找出N个整数中最大的K个数 小强斋
    oracle数据库导入导出 小强斋
    2013长沙全国邀请赛总结
  • 原文地址:https://www.cnblogs.com/sun031915/p/8836088.html
Copyright © 2011-2022 走看看