2019第九周作业

2019年春季学期第九周作业

课程名称 c语言程序设计2
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3124
我的课程目标 使用结构体实现一个输入年月日,计算输出该日是本年中的第几天的程序
这个作业在哪个方面帮助我实现目标 使用结构体与自定义函数对学生成绩,座位号,准考证号的输出。
参考文献 课本c语言程序设计结构体章

基础作业一

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.score等同*(p.score) */
		{
			(*p).grade='D';
			count++;   //count统计不及格人数
		}
		else if((*p).score>=85&&(*p).score<=100)
		(*p).grade='A';
		else if((*p).score>=70&&(*p).score<=84)
		(*p).grade='B';
		else
		(*p).grade='C';
        p++;  //对不同等级的人计数
	}
	return count;
}

二)实验思路

三)实验遇到的问题及解决方案

题目要求根据学生的分数输出等级,但是在输出时我没有加上p++导致只输出了第一个人的等级,在调试过程中发现了这一错误,加上p++即输出正确。

四)运行结果截图

基础作业二

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>
struct student{
	int sex;//性别 
	char name[10];
	int flag;//对0和1标记 
};
int main()
{
	struct student s[1000];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	    scanf("%d %s",&s[i].sex,&s[i].name);
	    s[i].flag=0;
	}
	for(int i=0;i<n/2;i++)
	{
		for(int j=n-1;j>=i;j--)//从后到前匹配 
		{
			if(s[i].sex!=s[j].sex&&s[j].flag!=1)
			{
				printf("%s %s",s[i].name,s[j].name);
				s[j].flag=1;
				if(i!=(n/2)-1)
				printf("\n");
				break;
			}
		}

	}

二)实验思路

三)实验遇到的问题及解决方案

本题需要注意一下顺序问题,即从前到后,与从后到前排,没遇到问题。

四)运行结果截图

基础作业三

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 student
{
    char z[1000];
	int sz;
	int kz;
};
 
int main()
{
	struct student s[1001];
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; i++) {
		scanf("%s%d%d",&s[i].z,&s[i].sz,&s[i].kz);
	}
	
	int m;
	scanf("%d",&m);
	for(int i = 0; i < m; i++) {
		int t;
		scanf("%d",&t);
		for(int i = 0; i < n; i++) {
			if(s[i].sz == t) {
				printf("%s %d\n",s[i].z,s[i].kz);
			}
		}
	}
	return 0;
}

二)实验思路

三)实验遇到的问题及解决方案

准考证号,试机座位,考试座位都为数字,刚开始我用long long定义准考证号,因为准考证号有10多位,但是程序运行超时,因此我认为用long long 定义超了其范围,于是就用char来定义准考证号。

四)运行结果截图

预习题

第十周的教学内容是:第十章 函数与程序结构

请大家查阅资料,思考问题中的三问:什么是递归函数,它的优点和缺点有哪些,如何归纳出递归式?

一)首先它是一个函数,能进行自我调用,能反复进行,在有结束条件的前提下,每调用一次就进入新的一层,它有自己的完成状态有一种方法可以将要解决的问题从某个方面分化为更简单或更小的、相同类型的问题时,即可考虑使用递归。 [https://blog.csdn.net/wf19930209/article/details/79341939]

优点是可以通过将复杂的问题分解成相同类型的子问题,使代码简洁,清晰,易懂。缺点是效率不高,因为递归函数为自我调用函数,调用多少次就要对所有的内容进行分配,次数越多分配次数也越多。导致效率降低。

归纳的话网上给出了三种方法,我也不是太清楚,自己觉得这可以看做一个按图索骥的例子,当你知道前几项时,必定能一直往后推,相当于数学中的数列,给你几个数,写出它的通项公式。接下来就是这三种方法,自行体会。[https://blog.csdn.net/qq_26010491/article/details/50616845]

学习感悟

主要还是学习结构体,对结构体的定义和运用有了一个更好的理解,使用结构体做题效率高了,还节省内存空间。结构体的初始化和引用及指向结构体变量的指针变量用于题目中更加简洁,更易于理解。对于结构与数组的关系,还是不太理解,周末会做好预习工作。

结对编程感想

周三只有一节课,在白天的努力下做完了题,晚自习和队友主要就对彼此的思路进行了探讨,队友用第一题用结构数组做的,但是答案错误,我仔细帮他检查一遍,原来他把student误打为stdent,果然一个字母毁整个程序。第二题和他思路差不多,就是空格输出他没注意,我及时帮他纠正,第三题的话就是那个准考证号我用long long 定义,队友说这个超出范围,用char定义即可。至此我感觉到和队友讨论能指出彼此的错误,受益匪浅。

学习进度

周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
4-22-4/26 2天 140 struct结构定义和使用,, char,string,longlong型区别的不是很清楚,递归函数概念看得懂,但不太会运用

折线图

posted @ 2019-04-25 13:36  小嗝嗝爱作业  阅读(284)  评论(1编辑  收藏  举报