• C语言——第二次作业(2)


    作业要求一

    PTA作业的提交列表

    第一次作业

    第二次作业

    第三次作业

    作业要求二

    题目1.删除字符串中数字字符(函数题)

    1.设计思路

    - (1)算法

    第一步:调用定义的函数。

    第二步:定义i=0、j=0,i为原字符数组角标,j为删除后字符数组角标。使用循环语句读取字符数组元素,当字符数组元素为数字字符'0'~'9'时不进行操作,当字符数组元素为其它字符元素时,吧s[i]赋值给s[j],并让j加一。当s[i]为结束字符''时,循环结束,并添加结束字符。

    第三步:结果返回主函数。

    - (2)流程图

    2.实验代码

    void delnum(char *s)
    {
        int i,j;
        for(i = 0, j = 0; s[i] != ''; i++) 
    	{
            if (!s[i] >= '0' && s[i] <= '9') 
            {
            	s[j] = s[i];
    			j++;
    		}	
        }
        s[j] = '';
        return;
    }
    

    完整代码

    #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)
    {
        int i,j;
        for(i = 0, j = 0; s[i] != ''; i++) 
    	{
            if (!s[i] >= '0' && s[i] <= '9') 
            {
            	s[j] = s[i];
    			j++;
    		}	
        }
        s[j] = '';
        return;
    }
    

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

    本题未遇到问题。

    题目2.统计子串在母串出现的次数

    1.设计思路

    - (1)算法

    第一步:调用定义的函数。

    第二步:定义i、j、n,使用双重循环结构,外层循环用来遍历数组元素,内层循环判断字符数组元素是否相等,完全相等时,可遍历子串,则次数加一。

    第三步:结果返回主函数。

    - (2)流程图:略。

    2.实验代码

    int fun(char *str,char *substr)
    {
    	int i,j,n=0;
    	for(i = 0; *(str+i) != ''; i++)
    	{
    		int a=0;
    		for(j = 0, a = i; *(str+a) == *(substr+j); j++, a++)
    		{
    			if(*(substr+j+1) == '')
    				n++;
    		}
    	}
    	return n;
    }
    

    完整代码

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

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

    解题没有什么错误,但是我自己有两个小问题。

    (1)当我写完代码后,发现自己解题并没有使用指针的思想,于是想尝试重新用指针的方式解题,但是却没有什么好的思路,最多就是将a[i]和*(a+i)进行替换,所以我现在还是不能较好的使用指针。

    (2)PTA题目所给出的主函数只能应用于题目所给出的案例,不好验证代码的正确性,所以我将主函数内直接给出的字符串改成输入进行运行调试。

    题目3.字符串中除首尾字符外的其余字符按降序排列

    1.设计思路

    - (1)算法

    第一步:调用定义的函数。

    第二步:定义i、j,使用双重循环结构,外层循环用来遍历字符串中除首尾字符外的其余字符,内层循环判断字符数组元素大小(选择排序法)。

    第三步:结果返回主函数。

    - (2)流程图:略。

    2.实验代码

    int fun(char *s,int num)
    {
    	int i,j;
    	for(i = 1; *(s+i+2) != ''; i++)
    	{
    		for(j = i; *(s+j+2) != ''; j++)
    		{
    			if(*(s+i) < *(s+j+1))
    			{
    				int t;
    				t = *(s+i);
    				*(s+i) = *(s+j+1);
    				*(s+j+1) = t;
    			}
    		}
    	}
    	return *s;
    } 
    

    完整代码

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

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

    同上一题,PTA题目所给出的主函数可应用范围很小。

    题目4. 输出学生成绩

    1.设计思路

    - (1)算法

    第一步:定义所需变量,输入学生人数。

    第二步:使用动态内存分配语句。

    第三步:使用循环结构,对学生成绩进行输入,并计算平均成绩。使用冒泡排序法,将成绩从大到小排列。

    第四步:输出结果。

    - (2)流程图:略

    2.实验代码

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

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

    第一次提交未使用动态内存分配,不过提交通过了,之后经提醒添加使用了动态内存分配语句。

    题目5. 计算职工工资

    1.设计思路

    - (1)算法

    第一步:定义结构体变量,成员包括——姓名、基本工资、浮动工资、支出和实发工资。

    第二步:输入人数n,引用结构体变量。

    第三步:使用循环结构,输入姓名、基本工资、浮动工资、支出,计算实发工资,并输出姓名和实发工资。

    - (2)流程图

    2.实验代码

    #include<stdio.h>
    struct clerk
    {
    	char name[10];
    	float wages, floating, pay, wage;
    }c1;
    int main()
    {
    	int n, i;
    	scanf("%d",&n);
    	struct clerk c[n];
    	for(i = 0; i < n; i++)
    	{
    		scanf("%s %f %f %f",c[i].name, &c[i].wages, &c[i].floating, &c[i].pay);
    		c[i].wage = c[i].wages + c[i].floating - c[i].pay;
    		printf("%s %.2f
    ",c[i].name, c[i].wage);
    	}
    }
    

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

    无。

    题目6. 计算平均成绩

    1.设计思路

    - (1)算法

    第一步:定义结构变量,成员包括——学号、姓名和成绩。

    第二步:输入人数N,引用结构体变量。

    第三步:使用循环结构,输入学号、姓名和成绩,计算总成绩。

    第四步:计算平均成绩并输出。

    第五步:使用循环结构,选择成绩低于平均的并输出。

    - (2)流程图:略。

    2.实验代码

    #include<stdio.h>
    struct student
    {
    	char id[6], name[10];
    	int achievement;
    }s1;
    int main()
    {
    	int N, i;
    	double sum = 0, average = 0;
    	scanf("%d",&N);
    	struct student s[N];
    	for(i = 0; i < N; i++)
    	{
    		scanf("%s %s %d",s[i].id,s[i].name,&s[i].achievement);
    		sum = s[i].achievement + sum;
    	}
    	average = sum / N;
    	printf("%.2f
    ",average);
    	for(i = 0; i < N; i++)
    	{
    		if(s[i].achievement < average)
    			printf("%s %s
    ",s[i].name,s[i].id);
    	} 
    }
    

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

    本题出现了一个小错误,输入时成绩没有加“&”符号,导致程序无法运行。要时刻保持认真的态度,不要犯这样的错误。

    题目7.按等级统计学生成绩(函数题)

    1.设计思路

    - (1)算法

    第一步:调用定义函数。

    第二步:使用循环结构,循环判断每个学生的等级,N为不及格人数,当学生为D等级时,N加一。

    第三步:结果返回主函数。

    - (2)流程图

    2.实验代码

    int set_grade( struct student *p, int n )
    {
    	int i,N = 0;
    	for(i = 0; i < n; i++)
    	{
    		if((p+i)->score <= 100 && (p+i)->score >= 85)
    			(p+i)->grade = 'A';
    		else if((p+i)->score <= 84 && (p+i)->score >= 70)
    			(p+i)->grade = 'B';
    		else if((p+i)->score <= 69 && (p+i)->score >= 60)
    			(p+i)->grade = 'C';
    		else if((p+i)->score <= 59 && (p+i)->score >= 0)
    		{
    			(p+i)->grade = 'D';
    			N++;
    		}	
    	}
    	return N;
    }
    
    

    完整代码

    #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,N = 0;
    	for(i = 0; i < n; i++)
    	{
    		if((p+i)->score <= 100 && (p+i)->score >= 85)
    			(p+i)->grade = 'A';
    		else if((p+i)->score <= 84 && (p+i)->score >= 70)
    			(p+i)->grade = 'B';
    		else if((p+i)->score <= 69 && (p+i)->score >= 60)
    			(p+i)->grade = 'C';
    		else if((p+i)->score <= 59 && (p+i)->score >= 0)
    		{
    			(p+i)->grade = 'D';
    			N++;
    		}	
    	}
    	return N;
    }
    
    

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

    错误一:本题出现了编译错误,后发现我将题目中完整代码进行了提交。

    错误二:本次有测试点出现错误,错误提示为warning: ignoring return value of ‘scanf’。

    解决方法:使用原输入值n对循环进行判断,问题解决。

    题目8.结构体数组按总分排序(函数题)

    1.设计思路

    - (1)算法

    第一步:调用calc函数,使用双重循环结构,内层循环通过循环计算单个学生总成绩,外层循环通过循环改变学生。

    第二步:调用sort函数,通过对sum的比较使用冒泡排序法对学生进行排序。

    - (2)流程图:略。

    2.实验代码

    void calc(struct student *p,int n)
    {
    	int i, j;
    	for(i = 0; i < n; i++)
    	{
    		for(j = 0; j < 3; j++)
    		{ 
    			p->sum = p->score[j] + p->sum;
    		}
    		p++;
    	}
    } 
    void sort(struct student *p,int n)
    {
    	int i, j;
    	struct student t;
        for(i = 1; i < n; i++)
           for(j = 0; j < n - i; j++)
    	       if(p[j].sum < p[j+1].sum){
    	          t = p[j];
    	          p[j] = p[j+1];
    	          p[j+1] = t;
    	       }
    }
    

    完整代码

    #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, j;
    	for(i = 0; i < n; i++)
    	{
    		for(j = 0; j < 3; j++)
    		{ 
    			p->sum = p->score[j] + p->sum;
    		}
    		p++;
    	}
    } 
    void sort(struct student *p,int n)
    {
    	int i, j;
    	struct student t;
        for(i = 1; i < n; i++)
           for(j = 0; j < n - i; j++)
    	       if(p[j].sum < p[j+1].sum){
    	          t = p[j];
    	          p[j] = p[j+1];
    	          p[j+1] = t;
    	       }
    }
    

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

    本题在void函数中添加了返回语句,删除即可解决问题。

    作业要求三

    1、学习总结

    所学知识点:对指针的复习,动态内存分配,定义结构体变量及结构体变量的引用,以及数组、指针、结构的结合使用。

    有关动态内存的分配,老师讲述较为简单,不过网上有很多相关资料,在这里分享一篇我找到的较为详尽的文章:《C语言中手把手教你动态内存分配》

    存在问题:不能较好的使用指针。

    2、我的Git地址

    3、点评链接(待添加)

    链接一

    链接二

    链接三

    4、图表



  • 相关阅读:
    Java页面中文编码要转换两次encodeURI
    ajax用get刷新页面元素在IE下无效解决~~
    祝贺自己开博~~
    错误域控降级导致解析问题
    ELK 脚本自动化删除索引
    Windows针对子目录共享权限控制
    ES查询区分大小写
    Docker异常时区问题
    Docker自定义镜像无容器日志输出
    ELK时间戳
  • 原文地址:https://www.cnblogs.com/dx2017/p/8666072.html
Copyright © 2020-2023  润新知