• 2018第二次作业


    ---恢复内容开始---

    ##作业要求一 ![](https://images2018.cnblogs.com/blog/1238324/201804/1238324-20180408105703073-364814150.png)

    作业要求二

    6-7 删除字符串中数字字符

    1 设计思路(6分)
    第一步:定义两个数组a和s,输入一串数字和字母还有字符的混和串到s[i]。
    第二步:用循环语句进行判断把数字排除,并让a[i]=s[i]。
    第三步:输出a[i]。
    流程图:

    2.实验代码(2分)

    #include "stdio.h"
    void delnum(char *s);
    int main ()
    { char item[80];
    gets(item);
     delnum(item);
     printf("%s
    ",item);
     return 0;
    }
    void delnum(char *s)
    {
    	char a[80];
    	int i,j;
    	for (i=0,j=0;*(s+i)!='';i++)
    	{
    		if(s[i]<'0'||s[i]>'9')
    		{
    			a[j]=s[i];
    			j++;
    		}
    	}
    		a[j]='';
    		strcpy(s,a);
    }
    

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

    错误原因:错误理解&&和| |的意义,使排除时候的条件出错。
    改正方法:将&&换成||,这样就排除了1到9的数字。

    6-8 统计子串在母串出现的次数

    1 设计思路(6分)
    第一步:输入母串和子串。
    第二步:利用循环判断母串里是否含有子串,若含有则m+1。
    第三步:输出次数m。
    2.实验代码(2分)

    #include<stdio.h>
    int fun(char *str,char *substr);
    int main()
    { char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
     int n;
     n=fun(str,substr);
     printf("n=%d
    ",n);
     return 0;
    }
    int fun(char *str,char *substr)
    {
       
        int i=0,j=0,m=0;
        for(i=0;str[i]!='';i++)
        {
        	for(j=0;str[i+j]==substr[j] && substr[j]!='';j++)
        	{
        		if(substr[j+1] == '') 
                 m++;
    		}
    	}
    	return m;
    }
    

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

    错误原因:将return和strcpy的用法搞混。
    改正方法:strcpy的主要用法是复制,将一个字符串的内容复制给另一个,而在这里,n和m都是单个变量,不是数组,所以不应该使用strcpy。

    6-9 字符串中除首尾字符外的其余字符按降序排列

    1 设计思路(6分)
    第一步:输入一串字母在字符串中。
    第二步:用循环语句判断除了首位字母以外,其他位置字母的大小,并且排序。
    第三步:输出完成排序的字符串。
    2.实验代码(2分)

    #include <stdio.h>
    int fun(char *s,int num);
    int main()
    {
     char s[10];
     gets(s);
     fun(s,7);
     printf("%s",s);
     return 0;
     }
    int fun(char *s,int num)
     {
     char t;
     	
     	int i=0,j=0;
     	for(i=1;i<5;i++) 
     	{
     		for(j=i+1;j<6;j++)
               {
     		if(s[i]<s[j])
     		{
     			t=s[i];
     			s[i]=s[j];
     			s[j]=t;
    		 }
    	    }
    	 }
     }
    

    3.本题调试过程碰到问题及解决办法(12分)
    这道题运用了冒泡排序的方法,比较简单,没有问题。

    7-1 输出学生成绩

    1 设计思路(6分)
    第一步:先设出所需的变量,还有动态变量的格式。
    第二步:输入学生数量和每位学生的成绩。
    第三步:寻找出他们之中的最大值和最小值,最后计算出平均值。

    2.实验代码(2分)

    #include<stdio.h>
    int main()
    {
    	int N,i;
    	float max,min,sum,average;
    	float *p;
    	scanf("%d",&N);	
    	if ((p = (float *)malloc(N*sizeof(float))) == NULL)
    	 {
        printf("Not able to allocate memory. 
    ");
        exit (1);
         }
    	for(sum=0,i=0;i<N;i++)
    		{
    		scanf("%f",p+i);
    		sum=sum+*(p+i);	
    	}
    	average=sum/N;		
    	max=*p;
    	min=*p;  	
    	for(i=0;i<N;i++)	
    	{
    		if(max<*(p+i))
    			max=*(p+i);
    	}
    	for(i=0;i<N;i++)
    	{
    		if(min>*(p+i))
    			min=*(p+i);
    	}
    	printf("average = %.2f
    ",average);
    	printf("max = %.2f
    ",max);
    	printf("min = %.2f
    ",min);
    	free(p);	
        return 0;
     } 
    

    3.本题调试过程碰到问题及解决办法(12分)
    这道题主要是首次使用动态内存分配,题的本身没有什么难度,所以没什么特别的问题,需要注意的就是不要忘记最后那步将内存释放。

    7-1 计算职工工资

    1 设计思路(6分)
    第一步:定义题目所需变量。
    第二步:输入人数,再依次输入名字,基本工资,浮动工资和支出。
    第三步:最后算出每个人的实际工资,并输出。
    流程图:

    2.实验代码(2分)

    #include<stdio.h>
    struct worker
    {
      char name[10];
      float a1,a2,a3;
      float sum;
    }worker;
    int main()
    {
    
    	int i,n,j;
    	scanf("%d",&n);
    		struct worker s[n];
    	for(i=0;i<n;i++)
    	  {
    		scanf("%s %f %f %f",s[i].name,&s[i].a1,&s[i].a2,&s[i].a3);
    		s[i].sum=(s[i].a1+s[i].a2)-s[i].a3;
        }
        for(j=0;j<n;j++)
        {
        	printf("%s %.2f
    ",s[j].name,s[j].sum);
    	  }
    	return 0;
     } 
    

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

    错误原因:一开始因为变量的定义发生错误,所以导致虽然答案看起来正确,但系统判断发生错误,后来又遇到因为定义变量的范围为一个定值而导致的段错误。
    改正方法:通过在小组里面的询问,和同学热心的帮助,更改成了float变量以及段错误的问题,并且复习了段错误出现的原因。

    7-2 计算平均成绩

    1 设计思路(6分)
    第一步:定义题目所需变量。
    第二步:依次输入学生的学号,姓名和成绩。
    第三步:然后计算平均值,并找出低于平均值的学生。
    第四步:输出平均值和低于平均值学生的姓名与学号。
    2.实验代码(2分)

    #include<stdio.h>  
    struct student  
    {  
        char  a1[1000];
        char name[100];    
        float a2;     
    }student;  
    int main()  
    {  
        int n,i,j;
    	float sum=0.00,ave=0.00;  
        scanf("%d", &n); 
    	struct student s[n];  
        for (i = 0; i < n; i++)  
        {       
            scanf("%s %s %f",&s[i].a1,s[i].name,&s[i].a2); 
            sum=sum+s[i].a2;
        } 
        ave=sum/n;
        printf("%.2f
    ",ave);
        for (j = 0; j < n;j++)  
        {  
        if(s[j].a2<ave)
        {
            printf("%s %s
    ", s[j].name, s[j].a1);  
        } 
        }  
        return 0;   
    } 
    

    3.本题调试过程碰到问题及解决办法(12分)
    错误信息1:当时忘记截图,但记得当时遇到的主要问题是在输出不及格的学生的学号的时候,第一个学生的学号原本应该是“00001”,结果只输出了“1”。
    错误原因:定义的数组为float型,之前的0会自动省略。
    改正方法:将反映学号的那组数组改成char型。

    6-1 按等级统计学生成绩

    1 设计思路(6分)
    第一步:找到需要我们补充的函数部分内容。
    第二步:使用条件语句判断学生的等级并用字母表示,以及不合格的人数。
    第三步:返回m。
    流程图:

    2.实验代码(2分)

    #include <stdio.h>
    #define MAXN 10
    
    struct student{
        int num;
        char name[20];
        int score;
        char grade;
    };
    
    int set_grade( struct student *p, int n );
    
    int main()
    {   struct student stu[MAXN], *ptr;
        int n, i, count;
    
        ptr = stu;
        scanf("%d
    ", &n);
        for(i = 0; i < n; i++){
           scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
        } 
       count = set_grade(ptr, n);
       printf("The count for failed (<60): %d
    ", count);
       printf("The grades:
    "); 
       for(i = 0; i < n; i++)
           printf("%d %s %c
    ", stu[i].num, stu[i].name, stu[i].grade);
        return 0;
    }
    int set_grade( struct student *p, int n )
    {
    	int i,m=0;
    	for(i=0;i<n;i++)
    	{
    		if((p+i)->score>=85&&(p+i)->score<=100)
    		{
    			(p+i)->grade='A';
    		}
    		else if((p+i)->score<85&&(p+i)->score>=70)
    		{
    			(p+i)->grade='B';
    		}
    		else if((p+i)->score<70&&(p+i)->score>=60)
    		{
    			(p+i)->grade='C';
    		}
    		else if((p+i)->score<60&&(p+i)->score>=0)
    		{
    			(p+i)->grade='D';
    			m++;
    		}
    	}   
    	return m;
    }
    

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

    错误原因:没有看清题目的要求,没有统计不及格人数。
    改正方法:在低于60分的评级后加入m++,最后返回m。

    6-2 结构体数组按总分排序

    1 设计思路(6分)
    第一步:找出需要我们补充的内容。
    第二步:算出每个人的总分然后在根据总分使用冒泡排序法由高到低进行排序。
    2.实验代码(2分)

    #include <stdio.h>
    struct student					
    {
    int num;
    char name[15];
    float score[3];
    float sum;
    };
    void calc(struct student *p,int n);	 
    void sort(struct student *p,int n);
    int main()
    {
    struct student stu[5];
    int i,j;
    float f;
    for(i=0;i<5;i++)
    {
    	scanf("%d%s",&stu[i].num,stu[i].name);
    	for(j=0;j<3;j++)
    	{ 
        	scanf("%f",&f);
    		stu[i].score[j]=f;
    	}
    }
    calc(stu,5);
    sort(stu,5);
    for(i=0;i<5;i++)
    {
    	printf("%5d%15s",stu[i].num,stu[i].name);
    	printf("  %.1f  %.1f  %.1f  %.1f
    ",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
    }
    return 0;
    void calc(struct student *p,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
    		(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2];
    	}
    }
    void sort(struct student *p,int n)
    {
    	 int i,j; 
    struct student t; 
        for(i=0; i<n; i++)  
            for(j=0; j<n-i-1; j++)  
                if((p+j)->sum<(p+j+1)->sum)  
                {  
                    t=*(p+j);  
                    *(p+j)=*(p+j+1);  
                    *(p+j+1)=t;  
                }  
    }
    

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

    错误原因:进行替换的时候只交换了数字,没有交换地址。
    改正方法:

    要求三、学习总结和进度

    1、总结两周来所有PTA作业中每个题目所使用的知识点。
    又是两周过去了,这两周更深层次的了解了指针的用法,学了动态内存分配还有指针中字符串的替换,还有结构的嵌套定义,结构变量定义,结构数组,大部分学习的都是新方法,而解题思路仍然是以前的,所以需要将旧知识结合新方法一起学习,温故同时知新。

    2、将PTA作业的源代码使用git提交到托管平台上
    git地址:https://git.coding.net/MikeJackYao/The-first.git

    3、点评3个同学的本周作业
    杨志群:http://www.cnblogs.com/12138-/p/8710478.html
    于耀松:http://www.cnblogs.com/jsjyys/p/8672972.html
    董雅洁:http://www.cnblogs.com/exo123/p/8663311.html

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

  • 相关阅读:
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)M . Gitignore(模拟)
    11.FreeRTOS延时函数
    10.FreeRTOS任务通知的简易分析
    9.FreeRTOS内存管理简易分析
    8. FreeRTOS信号量的简易分析
    7.FreeRTOS 队列的简易分析
    6. FreeRTOS任务调度
    5.FreeRTOS任务切换的简易分析
    4.FreeRTOS调度器的启动简易分析
    3.FreeRTOS任务的简易分析
  • 原文地址:https://www.cnblogs.com/yaoshunyux/p/8746578.html
Copyright © 2020-2023  润新知