• C语言--第三次作业


    要求一 、
    1)C高级第三次PTA作业(1)

    题目6-1
    1.设计思路
         (1)主要描述题目算法
             第一步:将月份分别赋值;
             第二步:利用switch语句,输入月份;
             第三步:返回变量的地址值。
          (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.本题调试过程碰到问题及解决办法
     
          错误信息1:

           错误原因:月份英文打错。
    题目6-2
    1.设计思路
         (1)主要描述题目算法
             第一步:将星期分别赋值给一堆数组指针,赋初值为-1;
             第二步:用strmcp函数比较数组中每行元素与输入的字符串是否相同,相同则等于开始定义的函数;
             第三步:返回变量值。
       2.实验代码

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

    3.本题调试过程碰到问题及解决办法
     
          错误信息:

           错误原因:赋初值时,令a=1了,以至于错误。
    改正方法:将a=-1。
           
    题目6-3
    1.设计思路
         (1)主要描述题目算法
             第一步:定义数组,用strlen函数计算每行元素长度;
             第二步:利用for循环和if语句,比较大小,当定义元素长度大于max,交换;
             第三步:返回max的值。
       
    2.实验代码

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

    3.本题调试过程碰到问题及解决办法
     
          错误信息:

           错误原因: 应令count=q[0];,但直接写成 count=q[i];使交换进行不了,编译错误。
    题目6-4
    1.设计思路
         (1)主要描述题目算法
             第一步:定义s字符数组,定义s=ch1时的下表,并赋给一个整型变量;
             第二步:用for循环和if语句,将s[i]赋给指针字符j,爱循环中,若s[i]!=ch2.输出s[i],否则。s[i]加一,换行回到 j;
             第三步:输出换行,返回 j。
       
    2.实验代码

    char *match( char *s, char ch1, char ch2 ){
    	int i,j;
    	char *q=NULL;
    	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.本题调试过程碰到问题及解决办法
     
          错误信息1:

           错误原因:当if((s+i)==ch1)循环时,弄成了if((s+i)ch2)。
           改正方法: if(*(s+i)
    ch1),并且,应逐次增加j的大小确定ch1到ch2之间的字符。
    题目 编程题
    1.设计思路
         (1)主要描述题目算法
             第一步:定义a,b组成的数组大小;
             第二步:利用for循环和if语句,慢慢划掉能被2整除的数和3后面所有能被3整除的数。。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数;
     
    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;
            }
        }
    }
    

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

    题目6-1
    1.设计思路
         (1)主要描述题目算法
             第一步:在readlist函数中,将输入的值存储在链表里,用while循环时条件,在while循环内进行动态分配;
             第二步:在getodd函数中,对链表结点中date的值进行判断,将奇数偶数date分别存储在一个新的链表中;
             第三步:返回链表的头结点。
          (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,*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.本题调试过程碰到问题及解决办法
     
          错误信息1:

           错误原因: r1->next = p,时直接用了 r->next = p;
           
    题目6-2
    1.设计思路
         (1)主要描述题目算法
             第一步:在createlist函数中将输入的学号,姓名和分数存储到链表中,用while循环,返回链表的头结点;
             第二步:在deletelist函数中定义链表的结点,若结点中的分数小于规定的值,释放此结点的内存;
             第三部:返回主函数。
          (2)流程图(4分)

    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 {
        free(L);
       }
       L=L->next;
      }
      if(head1==NULL) {
        return NULL; 
      } else {
        tail1->next =NULL;
      }
      return head1;
    } 
    

    3.本题调试过程碰到问题及解决办法
     
          错误信息:

           错误原因:while (num != 0),忽略了学号不能等于0的情况,因当学号为0时不需要输入姓名及分数,代表结束。
           
    题目6-3
    1.设计思路
         (1)主要描述题目算法
             第一步:在ListNode *list1中储存字符的内存大小;
             第二步:ListNode *list2中储存字符的内存大小;
             第三步:用for循环和if语句交换,用ListNode函数合并两个列表。
    第四步:返回。
     
    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.本题调试过程碰到问题及解决办法
     
          错误信息:

           错误原因: struct ListNode q,head1 = NULL,*tail1=NULL; i=0;时,令i=1了,以至于错误;
    改正方法:将i=0.
      

    要求三、学习总结和进度
    1、总结两周里所学的知识点,回答下列问题?
         (1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?

    答:数组元素全为指针的数组称为指针数组。指针数组是一个数组,并且数组元素都为指针。二级指针是指一个指针指向的是另外一个指针,可以储存指针。

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

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

    (3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
    答:节省空间,可自由决定数组长度。不可以,不初始化会使指针存入一个不确定的地址,破坏系统正常工作。

    2、Git:https://git.coding.net/GUANCHENG/101.git

    3、点评3个同学的本周作业。
    张心悦:http://www.cnblogs.com/zxy980612/p/8858885.html
    孙铭婧:http://www.cnblogs.com/sun031915/p/8836088.html
    王姝雯:http://www.cnblogs.com/phsudie/p/8759331.html
    4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间。

  • 相关阅读:
    C++ 函数模板&类模板详解
    C++ const修饰不同类型的用法
    C++ 引用Lib和Dll的方法总结
    C#查询本机所有打印机
    C#如何设置桌面背景
    C#使用Aspose.Words把 word转成图片
    查看IP占用
    查看IP占用
    C# Dictionary判断Key是否存在
    C# 只有小时和分钟的两个时间进行对比
  • 原文地址:https://www.cnblogs.com/gu-an-cheng-wxm/p/8903685.html
Copyright © 2020-2023  润新知