2019年春第九周作业

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 第九周作业要求
我在这个课程的目标是 根据实际情况合理定义结构,能够使用结构变量与结构数组进行熟练编程,掌握结构指针的操作,并应用于函数传递。
这个作业在哪个具体方面帮助我实现目标 使我更加熟练的了解结构的用法
参考文献 C语言程序设计II第九章

6-1 按等级统计学生成绩 (20 分)

本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数接口定义:
int set_grade( struct student *p, int n );
其中p是指向学生信息的结构体数组的指针,该结构体的定义为:
struct student{
int num;
char name[20];
int score;
char grade;
};
n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。
裁判测试程序样例:

#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", &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\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78
输出样例:
The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

实验代码

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

实验思路

具体思路:传入实参,定义一个count保存不齐格的人数,并作为被调函数返回值。再用if一个一个数的比较,来进行评级,评级后就continue。

本题做对过程中遇到的问题及解决方法

一次就过了,非常简单。

正确截图

7-1 一帮一 (15 分)

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

实验代码

#include<stdio.h>
#define max 60
struct student{
	int num;
	char name[9];
};
int main(void)
{
	int n,i,x;
	scanf("%d",&n);
	struct student students[max],*p,*q,*a;
	p=q=students;
	for(i=0;i<n;i++,p++){
		scanf("%d %s",&p->num,p->name);
	}
    a=p=p-1;
	for(x=0;x<=n/2;x++,q++){
		p=a;
	    for(1;p>q;p--){
	    	if(q->num==0&&p->num==1){
	    		printf("%s %s\n",q->name,p->name);
	    		p->num=2;
	    		break;
			}
			if(q->num==1&&p->num==0){
				printf("%s %s\n",q->name,p->name);
				p->num=2;
				break;
			}
		}
	}
}

做题思路

具体思路:定义一个结构数组students[max],来保存输入的性别和名字。定义两个结构指针p,q,指针q指向结构数组初位置,指针p指向结构数组末位置。
用for循环,使指针q和指针p指向的性别不同的名字配对,配对成功就输出配对的两个名字并进行下一个名字的配对,并使得指针p重新指向结构数组末位置。当x>n/2时结束循环。

本题做对过程中遇到的问题

遇到的问题:最后一个配对的没有输出
原因:因为for循环中,指针在最后已经越界了
解决方法:在输入完成后,指针自减一,使得指针指向结构数组的最后一个位置

遇到的问题:段错误。在DEV-C++中发现是后面有的配对的名字没有输出。
原因:现在还未知,
解决方法:定义一个指针,保存结构数组最末位置的地址。

正确截图

7-2 考试座位号 (15 分)

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。
输入样例:
4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4
输出样例:
3310120150912002 2
3310120150912119 1

实验代码

#include<stdio.h>
struct xuesheng{
    char zkzh[20];
	int shi;
	int kao;
};
int main(void)
{
	int N,M,i,x;
	scanf("%d",&N);
	struct xuesheng xs[N],*p;
	p=xs;
	for(i=0;i<N;i++,p++){
		scanf("%s %d %d",p->zkzh,&p->shi,&p->kao);
	}
	scanf("%d",&M);
	int shi1[M];
	for(i=0;i<M;i++){
		scanf("%d",&shi1[i]);
		p=xs;
		for(x=0;x<N;x++,p++){
			if(p->shi==shi1[i]){
				printf("%s %d\n",p->zkzh,p->kao);
				break;
			}
		}
	}
} 

设计思路

具体思路:定义xs[N]保存输入的学生信息。定义shi1[M]来保存需要查询考试座位号的试机座位号。
用for循环来输入一个值就查找一个结构数组里的试机座位号,如果值相同,输出学号和考试座位号并查找下一个试机座位号。每次必须使指针p重新指到结构数组的初始位置。

做对过程中遇到的问题

一次过,非常简单的题,只是题目有点长。

正确截图

预习中的疑惑

现在没有什么疑惑了,刚开始预习的时候疑惑挺多的,后来通过看书,做题,还有百度都解决了。

对自己作业的评价

这次做的不错,做的快而且正确率高,比较满意。

学习进度条

