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++)  
    {  
    if((*p).score<60)   
        {  
            (*p).grade='D';  
            count++;  
        }  
        else if((*p).score>=60&&(*p).score<=69)  
        (*p).grade='C';  
        else if((*p).score>=70&&(*p).score<=84)  
        (*p).grade='B';  
        else  
        (*p).grade='A';  
		p++; 
    }  
     return count;  
}  

实验思路

这个题目要求我们为这些学生的分数设置等级,我首先运用for语句,然后用指针指向学生分数
并做出判断,然后用count统计没有及格人数。

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

这个题目其实用到了以前的知识比较多,相对来讲是非常简单的,这题没什么问题,一遍就
运行正确了。

正确截图


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>
int main()
{
    int N,a[50],i;
    char b[50][400];
    int j;
    scanf("%d",&N);
    for(i=0; i<N; i++)
    {
        scanf("%d",&a[i]);
        scanf("%s",&b[i]);
    }
    for(i=0; i<N; i++)
    {
        for(j=N-1; j>=0; j--)
        {
            if(a[i]!=a[j]&&a[i]<=1&&a[j]<=1)
            {
                a[i]=2;
                a[j]=2;
                printf("%s %s\n",b[i],b[j]);
                break;
            }
        }
    }
    return  0;
}

做题思路

首先定义一个数组记录编号,然后再定义一个字符数组,用于记录字符串。
根据题目要求输入编号和名字,再利用for语句,将前面的男生和后面的女生配对,
或者反过来,但是配对之后,我就令他等于a[i]=2,a[j]=2;以免重复配对。最后要输入
个break,从而改变i,j的值继续循环下去。

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


这个问题只是因为没看pta上的输出要求导致的,在做这个题的时候,没有使用结构去做,
因为我觉得这样可能会更简单,但在写判断条件哪一个地方还是得有点知识才能举一反三的,
其它的问题在这到题上就没了,关键注意后面那个地方的条件。

正确截图


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>
#include <stdlib.h>

typedef struct student{
    char ID[17];
    int test_seat;
    int exam_seat;
}Student, *pStudent;

int main()
{
    int N, M, test;
    Student students[1001] = {0};      
    pStudent sp[1001] = {0};

    scanf("%d", &N);
    for(int i = 0; i < N; i++)
    {
        pStudent s = students + i;      
        scanf("%s %d %d", s->ID, &s->test_seat, &s->exam_seat);
        sp[s->test_seat] = s;           
    }

    scanf("%d", &M);
    for(int i = 0; i < M; i ++)
    {
        scanf("%d", &test);
        printf("%s %d\n", sp[test]->ID,sp[test]->exam_seat);
    }

    return 0;
}

设计思路

定义一个有关键字的结构,然后在主函数里面定义数组名和指针,并初始化,
然后学生的有关信息输入到定义的指针地址中,输入学生信息,指针指向那些迟到学生
未打开的测试机,输入那些测试机的台数,从而找到对应的考试机的位置。

做对过程中遇到的问题


这仅仅是格式错误,没看清Pta上的输出要求,其它的影响不大。

正确截图


预习中的疑惑

通过看书,确实有很多结构的其它形式自己还不是很了解,但随着查找资料与室友讨论
解决了很多困惑,所以还得继续加油,向更高的目标看齐。

对自己作业的评价

做pta上的作业给我的感觉就通过学习,慢慢的变得越来越熟练了,毕竟做了
这么多编程题,对于做题速度和理解也是越来越到位了,和自己对于专业的学习
也是越来越热情了,对于博客感觉每一周都是不一样的感受,不仅格式越来越好了,
流程图也在努力的改进中,继续朝更高的目标看齐。

这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
第一周 六个小时左右 102 学习了数组 对于数组的使用不太熟悉
第二周 八个小时左右 98 学习了文件,学会使用文件去处理代码 对于文件的一些操作
第三周 十个小时 124 学习了二维数组 暂时没有
第四周 十多个小时 134行 学习了最多的是利用for语句和数组使那些数按顺序排好 目前是编程经常错,好难编
第五周 9个多小时 121行 字符串头文件:#include<string.h>.字符串函数:strcpy.字符和字符串的区别。 对于指针的的理解还不是很深
第六周 七小时 100行左右 学会使用指针定义函数,然后就是学会使用指针返回多个函数值 对于比较复杂的转化还存在困难
第七周 12小时左右 140多行 通过学习更加了解指针了,还有数组与指针结合以及他们的关系 对于那些挑战题,感觉无从下手
第八周 14小时 200行左右 这周学习了结构,然后学习了比较多的函数 对于那些新函数理解的还不是很深刻
第九周 10小时 150行左右 这周就是继续练习结构,然和更深层次的理解结构多种形式 目前对于结构指针和结构数组不是特别理解

学习的感悟:

时间过得很快,转眼间第二个学期就快过去了,专业知识也学了快一年了,上个学期自己编程过少,进步确实挺慢,
但在这一个学期,我跟着老师节奏和在寝室和室友一起学习,感觉非常的不错,慢慢的发现自己在一步一步在进步,
这就是我的学习心得。

结对编程

结队编程过程:
队友都很积极的配合,感觉还是非常的棒的,虽然这周我有点事不在,但是我的搭档还是非常认真地在学习,
为搭档这种精神点赞,队友这周表现非常棒。

心得:好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
自我感觉好处:能使两个人沟通起来,得到1+1>2的效果。
我觉得我和搭档的编程水平很一般,但是两个人不断地努力,这实现了共同进步的目的。
我的优点:思维自我感觉还是可以的,对关于思路很很快的想出来。
我的缺点:书看的太少,基础知识不牢固。
队友优点:能够一起探讨问题,比较积极主动提出问题。
队友缺点:对于知识点的掌握还不是很好。

预习作业

第十周的教学内容是:第十章 函数与程序结构
请大家查阅资料,思考问题中的三问:什么是递归函数,它的优点和缺点有哪些,如何归纳出递归式?
请将你的思考用自己的语言写下来。如果有引用他们的文字,请一定要标出出处(使用Markdown的链接方式)。

什么是递归函数?
递归是一种新调用方法,就是一个函数在它的函数体内调用它自身。
所以递归要有两个要点:递归出口和递归调用式子。
递归函数的利弊
优点:递归函数方便了程序员——递归不仅可以节省程序员大量时间,就是可以对一个项目起到了一个至关的作用(处理过程)。
缺点:对处理器和内存的坏处——处理器一遍遍地调用函数、所以会占用系统很多空间,每用一次,要调一次,对内存损耗极大。
如何归纳出递归式?
主要还是从两个方面:
1.递归出口:即递归结束的条件,到时候不再执行下去。
2.递归式子:由递归的表达式构成,如C语言10.2.2中所说的函数。
这就是归纳出递归的条件,按这个去归纳。

挑战作业

由于时间原因,挑战题暂时不写。

posted @ 2019-04-25 17:50  刘彭  阅读(127)  评论(2编辑  收藏  举报