2019春第九周作业
这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3124 |
我在这个课程的目标是 | 在编程过程中能熟练掌握结构数据类型的知识 |
这个作业在那个具体方面帮助我实现目标 | 本次作业需要多次使用结构类型来进行一些运算 |
参考文献 | C语言程序设计 |
按等级统计学生成绩
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数接口定义:
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+i)->score<60){
count++;
(p+i)->grade='D';
}
if((p+i)->score>=60&&(p+i)->score<=69)
(p+i)->grade='C';
if((p+i)->score>=70&&(p+i)->score<=84)
(p+i)->grade='B';
if((p+i)->score>=85&&(p+i)->score<=100)
(p+i)->grade='A';
}
return count;
}
设计思路
调试过程中遇到的问题及解决方法
无
实验结果截图
一帮一
实验代码
#include<stdio.h>
struct student {
int sex,flag;
char name[10];
};
int main()
{
int n,i,j;
scanf("%d",&n);
struct student ranking[n];
for(i = 0; i < n; i++){
scanf("%d %s",&ranking[i].sex,ranking[i].name);
ranking[i].flag=1;
}
int m;
for(i=0;i<n/2;i++){
m=n-1;
printf("%s ",ranking[i].name);
while(1){
if(ranking[m].sex!=ranking[i].sex&&ranking[m].flag!=0){
printf("%s\n",ranking[m].name);
ranking[m].flag=0;
break;
}
m--;
}
}
return 0;
}
设计思路
调试过程中遇到的问题及解决方法
无
实验结果截图
考试座位号
实验代码
#include<stdio.h>
struct student {
int random,normal;
char num[17];
};
int main()
{
int n,i,m,j;
scanf("%d",&n);
struct student s1[n];
for(i=0;i<n;i++)
scanf("%s %d %d",s1[i].num,&s1[i].random,&s1[i].normal);
scanf("%d",&m);
int a[m];
for(i=0;i<m;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(s1[j].random==a[i]){
printf("%s %d\n",s1[j].num,s1[j].normal);
break;
}
return 0;
}
设计思路
调试过程中遇到的问题及解决方法
无
实验结果截图
挑战题
九宫格键盘对应英语单词
九宫格键盘一般可以用于输入字母。如用2可以输入A、B、C,用3可以输入D、E、F等。如图所示:
对于号码5869872,可以依次输出其代表的所有字母组合。如:JTMWTPA、JTMWTPB……
1.您是否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来表述一个电话好吗呢?如:可以用单词“computer”来描述号码26678837.
2.对于一个电话号码,是否可以用一个单词来代表呢?怎样才是最快的方法呢?显然,肯定不是所有的电话号码都能够对应到单词上去。但是根据问题1的解答,思路相对比较清晰。
实验代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char number[20]={'\0'},word[20];
char *op=number,*cp=word;
char string[10][5]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int i,s1,s2;
scanf("%s",number);
s1=strlen(number);
if((fp=fopen("D:\\pz.txt","r"))==NULL){
printf("File open eroor!\n");
exit(0);
}
while(fscanf(fp,"%s",word),*cp!='#'){
i=0;
s2=strlen(word);
if(s1!=s2)
continue;
else{
while(i<s1){
if(strchr(string[*(op+i)-'0'],*(cp+i)))
i++;
else
break;
}
if(i==s1)
printf("%s\n",word);
}
}
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
return 0;
}
设计思路
上个星期的时候因为是匆匆忙忙写的,所以没有仔细去读清楚题目的要求,题目的要求是给定一个电话号码,然后去寻找各个数字对应的每个字母,然后这些字母组成的单词是要有意义的,之前我以为是根据单词把号码输出来,所以老师让我们去优化一下代码我就在之前的代码基础上做了一些修改。
第一步.
先把有意义的单词储存到一个文件中
这里我就只放了几个单词,虽然有几个是不存在的单词,但是我是用来测试的。
第二步.
定义一个文件指针,字符数组number用来存放号码(为什么不是整形变量?因为如果号码过长就会溢出),字符数组word用来读取文件中单词,同时定义两个字符指针方便后面对两个数组的运算,定义一个二维字符数组string储存号码对应的字母,定义两个整形变量用来储存号码与单词的长度,最后在输入号码并记录其长度
第三步.
打开文件,读入单词,这里我以读到'#'为结束,然后记录其长度并与号码长度对比是否相同,不同则读取下一个单词,相同则进行下一步的运算
第四步.
逐个判断单词的每个字母是否对应号码的数字,用我之前解释过的strchr函数判断,这里面有个要注意的地方,就是我号码是把它当做字符储存的,所以string[*(op+i)-'0']这里的时候string的下标就必须是数字了,所以将字符减'0'字符就变成了数字了,如果单词的字母为对应数字则继续判断下一个的字母,结束判断后,如果判断的每一个字母都对应每一个数字则符合条件就输出该单词。
第五步.
最后在关闭文件就可以了
运行结果截图
这里的computep只是测试的
预习作业
1.什么是递归函数
递归函数就是一个函数在编译的过程中不断调用本身,其要有递归出口.与递归式子.两个要点。
2.递归函数的优缺点
递归函数的优点我看了好多好多人的看法,几乎都是只有简洁与便利,通过一小段代码便可以处理一个复杂的算法,缺点就是空间与时间浪费,还可能会造成栈的溢出
3.如何归纳出递归式?
这里面讲了三个方法,也讲的很清楚
周/日期 | 这周所花时间 | 代码行数 | 学到的知识点 | 目前比较迷惑的问题 |
---|---|---|---|---|
3月4-3月10 | 4天 | 130行 | 如何读取文件中的数据并写入数据 | |
3/11-3/17 | 2天 | 66行 | 一些有关文件的函数 | |
3/18-3/24 | 2天 | 103行 | 二维数组的定义与使用 | |
3/25-3/31 | 2天 | 140行 | 与字符串有关的函数strlen,strcpy | 一些与字符串有关的函数使用方法 |
4/1-4/7 | 2天 | 56行 | 指针函数的定义与使用 | |
4/8-4/14 | 2天 | 69行 | gets,puts,strcat,strcmp函数 | |
4/13-4/19 | 2天 | 162行 | 地址结构内存的动态分配 | |
4/20-4/26 | 3天 | 108行 | 结构的定义与使用 |
学习折线图
学习感悟
或许对于一些同学来说编程是一件痛苦的事情吧,但是对于我的话每一次学习到了新的函数我就会很兴奋,我会去思考这个函数可以怎么用,怎么去用,可以在以后的作业中怎样通过使用这个函数去轻松快速的完成作业,这就是我学习过程中的一种乐趣所在,虽然编程是一个繁琐的过程,但是我们要去寻找其中的乐趣所在,因为知道了乐趣,才可以有兴趣,兴趣又是最好的老师,所以不要觉得编程枯燥乏味,要试着去寻找于自己而言的乐趣。
编程结对感悟
越来越觉得老师让我们结对编程是一个比较正确的决定,就像老师说的那样:今后我们工作了任何人都不可能在公司里面单打独斗,都需要队友。两个人可以互帮互助,或多或少的弥补一些对方的缺点,可以让两个人共同进步。