这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
第九周 六个小时 130行 学到了结构体更深层次的用法 命令行参数怎么使用
第八周 八个小时 170多行 学到了结构体的基本用法和性质 结构体里能用static吗?
第七周 六个小时 200多行 学到了scanf的自定输入 在函数声明的形参表中定义一个char\ *,什么意思
第六周 七个小时 156行 学到了指针的基本用法,还有用指针做自定义函数的形参用法 在函数声明的形参表中定义一个char *,什么意思
第五周 七个多小时 137行 字符串头文件:#include<string.h>.字符串函数:strcpy.字符和字符串的区别。 指针的拓展使用不会
第四周 十多个小时 134行 选择排序法,字符数组和字符串的使用 为什么我在PTA和上用的也是c++编译器,但是在c++上能正确输出,在PTA上就不正确,为什么呢。
第三周 八小时 106 二维数组的基本知识 PTA的测试点是啥,第一个题除了穷举法还有没有其他方法?指针在文件中的写入位置在哪?怎么来确定的?
第二周 六个多小时 153 文件的打开与关闭,读取数据与写入数据 指针的用法还是有点不会

学习感悟

结构体非常方便,能很好的包含具有某一特性或某一类别的很多数据类型。这些题对我还是有帮助的,但是书上的编程课后作业更有意思。

结对编程

过程:
我绝望了哟。

心得:好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。

(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。

(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
自我感觉好处:能使两个人沟通起来,得到1+1>2的效果。
但是!!!那也得使强强联手才行呀,所以,有个时候真还不如自己一个人编写程序,还能冷静思考。
我的优点:基础知识记得不错,能持之以恒的坚持写代码,会耐心教队友不会的知识。
我的缺点:太过自信。
队友优点:愿意学,虽然效果不大。英语好,表现不错。
队友缺点:啥也不知道。

挑战作业

上几周的挑战作业,有同学已经有些思路了,有思路的同学请及时记录下自己的思考或程序并发表,也请没有完成的同学不要放弃思考,继续加油!
本周,我们来做一做关于字符串的挑战题:
九宫格键盘对应英语单词
九宫格键盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。如图所示:
IMG_8397(1).JPG

对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTPB……
1.您是否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来表述一个电话好吗呢?如:可以用单词“computer”来描述号码26678837.
2.对于一个电话号码,是否可以用一个单词来代表呢?怎样才是最快的方法呢?显然,肯定不是所有的电话号码都能够对应到单词上去。但是根据问题1的解答,思路相对比较清晰。

实验代码

#include<stdlib.h>
#include<string.h>
int main(void)
{
    static char jp[10][5]={"\0","\0","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    static char NE[20],num[20];
    static int i,c,a,b,x;
    FILE *fp;
    if((fp=fopen("D:\\ldx.txt","r"))==NULL){
        printf("File open error!\n");
        exit(0); 
    }
    scanf("%s",num);
    y=strlen(num);
    while(!feof(fp)){
        fscanf(fp,"%s", NE);
        printf("%s",NE);
        i=strlen(NE);
        printf("%d\n",i);
        if(i!=y){
            strcpy(NE,"\0");
            continue;
        }
        for(a=0;a<i;a++){
            while(1){
                if(NE[a]==jp[c][b]){
                   printf("%d",c);
                   if(c==(num[a]-'0')){
                    x++;
                   }
                   c=0;
                   break;
                }
                b++;
                if(jp[c][b-1]=='\0'){
                   c++;
                   b=0;
                }
            }
         }
         if(x==i){
            printf("%s",NE);
            break; 
         }
         x=0;
        strcpy(NE,"\0");
    }
    if(x!=i){
        printf("NO FOUND");
    }
    if(fclose(fp)){
        printf("Can not close the file!\n");
        exit(0);
    }
}

优化后代码。

预习作业

什么是递归函数?

我看书知道了递归函数就是函数调用自己本身这个函数。递归函数有两个关键点:1.递归出口:就是递归的结束条件,达到什么条件就不需要递归调用下去。2.递归式子:递归的表达式。

它的优点和缺点有哪些?

我认为它的优点是:步骤少,简洁,与之相对的缺点就是:技巧性要高,并且效率低。而且递归次数过多的话,会占用极大部分内存空间。

如何归纳出递归式?

在题中找出每一次运算的共同点,把它转化为式子,就得到了递归式。

posted @ 2019-04-24 14:49  李代璇  阅读(309)  评论(2编辑  收藏  举报