zoukankan      html  css  js  c++  java
  • 第3次作业

    作业要求一

    请将pta作业编程题目的解题思路和调试过程记录在博客中,每道题目的具体格式如下:

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

    1.设计思路

         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),如:
             第一步:定义月份对应的指针数组与整形变量i
             第二步:用for循环遍历数组
             第三步:if条件语句用来判断不同条件下的返回值并输出    

        (2)流程图

    2.实验代码

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

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

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

    6-2 查找星期

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:定义整形变量 i 和星期对应的指针数组
             第二步:利用for循环遍历数组
             第三步:用if语句与strcmp函数进行分类讨论,当查找到相应元素时返回整形变量值

    2.实验代码

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

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

          错误信息:
           错误原因:输入函数接口定义时在后方加了多余的分号" ; "
           改正方法:通过dev-c++提醒找出,低级错误


      

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

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:定义两个整形变量 i,l
             第二步:用for循环遍历数组
             第三步:if语句中调用strlen函数进行计算并比较,最后返回 l 值

    2.实验代码

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

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

          错误信息:无


     

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

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:定义整形变量i,j,通过一个for循环将ch1的值赋给*(s+i)
             第二步:设计一个指针变量,判断*(s+j)!的值

             第三步:整体遍历后,输出并返回(s+i)的值

    2.实验代码

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

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

          错误信息:
           错误原因:函数接口定义编写错误,导致代码无法正常编译
           改正方法:改变思路并改正定义,用一个for循环和if语句进行遍历和输出

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

    #include <stdio.h>
    int main ()
    {
        int a=201,b=3947;
        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;
            }
        }
    }

    6-1 奇数值结点链表

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:定义整形变量n,在readlist函数中,将输入的值存储在链表里,在while循环内对p进行动态分配内存,最后返回链表的头结点。
             第二步:在getodd函数中,根据题目要求的条件对链表结点中date的值进行分类判断。
             第三步:需考虑若最后新建链表有可能为空的情况,最后按照要求返回要求链表的头结点。

        (2)流程图

    2.实验代码

    struct ListNode *readlist() {
        int n;
        struct ListNode *p = NULL,*head = NULL,*tail = NULL;
        scanf("%d",&n);
        while(n!=-1 && n>0 ) 
        {
            p = (struct ListNode*)malloc(sizeof(struct ListNode));
            p->data = n;
            if(head == NULL) 
            {
                head = p;
            } else 
            {
                tail->next = p;
            }
            tail = p;
            scanf("%d",&n); 
        }
        if(head == NULL) 
        {
            return NULL;
        } 
        tail->next = NULL;
        return head;
    }
    struct ListNode *getodd( struct ListNode **L ) 
    {
      struct ListNode *p = *L,*head1 = NULL,*r = NULL,*L1 = NULL,*r1 = 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.本题调试过程碰到问题及解决办法

          无。

    6-2 学生成绩链表处理

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:在createlist函数中将输入的学号,姓名和分数存储到链表中
             第二步:在deletelist函数中遍历链表的结点,若结点中的分数小于规定的值则释放此结点的内存,需注意若最终结点全被释放完内存,即返回的头结点为空的情况
             第三步:将判断后链表的头结点返回主函数。

    2.实验代码

    struct stud_node *createlist() {
     int num;
     char name[20]; 
     int score;
     struct stud_node *p,*head=NULL,*tail=NULL;
    
     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;
      } 
       L=L->next;
      }
      if(head1==NULL) {
        return NULL; 
      } else {
        tail1->next =NULL;
      }
      return head1;
    } 

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

          错误信息:
           错误原因:定义时未定义score而定义了两次num,低级错误
           改正方法:重新定义整形变量score

    6-3 链表拼接

    1.设计思路
         (1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
             第一步:
             第二步:
              ......

    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.本题调试过程碰到问题及解决办法

          错误信息1:
           错误原因:结尾tail1 = q与tail1->next = NULL的顺序错误
          错误信息2:
           错误原因:最后缺少i++进行循环
           改正方法:

    要求三、学习总结和进度

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

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

                  数组的各个元素都是指针类型,用于存放内存地址,那么这个数组就是指针数组。二级指针一般定义为“类型名 **变量名”,取得两次地址即可以对指针数组进行操作。

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

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

                  节省空间,可自由决定数组长度。不可以,未初始化会将指针存入一个不确定的地址,破坏系统正常工作。

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

    我的git地址:https://git.coding.net/Downager/180422.git

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

            孙铭婧:www.cnblogs.com/sun031915/

            吴晓明:http://www.cnblogs.com/gu-an-cheng-wxm/

            王姝雯:http://www.cnblogs.com/phsudie/

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

  • 相关阅读:
    Hibernate,get()和load()区别
    Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征
    Hibernate,Session清理缓存时间点
    frameset子窗口获取父窗口失败原因?
    struts2,实现Ajax异步通信
    struts2-json-plugin插件实现异步通信
    Hibernate,JPA注解@ManyToMany_JoinTable
    Hibernate,JPA注解@ManyToMany
    SparkStreaming操作Kafka
    DirectStream、Stream的区别-SparkStreaming源码分析02
  • 原文地址:https://www.cnblogs.com/zxy980612/p/8858885.html
Copyright © 2011-2022 走看看