file 1:/user_files/hahaha/File/第7章算法程序与计算系统之灵魂练习题答案解析.docx
file 2:/user_files/hahaha/File/第6章由机器语言到高级语言:程序编写与编译练习题答案解析.doc
your attention please:
the average 's abbr in SQL is AVE not AVER !!!
this fault made me lose one point in the exam!!!!
so don't ever make that stupid mistake again!!!
从今天起
此博客不仅限于更新于关于Computer Science的内容,同时还会加入关于物理学和高等数学的内容。
一起期待吧~
Write before:
Have you ever feel amazed when you settle to think about the principles when you entering your password?
I haver always been curious about that.
So lets' uncover the mystery now!
#include <stdio.h> #include <conio.h> #define MAX_PSD_LEN 20 char PassWord[MAX_PSD_LEN],*p=PassWord,ch; int count=0; main() { ch=getch(); while(ch!=13&&count<MAX_PSD_LEN-1) /*当按下回车键或密码长度达到19,则退出循环*/ { if(ch==8) /*如果按下的是向前删除键,则...*/ { if(count) /*如果密码串中字符数大于零,则向前删除一个字符*/ { p--; count--; printf("\b ");/*光标回退一格,将星号(*)改为空格*/ printf("\b"); /*光标重新回退一格*/ } } else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0')) /*如果输入的是密码的有效字符*/ { printf("*"); /*输出一个星号*/ count++; *p=ch; /*记录密码内容*/ p++; } ch=getch(); /*等待输入下一个字符*/ } PassWord[count]=0; printf("\nThe Password you input is:\n"); printf("%s\n",PassWord); }
哈尔滨工业大学
实验目的
熟悉一维、二维数组、结构体做函数参数,排序、查找、统计分析等常用算法,自顶向下、逐步求精的模块化设计思想以及增量测试方法,同时发挥出学生个人的主管能动性,创造出有意思的新功能,提高程序的健壮性和可移植性。
实验内容和要求
1.实验内容
学生成绩管理系统V6.0
某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。参考学生成绩管理系统V5.0,定义结构体类型,用结构体数组作函数参数,如果能够把用户输入的数据存盘,下次运行时读出,那就更有用了,编程实现如下菜单驱动的学生成绩管理系统:
(1)录入每个学生的学号、姓名和各科考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分;
(4)按每个学生的总分由高到低排出名次表;
(5)按每个学生的总分由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名的字典顺序排出成绩表;
(8)按学号查询学生排名及其考试成绩;
(9)按姓名查询学生排名及其考试成绩;
(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;
(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;
(12)将每个学生的记录信息写入文件;
(13)从文件中读出每个学生的记录信息并显示。
要求程序运行后先显示如下菜单,并提示用户输入选项:
Management for Students' scores
1.Input record
2.Caculate total and average score of every course
3.Caculate total and average score of every student
4.Sort in descending order by score
5.Sort in ascending order by score
6.Sort in ascending order by number
7.Sort in dictionary order by name
8.Search by number
9.Search by name
10.Statistic analysis
11.List record
12.Write to a file
13.Read from a file
0.Exit
Please Input your choice:
然后,根据用户输入的选项执行相应的操作。
请按照下面的定义及函数原型编程
#define MAX_LEN 10 /* 字符串最大长度 */
#define STU_NUM 30 /* 最多的学生人数 */
#define COURSE_NUM 6 /* 最多的考试科目数 */
typedef struct student
{
long num; /* 每个学生的学号 */
char name[MAX_LEN]; /* 每个学生的姓名 */
float score[COURSE_NUM]; /* 每个学生COURSE_NUM门功课的成绩 */
float sum; /* 每个学生的总成绩 */
float aver; /* 每个学生的平均成绩 */
}STU;
int Menu(void);
void ReadScore(STU stu[], int n, int m);
void AverSumofEveryStudent(STU stu[], int n, int m);
void AverSumofEveryCourse(STU stu[], int n, int m);
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));
int Ascending(float a, float b);
int Descending(float a, float b);
void SwapFloat(float *x, float *y);
void SwapLong(long *x, long *y);
void SwapChar(char x[], char y[]);
void AsSortbyNum(STU stu[], int n, int m);
void SortbyName(STU stu[], int n, int m);
void SearchbyNum(STU stu[], int n, int m);
void SearchbyName(STU stu[], int n, int m);
void StatisticAnalysis(STU stu[], int n, int m);
void PrintScore(STU stu[], int n, int m);
输入格式:
( 1 )录入学生的人数:
**要求输入数据格式为:"%d"
**提示信息为:"Input student number(n<30):\n"
( 2 )录入课程数:
**要求输入数据格式为:"%d"
**提示信息为:"Input course number(m<=%d):\n"
( 3 )录入每个学生的学号、姓名和考试成绩:
**要求学号、姓名的输入数据格式为:"%ld%s"
**要求考试成绩的输入数据格式为:"%f"
**提示信息为:"Input student's ID, name and score:\n"
输出格式:
计算每门课程的总分和平均分:
**要求输出总分与平均分格式为:"course %d:sum=%.0f,aver=%.0f\n"
计算每个学生的总分和平均分:
**要求输出总分与平均分格式为:"student %d: sum=%.0f,aver=%.0f\n"
按成绩由高到低排出名次表:
**要求学号、姓名的输出格式为:"%ld\t%s\t"
**要求成绩的输出格式为:"%.0f\t"
**要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Sort in descending order by score:\n"
按成绩由低到高排出名次表:
**要求学号、姓名的输出格式为:"%ld\t%s\t"
**要求成绩的输出格式为:"%.0f\t"
**要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Sort in ascending order by score:\n"
按学号由小到大排出成绩表:
**要求学号、姓名的输出格式为:"%ld\t%s\t"
**要求成绩的输出格式为:"%.0f\t"
**要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Sort in ascending order by number:\n"
按姓名的字典顺序排出成绩表
**要求学号、姓名的输出格式为:"%ld\t%s\t"
**要求成绩的输出格式为:"%.0f\t"
**要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Sort in dictionary order by name:\n"
按学号查询学生排名及其考试成绩:
**如果未查到此学号的学生,提示信息为:"Not found!\n";
**如果查询到该学生
# 要求学号、姓名的输出格式为:"%ld\t%s\t"
# 要求成绩的输出格式为:"%.0f\t"
# 要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Input the number you want to search:\n"
按姓名查询学生排名及其考试成绩;
**如果未查到此学号的学生,提示信息为:"Not found!\n";
**如果查询到该学生
# 要求学号、姓名的输出格式为:"%ld\t%s\t"
# 要求成绩的输出格式为:"%.0f\t"
# 要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
**提示信息为:"Input the name you want to search:\n"
按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比:
**成绩<60输出提示格式为:"<60\t%d\t%.2f%%\n";
**成绩=100输出格式为:"%d\t%d\t%.2f%%\n";
**其他要求输出百分比格式为:"%d-%d\t%d\t%.2f%%\n"
**提示信息为: "For course %d:\n"
输出每个学生的学号、姓名、考试成绩,以及课程总分和平均分
**要求学号、姓名的输出格式为:"%ld\t%s\t"
**要求成绩的输出格式为:"%.0f\t"
**要求总分及平均分的输出格式为:"%.0f\t%.0f\n"
选择退出(菜单项0)
**提示信息:"End of program!"
菜单项选择错误(不在0-11之间)
**提示信息:"Input error!\n"
2.实验要求
采用自顶向下、逐步求精的模块化设计思想设计一个学生管理系统。要求按系统的需求分析、系统设计(总体设计、各个模块的设计)、系统实现(各个模块的实现)、系统测试等过程组织报告内容,说明采用了什么数据结构和算法,遇到哪些问题,这些问题是如何解决的,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会。
3.系统功能需求分析
学生成绩管理系统 V6.0
(1)录入每个学生的学号、姓名和各科考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分;
(4)按每个学生的总分由高到低排出名次表;
(5)按每个学生的总分由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名的字典顺序排出成绩表;
(8)按学号查询学生排名及其考试成绩;
(9)按姓名查询学生排名及其考试成绩;
(10)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;
(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;
(12)将每个学生的记录信息写入文件;
(13)从文件中读出每个学生的记录信息并显示。
要求程序运行后先显示如下菜单,并提示用户输入选项:
4.实验环境
采用了Windows 10 操作系统,使用了Codeblocks16.01的开发环境。
所需要函数库文件有<stdio.h>,<string.h>,<stdlib.h>。
系统设计
系统功能模块划分
下图是学生成绩管理系统V6.0的程序结构图
展示了该程序系统各个模块之间的结构图
2. 算法设计
<>1)2)3)
其中比较有亮点的是暗文密码输入系统,保证了输入的安全性。
3. 数据结构设计
3.1数据流图:
3.2顶层数据字典:
采用了结构体储存学生个人信息
#define MAX_LEN 10 /* 字符串最大长度 */
#define STU_NUM 30 /* 最多的学生人数 */
#define COURSE_NUM 6 /* 最多的考试科目数 */
typedef struct student
{
long num; /* 每个学生的学号 */
char name[MAX_LEN]; /* 每个学生的姓名 */
float score[COURSE_NUM]; /* 每个学生COURSE_NUM门功课的成绩 */
float sum; /* 每个学生的总成绩 */
float aver; /* 每个学生的平均成绩 */
} STU;
序号 |
字段名 |
字段含义 |
类型 |
长度 |
默认值 |
说明 |
|
num |
学生学号 |
long |
10 |
0
|
|
|
name |
学生的姓名 |
char [] |
10 |
|
|
|
score |
学生每门功课的成绩 |
float [] |
6 |
|
|
|
sum |
学生总成绩 |
float |
|
|
|
|
aver |
学生品均成绩 |
float |
|
|
|
|
stu |
储存学生信息的结构体 |
struct [] |
|
|
4.各模块(函数)的功能和接口设计:
4.1各个模块之间的逻辑关系图
模块逻辑关系图如下:
4.2各个模块的外部接口设计
学生成绩管理系统V6.0:
Main(void):
功能:完成学生数目,课程数目的录入,显示部分信息和函数调用的功能
参数:void
函数返回值:无
int Menu(void);
功能:显示主菜单
参数:void
函数返回值:a(使用者选择函数的功能序号)
void input(STU stu[],int stunum,int cosnum);
功能:录入每个学生的学号、姓名和各科考试成绩;
参数:
STU stu[]:存放学生信息的结构体
int stunum:学生数目的形参
int cosnum:课程数目的形参
函数返回值:无
void AverSumofEveryStudent(STU stu[], int n, int m);
功能:计算每门课程的总分和平均分;
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void AverSumofEveryCourse(STU stu[], int n, int m);
功能:计算每个学生的总分和平均分
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));
功能:按所给函数参数的顺序排出名次表
参数:
STU stu[]:存放学生信息的结构体
int n: 学生数目的形参
int m: 课程数目的形参
int (*compare)(float a,float b): 函数指针compare指向另一个两个浮点型形参的函数。
函数返回值:无
int Ascending(float a, float b);
功能:按每个学生的总分由低到高排出名次表
参数:
float a: 存放浮点类型数据形参
float b: 存放浮点类型数据形参
函数返回值:a<b
int Descending(float a, float b);
功能:按每个学生的总分由高到低排出名次表
参数:
float a: 存放浮点类型数据形参
float b: 存放浮点类型数据形参
函数返回值:a>b
void SwapFloat(float *x, float *y);
功能:交换两个浮点型数据的值
参数:
float *x: 存放浮点类型指针的形参
float *y: 存放浮点类型指针的形参
函数返回值:无
void SwapLong(long *x, long *y);
功能:交换两个长整型数据的值
参数:
long *x: 存放长整型类型指针的形参
long *y: 存放长整型类型指针的形参
函数返回值:无
void SwapChar(char x[], char y[]);
功能:交换两个字符串的内容
参数:
char x[]:存放字符串类型数据的形参
char y[]:存放字符串类型数据的形参
函数返回值:无
void AsSortbyNum(STU stu[], int n, int m);
功能:按学号由小到大排出成绩表;
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void SortbyName(STU stu[], int n, int m);
功能:按姓名的字典顺序排出成绩表
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void SearchbyNum(STU stu[], int n, int m);
功能:按学号查询学生排名及其考试成绩
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void SearchbyName(STU stu[], int n, int m);
功能:按姓名查询学生排名及其考试成绩
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void StatisticAnalysis(STU stu[], int n, int m);
功能:按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void PrintScore(STU stu[], int n, int m);
功能:输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void Writetofile(STU stu[],int n,int m);
功能:将每个学生的记录信息写入文件
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
void Readfromfile(STU stu[],int *n,int *m);
功能:从文件中读出每个学生的记录信息并显示
参数:
STU stu[]:存放学生信息的结构体
int m:学生数目的形参
int n:课程数目的形参
函数返回值:无
系统实现
1.系统的总流程图:
菜单驱动的系统的主流程一般为:
开始
|
输入学生数据
|
此学生的序数是否大于学生总数
|
从第一个学生开始排序
|
此学生成绩至少比前几位学生中一位成绩低?
|
交换与该学生位置
|
对下一位学生进行排序
|
结束
|
N
|
Y
|
N
|
Y
|
开始 |
输入所查找学生的学号 |
输入学号与该学生相同 |
从第一个学生的学号开始匹配 |
对下一位学生进行匹配 |
输出该学生的 学号 姓名 成绩 |
输出未查询到相关信息 |
结束 |
学号是否存在 |
Y |
N |
Y |
N |
开始 |
输入学生信息 |
目前学生数i+1 |
i达到最大值? |
输出插入后的信息 |
结束 |
Y |
N |
开始 |
输入学生信息 |
程序是否进行 |
回车键继续 |
输出学生学号姓名成绩 |
结束 |
Y |
N |
2.程序的全部源代码:
学生管理系统V6.0
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define MAX_PSD_LEN 20 #define MAX_LEN 10 /* 字符串最大长度 */ #define STU_NUM 30 /* 最多的学生人数 */ #define COURSE_NUM 6 /* 最多的考试科目数 */ typedef struct student { long num; /* 每个学生的学号 */ char name[MAX_LEN]; /* 每个学生的姓名 */ float score[COURSE_NUM]; /* 每个学生COURSE_NUM门功课的成绩 */ float sum; /* 每个学生的总成绩 */ float aver; /* 每个学生的平均成绩 */ } STU; inline int Menu(void) { int a; printf("======================Welcome to the to the student info manage system v6.0==========================\n"); printf("Management for Students' scores\n"); printf("1.Input record\n"); printf("2.Caculate total and average score of every course\n"); printf("3.Caculate total and average score of every student\n"); printf("4.Sort in descending order by score\n"); printf("5.Sort in ascending order by score\n"); printf("6.Sort in ascending order by number\n"); printf("7.Sort in dictionary order by name\n"); printf("8.Search by number\n"); printf("9.Search by name\n"); printf("10.Statistic analysis\n"); printf("11.List record\n"); printf("12.Write to a file\n"); printf("13.Read from a file\n"); printf("14.Sign up to Admin\n"); printf("0.Exit\n"); printf("=======================================================================================================\n"); printf("Please Input your choice:\n"); STAT : { int ret=scanf(" %d",&a); if(ret!=1) { printf("Input Error!\nPlease enter again:\n"); fflush(stdin); goto STAT; } } return a; } inline void input(STU stu[],int stunum,int cosnum) { int i,j; printf("Input student's ID, name and score:\n"); for (i=0; i< stunum; i++) { scanf("%ld%s",&stu[i].num,&stu[i].name); for(j=0; j<cosnum; j++) { scanf("%f",&stu[i].score[j]); } } for (i=0; i<stunum; i++) { for(j=0; j<cosnum; j++) { stu[i].sum+=stu[i].score[j]; } stu[i].aver=stu[i].sum/cosnum; } return 0; } inline void ReadScore(STU stu[], int n, int m) { } inline void AverSumofEveryStudent(STU stu[], int n, int m) { int i,j; for (i=0; i<n; i++) { printf("student %d: sum=%.0f,aver=%.0f\n",i+1,stu[i].sum,stu[i].aver); } return 0; } inline void AverSumofEveryCourse(STU stu[], int n, int m) { int i,j; float sum[COURSE_NUM]= {0},av[COURSE_NUM]= {0}; for (i=0; i<m; i++) { for(j=0; j<n; j++) { sum[i]+=stu[j].score[i]; } av[i]=sum[i]/n; printf("course %d:sum=%.0f,aver=%.0f\n",i+1,sum[i],av[i]); } return 0; } inline void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b)) { int i,j,k,ii; for(i=0; i<n-1; i++) { k=i; for(j=i+1; j<n; j++) { if((*compare)(stu[j].aver,stu[k].aver)) k=j; } if(k!=i) { SwapFloat(&stu[k].aver,&stu[i].aver); SwapFloat(&stu[k].sum,&stu[i].sum); SwapChar(stu[k].name,stu[i].name); SwapLong(&stu[k].num,&stu[i].num); for(ii=0; ii<m; ii++) { SwapFloat(&stu[k].score[ii],&stu[i].score[ii]); } } } return 0; } inline int Ascending(float a, float b) /*按每个学生的总分由高到低排出名次表*/ { return a<b; } inline int Descending(float a, float b) { return a>b; } inline void SwapFloat(float *x, float *y) { float t2; t2=*x; *x=*y; *y=t2; return 0; } inline void SwapLong(long *x, long *y) { long t1; t1=*x; *x=*y; *y=t1; return 0; } inline void SwapChar(char x[], char y[]) { char str[MAX_LEN]; strcpy(str,x); strcpy(x,y); strcpy(y,str); return 0; } inline void AsSortbyNum(STU stu[], int n, int m) { int i,j,k,ii; for(i=0; i<n-1; i++) { k=i; for(j=i+1; j<n; j++) { if(stu[j].num<stu[k].num) k=j; } if(k!=i) { SwapFloat(&stu[k].aver,&stu[i].aver); SwapFloat(&stu[k].sum,&stu[i].sum); SwapChar(stu[k].name,stu[i].name); SwapLong(&stu[k].num,&stu[i].num); for(ii=0; ii<m; ii++) { SwapFloat(&stu[k].score[ii],&stu[i].score[ii]); } } } return 0; } inline void SortbyName(STU stu[], int n, int m) { int i,j,k,ii; for(i=0; i<n-1; i++) { k=i; for(j=i+1; j<n; j++) { if(strcmp(stu[j].name,stu[k].name)<0) k=j; } if(k!=i) { SwapFloat(&stu[k].aver,&stu[i].aver); SwapFloat(&stu[k].sum,&stu[i].sum); SwapChar(stu[k].name,stu[i].name); SwapLong(&stu[k].num,&stu[i].num); for(ii=0; ii<m; ii++) { SwapFloat(&stu[k].score[ii],&stu[i].score[ii]); } } } } inline void SearchbyNum(STU stu[], int n, int m) { long number; int i,j,ii; printf("Input the number you want to search:\n"); scanf("%ld",&number); for(i=0; i<n; i++) { if(stu[i].num==number) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<m; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); return 0; } } printf("Not found!\n"); return 0; } inline void SearchbyName(STU stu[], int n, int m) { int i,j; char stuname[MAX_LEN]; printf("Input the name you want to search:\n"); scanf("%s",stuname); for(i=0; i<n; i++) { if(!strcmp(stuname,stu[i].name)) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<m; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); return 0; } } printf("Not found!\n"); return 0; } inline void StatisticAnalysis(STU stu[], int n, int m) { int i,j,total; for(j=0; j<m; j++) { int t[COURSE_NUM]= {0}; printf("For course %d:\n",j+1); for(i=0; i<n; i++) { if(stu[i].score[j]>=0&&stu[i].score[j]<60) t[0]++; else if(stu[i].score[j]<70) t[1]++; else if(stu[i].score[j]<80) t[2]++; else if(stu[i].score[j]<90) t[3]++; else if(stu[i].score[j]<100) t[4]++; else if(stu[i].score[j]==100) t[5]++; } for(i=0; i<6; i++) { if(i==0) printf("<60\t%d\t%.2f%%\n",t[i],(float)t[i]/n*100); else if(i==5) printf("%d\t%d\t%.2f%%\n",(i+5)*10,t[i],(float)t[i]/n*100); else { printf("%d-%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100); } } } return 0; } inline void PrintScore(STU stu[], int n, int m) { int i,j; for (i=0; i< n; i++) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<m; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } } inline void Writetofile(STU stu[],int n,int m) { FILE *fp; int i,j; if((fp=fopen("student.txt","w"))== NULL) { printf("Failure to open score.txt! \n"); exit(1); } fprintf(fp,"%d\t%d\n",n,m); for(i=0; i<n; i++) { fprintf(fp,"%10ld%10s",stu[i].num,stu[i].name); for(j=0; j<m; j++) { fprintf(fp,"%10.0f",stu[i].score[j]); } fprintf(fp,"%10.0f%10.0f\n",stu[i].sum,stu[i].aver); } fclose(fp); return 0; } inline void Readfromfile(STU stu[],int *n,int *m) { FILE *fp; int i,j; if((fp=fopen("student.txt","r"))== NULL) { printf("Failure to open score.txt! \n"); exit(1); } fscanf(fp,"%d\t%d",n,m); for(i=0; i<*n; i++) { fscanf(fp,"%10ld",&stu[i].num); fscanf(fp,"%10s",stu[i].name); for(j=0; j<*m; j++) { fscanf(fp,"%10f",&stu[i].score[j]); } fscanf(fp,"%10f%10f\n",&stu[i].sum,&stu[i].aver); } fclose(fp); return 0; } inline admin(STU stu[],int n,int m) { printf("========================Welcome to the to the admin version=========================\n"); printf("You have 2 options.\n"); printf("1.login.\n"); printf("2.exit.\n"); printf("3.change your password.\n"); printf("=====================================================================================\n"); char pw[MAX_PSD_LEN]="admin",pw2[MAX_PSD_LEN]="123456"; int a; char PassWord[MAX_PSD_LEN],*p=PassWord,ch; char PassWord1[MAX_PSD_LEN],*p1=PassWord1,*p2=pw2; int count=0; printf("Please select your option!\n"); scanf("%d",&a); if(a==1) { printf("Please Enter your password:\n"); ch=getch(); while(ch!=13&&count<MAX_PSD_LEN-1) /*当按下回车键或密码长度达到19,则退出循环*/ { if(ch==8) /*如果按下的是向前删除键,则...*/ { if(count) /*如果密码串中字符数大于零,则向前删除一个字符*/ { p--; count--; printf("\b ");/*光标回退一格,将星号(*)改为空格*/ printf("\b"); /*光标重新回退一格*/ } } else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0')) /*如果输入的是密码的有效字符*/ { printf("*"); /*输出一个星号*/ count++; *p=ch; /*记录密码内容*/ p++; } ch=getch(); /*等待输入下一个字符*/ } PassWord[count]=0; printf("\n"); if(strcmp(PassWord,pw)==0) { printf("You have successfully login!\n"); n=adminsystem(stu,n,m); return n; } else { printf("Your password isn't correct!\n"); return n; } } else if(a==2) { printf("You have successfully exit the Admin system!\n"); return n; } else if(a==3) { count=0; printf("Please enter your old password:\n"); ch=getch(); while(ch!=13&&count<MAX_PSD_LEN-1) /*当按下回车键或密码长度达到19,则退出循环*/ { if(ch==8) /*如果按下的是向前删除键,则...*/ { if(count) /*如果密码串中字符数大于零,则向前删除一个字符*/ { p--; count--; printf("\b ");/*光标回退一格,将星号(*)改为空格*/ printf("\b"); /*光标重新回退一格*/ } } else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0')) /*如果输入的是密码的有效字符*/ { printf("*"); /*输出一个星号*/ count++; *p=ch; /*记录密码内容*/ p++; } ch=getch(); /*等待输入下一个字符*/ } PassWord[count]=0; printf("\n"); if(strcmp(PassWord,pw)==0) { count=0; printf("Congratulations!Please enter your new password:\n"); ch=getch(); while(ch!=13&&count<MAX_PSD_LEN-1) /*当按下回车键或密码长度达到19,则退出循环*/ { if(ch==8) /*如果按下的是向前删除键,则...*/ { if(count) /*如果密码串中字符数大于零,则向前删除一个字符*/ { p2--; count--; printf("\b ");/*光标回退一格,将星号(*)改为空格*/ printf("\b"); /*光标重新回退一格*/ } } else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0')) /*如果输入的是密码的有效字符*/ { printf("*"); /*输出一个星号*/ count++; *p2=ch; /*记录密码内容*/ p2++; } ch=getch(); /*等待输入下一个字符*/ } pw2[count]=0; printf("\n"); printf("Please enter again:\n"); count=0; ch=getch(); while(ch!=13&&count<MAX_PSD_LEN-1) /*当按下回车键或密码长度达到19,则退出循环*/ { if(ch==8) /*如果按下的是向前删除键,则...*/ { if(count) /*如果密码串中字符数大于零,则向前删除一个字符*/ { p1--; count--; printf("\b ");/*光标回退一格,将星号(*)改为空格*/ printf("\b"); /*光标重新回退一格*/ } } else if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a')||(ch<='9'&&ch>='0')) /*如果输入的是密码的有效字符*/ { printf("*"); /*输出一个星号*/ count++; *p1=ch; /*记录密码内容*/ p1++; } ch=getch(); /*等待输入下一个字符*/ } PassWord1[count]=0; printf("\n"); if(!strcmp(PassWord1,pw2)) { strcpy(pw,PassWord1); printf("Your password has been successfully changed!\n"); return n; } else printf("tow times does NOT match!\n"); return n; } else { printf("Your password isn't correct!\n"); return n; } } else { printf("Input Error!\n"); return n; } } inline adminsystem(STU stu[],int n,int m) { int n1; long num; char x; printf("1.add a student info\t\n"); printf("2.delete a student info\t\n"); printf("3.exit\n"); scanf("%d",&n1); switch(n1) { case 1: { printf("please enter the student number you want to add:"); num=-1; while(num<0) { scanf("%ld",&num); printf("\n"); if(num<=0) printf("Input Error!\n""Please enter again:\n"); } int i,j; printf("Input to be added student's ID, name and score:\n"); for (i=0; i<num; i++) { scanf("%ld%s",&stu[n+i].num,&stu[n+i].name); for(j=0; j<m; j++) { scanf("%f",&stu[i+n].score[j]); } } for (i=0; i<num; i++) { for(j=0; j<m; j++) { stu[i+n].sum+=stu[i+n].score[j]; } stu[i+n].aver=stu[i+n].sum/m; n=n+num; return n; } break; case 2: { printf("Please enter the student's student number you want to delete:\n"); scanf("%ld",&num); int i,j; for(i=0; i<n; i++) { if(stu[i].num==num) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<m; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); printf("Are you SURE to delete(y/n)?\n"); scanf(" %c",&x); char name1[MAX_LEN]= {0}; if(x=='y'||x=='Y') { stu[i].num=0; strcpy(stu[i].name,name1); for(j=0; j<m; j++) stu[i].score[j]=0; stu[i].sum=0; stu[i].aver=0; return n=n-1; } else if(x=='n'||x=='N') { return n; } else printf("Input Error!\n"); return n; } } printf("Not found!\n"); return n; } break; case 3: return n; default: printf("Input Error!"); return n; } } } int main() { int stunum=-1,cosnum=-1; while(stunum<0||stunum>30) { printf("Input student number(n<=30):\n"); scanf("%d",&stunum); if(stunum<0||stunum>30) { printf("Input Error!Please Enter Again:\n"); } } while(cosnum<0||cosnum>6) { printf("Input course number(m<=%d):\n",COURSE_NUM); scanf("%d",&cosnum); if(cosnum<0||cosnum>6) { printf("Input Error!Please Enter Again:\n"); } } STU stu[STU_NUM]= {0}; int flag=1,a,i,j; while(flag) { a=Menu(); switch (a) { case 1: input(stu,stunum,cosnum); break; case 2: AverSumofEveryCourse(stu,stunum,cosnum); break; case 3: AverSumofEveryStudent(stu,stunum,cosnum); break; case 4: SortbyScore(stu,stunum,cosnum,Descending); printf("Sort in descending order by score:\n"); for (i=0; i< stunum; i++) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<cosnum; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } break; case 5: SortbyScore(stu,stunum,cosnum,Ascending); printf("Sort in ascending order by score:\n"); for (i=0; i< stunum; i++) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<cosnum; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } break; case 6: printf("Sort in ascending order by number:\n"); AsSortbyNum(stu,stunum,cosnum); for (i=0; i< stunum; i++) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<cosnum; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } break; case 7: printf("Sort in dictionary order by name:\n"); SortbyName(stu,stunum,cosnum); for (i=0; i< stunum; i++) { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0; j<cosnum; j++) printf("%.0f\t",stu[i].score[j]); printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } break; case 8: SearchbyNum(stu,stunum,cosnum); break; case 9: SearchbyName(stu,stunum,cosnum); break; case 10: StatisticAnalysis(stu,stunum,cosnum); break; case 11: PrintScore(stu,stunum,cosnum); break; case 12: Writetofile(stu,stunum,cosnum); break; case 13: Readfromfile(stu,&stunum,&cosnum); break; case 14: stunum=admin(stu,stunum,cosnum); break; case 0: printf("End of program!\n"); flag=0; exit(0); default: printf("Input error!\n"); } } return 0; }
系统测试
1.程序调试中遇到的问题和解决方法及思路
在调试过中,我并没有碰到一些难点问题。只是程序调试的过程中会出现一些小错误,我通过单步执行,一点点找到错误,分析出错误的原因,然后逐个地更正错误,最后让程序更加完善。
举个例子,在用户在菜单界面进行选择菜单输入数字时候,不小心输成了英文,这会使得scanf读取错误,系统会无限循环,进而造成程序安乐死。
于是,我通过使用scanf函数的return值来进行判断,是否带到要求,并同时用fflush(stdin)进行清空缓冲区,这样问题就完美解决了。
2.实验结果
略。
分析总结、收获和体会
通过这次C语言实验设计,我发现其实设计一个如此长的系统并不是一件非常难的事情,然而将这个系统完善好才是比较难的一件事。尤其是在Debug过程中出现了许多问题,有些问题,一找就是一两个小时,十分令人头疼。写程序容易改程序难啊!
在写程序的过程中,了解到了之前没学过的一些知识,比如
system(“cls”);是一个清屏函数;
getchar();是程序停滞时使用的;
学习编写了暗文密码的输入系统,原来我们平时日常生活中经常输入的账户密码看不见原来是这个原理;
学会了文件的基本操作;
inline (内联函数)的使用:内联函数的代码会在任何调用它的地方展开,使得程序占用内存空间更少;
采用了函数指针,将程序中的升序和降序两个函数抽象成一个独立的通用排序函数,使程序更加简洁,提高了程序的通用性,减少了重复代码。
在写程序的过程中我也总结出来了几点经验:
在程序的开始或者相关函数调用的时候增加一段错误处理代码。可以增加整个工程的容错性,提高程序的使用性能;
将程序中的绝对路径引用改为相对路径引用可以提高整个程序的移植性能;
多打备注有利于检查;
函数的模块化思想有利于程序的debug,也有利于提高程序的通用性,减少重复代码。
在这次设计中,我的优点不仅是将上述的经验和知识运用到我的代码中去,而且我也将程序写的非常标准,不省略任何一个return 0;对程序健壮性也做了优化,即使在输入菜单时不小心输入错了,程序也不会卡死,会重新让用户输入。
当然,在写代码的时候我也发现了我的许多不足,比如说一些基本功不扎实,老犯一些低级错误,导致程序出错,要解决这个问题,编程序的时候一定要细心,多看看书,多看些典型的算法,扎实基本功。还有一件重要的事情就是程序的美观性,以后的系统可以通过使用不同的颜色,不同的样式,更多的图片,来使得程序更加美观,让用户使用的时候心情舒畅。
完成这次大作业后,我不惧怕再编一个更长甚至更复杂的系统,只要静下心来,将系统划分成各个模块,分别击破,一个更宏大的操作系统就完成了,并非想象中的那么困难,原来我也可以编出这样的系统。将编程当做一件快乐的事情去做。
通往一名合格的程序员之路还有很长,在计算机编程中还有好多新的东西等待我们去探索,更底层的语言值得我们学习,更高级的语言值得我们去寻味。因此,我打算在今后的两年里面逐步学习JAVA,PYTHON,APP开发,汇编语言学习等等,极大地开发自己在计算机领域的兴趣。
要成为一名高级程序员,我还需要一路披荆斩棘,克服困难,不懈努力!
参考文献
[1] 苏小红,王宇颖,孙志岗.C语言程序设计(第3版)[M].北京:高等教育出版社.2015
[2] 苏小红,王宇颖,孙志岗.C语言程序设计学习指导(第3版)[M].北京:高等教育出版社.2015
[3] Stephen Prata.C Primer Plus中文版(第六版)[M].北京:人民邮电出版社.2016
1.编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
li:3
zhang:3
wang:2
Wrong election:2
#include<stdio.h> #include<string.h> #define TheNumberOfTheELECTORATE 10 #define TheNumberOfTheCANDIDATE 3 struct candidate { char name[20]; int count; }CANDIDATE[3]={"li",0,"zhang",0,"wang",0}; int main() { int i,j,flag=1,wrong=0; char name[20]; for(j=1;j<=TheNumberOfTheELECTORATE;j++) { printf("Input vote %d:",j); scanf("%s",name); strlwr(name); flag=1; for(i=0;i<TheNumberOfTheCANDIDATE;i++) { if(strcmp(name,CANDIDATE[i].name)==0) { CANDIDATE[i].count++; flag=0; } } if(flag) { wrong++; flag=0; } } printf("Election results:\n"); for(i=0;i<TheNumberOfTheCANDIDATE;i++) { printf("%8s:%d\n",CANDIDATE[i].name,CANDIDATE[i].count); } printf("Wrong election:%d\n",wrong); return 0; }
Q3134.(10分)第8章实验1:学生成绩管理系统V1.0
某班有最多不超过30人(具体人数由键盘输入)参加某门课程的考试,用一维数组作函数参数编程实现如下学生成绩管理:
(1)录入每个学生的学号和考试成绩;
(2)计算课程的总分和平均分;
(3)按成绩由高到低排出名次表;
(4)按学号由小到大排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比;
(7)输出每个学生的学号、考试成绩。
程序运行结果示例:
Input student number(n<30):
6↙
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
1↙
Input student's ID, name and score:
11003001 87↙
11003005 98↙
11003003 75↙
11003002 48↙
11003004 65↙
11003006 100↙
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
2↙
sum=473,aver=78.83
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
3↙
Sort in descending order by score:
11003006 100
11003005 98
11003001 87
11003003 75
11003004 65
11003002 48
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
4↙
Sort in ascending order by number:
11003001 87
11003002 48
11003003 75
11003004 65
11003005 98
11003006 100
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
5↙
Input the number you want to search:
11003004
11003004 65
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
6↙
<60 1 16.67%
60-69 1 16.67%
70-79 1 16.67%
80-89 1 16.67%
90-99 1 16.67%
100 1 16.67%
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
7↙
11003001 87
11003002 48
11003003 75
11003004 65
11003005 98
11003006 100
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
8↙
Input error!
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
0↙
End of program!
输入格式:
( 1 )录入学生的人数:
**输入数据格式:"%d"
**提示信息:"Input student number(n<30):\n"
( 2 )录入每个学生的学号和考试成绩:
**输入数据格式:"%ld%f"
**提示信息:"Input student's ID, name and score:\n"
输出格式:
菜单项的输出显示:
Management for Students' scores
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please Input your choice:
计算课程的总分和平均分:
**输出总分与平均分格式:"sum=%.0f,aver=%.2f\n"
按成绩由高到低排出名次表:
**输出格式:"%ld\t%.0f\n"
**提示信息:"Sort in descending order by score:\n"
按学号由小到大排出成绩表:
**输出格式:"%ld\t%.0f\n"
**提示信息:"Sort in ascending order by number:\n"
按学号查询学生排名及其考试成绩:
**如果未查到此学号的学生,提示信息:"Not found!\n"
**如果查询到该学生,输出格式:"%ld\t%.0f\n"
按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,统计每个类别的人数以及所占的百分比:
**成绩<60输出格式:"<60\t%d\t%.2f%%\n"
**成绩=100输出格式:"%d\t%d\t%.2f%%\n"
**其他输出百分比格式:"%d-%d\t%d\t%.2f%%\n"
#include"stdio.h" int input(unsigned long *p,float *q,int k) { int i,j; printf("Input student's ID, name and score:\n"); for (i=0;i< k;i++) scanf("%ld%f",p+i,q+i); return 0; } int cal(float *p,int k) { int i;float sum=0,av=0; for (i=0;i< k;i++) sum+=*(p+i); av=sum/k; printf("sum=%.0f,aver=%.2f\n",sum,av); return 0; } int swap(unsigned long *p,float *q,int i,int j) { unsigned long t1;float t2; t1=*(p+i); *(p+i)=*(p+j); *(p+j)=t1; t2=*(q+i); *(q+i)=*(q+j); *(q+j)=t2; return 0; } int sortsc(unsigned long *p,float *q,int k) { int i,j,max; for (i=0;i< k-1;i++) { max=i; for (j=i+1;j< k;j++) if (*(q+j)>*(q+max)) max=j; swap(p,q,i,max); } return 0; } int sortst(unsigned long *p,float *q,int k) { int i,j,max; for (i=0;i< k-1;i++) { max=i; for (j=i+1;j< k;j++) if (*(p+j)<*(p+max)) max=j; swap(p,q,i,max); } return 0; } int sebn(unsigned long *p,float *q,int k) { unsigned long sc; int i,ans=k; printf("Input the number you want to search:\n"); scanf("%ld",&sc); for (i=0;i< k;i++) if (*(p+i)==sc) ans=i; if (ans!=k) printf("%ld\t%.0f\n",*(p+ans),*(q+ans)); else printf("Not found!\n"); return 0; } int stan(float *q,int k) { int num[6],i; for (i=0;i< 6;i++) num[i]=0; for (i=0;i< k;i++) { if (*(q+i)>99) {num[0]++;continue;} if (*(q+i)>89) {num[1]++;continue;} if (*(q+i)>79) {num[2]++;continue;} if (*(q+i)>69) {num[3]++;continue;} if (*(q+i)>59) {num[4]++;continue;} {num[5]++;} } printf("<60\t%d\t%.2f%%\n",num[5],100.0*num[5]/k); printf("60-69\t%d\t%.2f%%\n",num[4],100.0*num[4]/k); printf("70-79\t%d\t%.2f%%\n",num[3],100.0*num[3]/k); printf("80-89\t%d\t%.2f%%\n",num[2],100.0*num[2]/k); printf("90-99\t%d\t%.2f%%\n",num[1],100.0*num[1]/k); printf("100\t%d\t%.2f%%\n",num[0],100.0*num[0]/k); return 0; } int main() { int n,flag=1,a,i; float sc[30]; unsigned long st[30]; printf("Input student number(n<30):\n"); scanf("%d",&n); while(flag) { printf("Management for Students' scores\n"); printf("1.Input record\n"); printf("2.Caculate total and average score of course\n"); printf("3.Sort in descending order by score\n"); printf("4.Sort in ascending order by number\n"); printf("5.Search by number\n"); printf("6.Statistic analysis\n"); printf("7.List record\n"); printf("0.Exit\n"); printf("Please Input your choice:\n"); scanf("%d",&a); switch (a) { case 1: input(st,sc,n); break; case 2: cal(sc,n); break; case 3: sortsc(st,sc,n); printf("Sort in descending order by score:\n"); for (i=0;i< n;i++) printf("%ld\t%.0f\n",st[i],sc[i]); break; case 4: sortst(st,sc,n); printf("Sort in ascending order by number:\n"); for (i=0;i< n;i++) printf("%ld\t%.0f\n",st[i],sc[i]); break; case 5: sebn(st,sc,n); break; case 6: stan(sc,n); break; case 7: for (i=0;i< n;i++) printf("%ld\t%.0f\n",st[i],sc[i]); break; case 0: flag=0; printf("End of program!\n"); break; default: printf("Input error!\n"); } } return 0; }
1.
//编程实现找出字符串中最大字符元素并输出该元素及其对应的ASCII值. //****要求输入提示信息为: //"Input a string:\n" //****输出格式要求为: //"The largest character of \"%s\" is \'%c\' ,The ASCII is %d." #define N 100 #include<stdio.h> #include<string.h> main() { printf("Input a string:\n"); char c[N]; gets(c); char d=c[0]; int i; for(i=1;i<=strlen(c);i++) { if(d<c[i]) d=c[i]; } printf("The largest character of \"%s\" is \'%c\' ,The ASCII is %d.",c,d,d); }
2.
按如下函数原型编程计算并输出n×n阶矩阵的转置矩阵。其中,n由用户从键盘输入。已知n值不超过10。
void Transpose(int (*a)[N], int n);
void Swap(int *x, int *y);
void InputMatrix(int (*a)[N], int n);
void PrintMatrix(int (*a)[N], int n);
输入提示信息:"Input n:"
输入格式:"%d"
输入提示信息:"Input %d*%d matrix:\n"
输出提示信息:"The transposed matrix is:\n"
输出格式:"%d\t"
#include <stdio.h> #define N 10 void Swap(int *x, int *y); void Transpose(int (*a)[N], int n); void InputMatrix(int (*a)[N], int n); void PrintMatrix(int (*a)[N], int n); int main() { int s[N][N], n; printf("Input n:"); scanf("%d", &n); InputMatrix(s, n); Transpose(s, n); printf("The transposed matrix is:\n"); PrintMatrix(s, n); return 0; } /* 函数功能:交换两个整型数的值 */ void Swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } /* 函数功能:计算n*n矩阵的转置矩阵 */ void Transpose(int (*a)[N], int n) { int i, j; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { Swap(*(a + i) + j, *(a + j) + i); } } } /* 函数功能:输入n*n矩阵的值 */ void InputMatrix(int (*a)[N], int n) { int i, j; printf("Input %d*%d matrix:\n", n, n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", *(a + i) + j); } } } /* 函数功能:输出n*n矩阵的值 */ void PrintMatrix(int (*a)[N], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d\t", *(*(a + i) + j)); } printf("\n"); } }
我的代码
#include<stdio.h> #define N 10 void Transpose(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { Swap(*(a+i)+j,*(a+j)+i); } } } void Swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } void InputMatrix(int (*a)[N], int n) { printf("Input %d*%d matrix:\n",n,n); int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%d\t",*(*(a+i)+j)); } printf("\n"); } } main() { int n=100,s[N][N]= {0}; printf("Input n:"); do { scanf("%d",&n); } while(n>10); InputMatrix(s,n); Transpose(s,n); printf("The transposed matrix is:\n"); PrintMatrix(s,n); return 0; }
我个人认为,我的代码比答案还要简单,因为减少了一步不必要的计算,因此,运算时间会短一些。效率会高些!
for(j=i; j<n; j++)
其实如果要直接输出转置矩阵,还有更简便的做法:
即:输出先j后i!无论是代码量还是计算量,都少了一大截!!!
#include<stdio.h> #define N 10 void InputMatrix(int (*a)[N], int n) { printf("Input %d*%d matrix:\n",n,n); int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%d\t",*(*(a+j)+i)); } printf("\n"); } } main() { int n=100,s[N][N]= {0}; printf("Input n:"); do { scanf("%d",&n); } while(n>10); InputMatrix(s,n); printf("The transposed matrix is:\n"); PrintMatrix(s,n); return 0; }
题外话:
有句mmp今天一定要讲。这种题出的简直就是多此一举
因为
我们可以认为: int (*a)[]=int a [][]
int b[4][4]={0}; int (*a)[4]=b; int b[4][4]={0}; int *a[4]; a[0]=b[0]; 就是说 int *a[n]是指针数组(也就是说其本质上是数组,但里面存放的都是指针) int (*a)[n]是数组指针(本质上是一个指针,而且是一个指向数组的指针)
第一部分:
a的类型是int[4],a[0]的类型是int;a是指向int[4]的指针
int (*a)[4]=b;指的是a指向的是int [4],然后把b的第一行地址赋给他
就是直接拷贝了首元素地址
第二部分很好理解
就是把b[0]的首行地址给a[4];
其实这种题完全可以用数组的方法做,看起来更加简洁,效率也几乎一样
#include<stdio.h> #include<string.h> #define N 4 int convertmatrix(int m[N][N]) { int i,j,temp; for(i=0;i<N;i++) { for(j=i+1;j<N;j++) { temp=m[i][j]; m[i][j]=m[j][i]; m[j][i]=temp; } } return 0; } int main() { int matrix[N][N]; int i,j; printf("请输入一个%d*%d的矩阵:\n",N,N); for(i=0;i<N;i++) { for(j=0;j<N;j++) { scanf("%d",&matrix[i][j]); } } convertmatrix(matrix); for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%-3d",matrix[i][j]); } printf("\n"); } return 0; }
用指针编简直就是在浪费时间
所以。。。。
还有一种做法:
#include<stdio.h> #include<string.h> #define N 4 int convertmatrix(int m[N][N]) { int i,j,temp; for(i=0;i<N;i++) { for(j=i+1;j<N;j++) { temp=m[i][j]; m[i][j]=m[j][i]; m[j][i]=temp; } } return 0; } int main() { int matrix[N][N]; int i,j; printf("请输入一个%d*%d的矩阵:\n",N,N); for(i=0;i<N;i++) { for(j=0;j<N;j++) { scanf("%d",&matrix[i][j]); } } convertmatrix(matrix); for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%-3d",matrix[i][j]); } printf("\n"); } return 0; }
另外一个比较类似的问题:
用指向一维数组的指针变量即二维数组的行指针作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void InputMatrix(int (*a)[N], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
输入提示信息:"Input m, n:"
输入格式:"%d,%d"
输入提示信息:"Input %d*%d matrix:\n"
输出提示信息和格式:"The transposed matrix is:\n"
输出格式:"%d\t"
#include<stdio.h> #define M 10 #define N 10 void Transpose(int (*a)[N], int (*at)[M], int m, int n); void InputMatrix(int (*a)[N], int m, int n); void PrintMatrix(int (*at)[M], int n, int m); int main() { int s[M][N],st[N][M],m,n; printf("Input m, n:"); scanf("%d,%d",&m,&n); InputMatrix(s,m,n); Transpose(s,st,m,n); printf("The transposed matrix is:\n"); PrintMatrix(st,n,m); return 0; } void Transpose(int (*a)[N], int (*at)[M], int m, int n) { int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) { *(*(at+j)+i)=*(*(a+i)+j); } } } void InputMatrix(int (*a)[N], int m, int n) { int i,j; printf("Input %d*%d matrix:\n",m,n); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*at)[M], int n, int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%d\t",*(*(at+i)+j)); } printf("\n"); } }
3.
从键盘任意输入一个整型表示的月份值,用指针数组编程输出该月份的英文表示,若输入的月份值不在1~12之间,则输出“Illegal month”。
**输入格式要求:"%d" 提示信息:"Input month number:"
**输出格式要求:"month %d is %s\n"
"Illegal month", "January", "February", "March", "April", "May", "June", "July", August", "September", "October", "November", "December"
程序运行示例1如下:
Input month number:5
month 5 is May
程序运行示例2如下:
Input month number:13
Illegal month
#include<stdio.h> int main() { int n; static char*monthName[]={"Illegal month", "January", "February", "March", "April", "May", "June", "July", “August", "September", "October", "November", "December"}; printf("Input month number:"); scanf("%d",&n); if((n<=12)&&(n>=1)) printf("month %d is %s\n",n,monthName[n]); else printf("%s\n",monthName[0]); return 0; }
4.
#include <stdio.h> #define ROW 2 #define COL 3 void main() { int a[ROW][COL], b[COL][ROW], c[ROW][ROW], i, j,k; printf("Input 2*3 matrix a:\n"); for (i=0; i<ROW ;i++) { for (j=0; j<COL; j++) { scanf("%d", &a[i][j]); } } printf("Input 3*2 matrix b:\n"); for (i=0; i<COL; i++) { for (j=0; j<ROW; j++) { scanf("%d", &b[i][j]); } } for (i=0; i<ROW; i++) { for (j=0; j<ROW; j++) { c[i][j] = 0 ; for (k=0; k<COL; k++) { c[i][j] = c[i][j]+a[i][k]*b[k][j] ; } } } printf("Results:\n"); for (i=0; i<ROW; i++) { for (j=0; j<ROW; j++) { printf("%6d", c[i][j]); } printf("\n") ; } }
本次内容到此全部结束
Before we go:
Hello大家好,好长时间没写程序了,不知道是不是手生了还是题目越来越难了,零分我真是越来越多了。
所以我将这些程序分享给大家
希望大家少走点弯路,也避免我以后忘记这些东西。
1.假设有40个学生被邀请来给餐厅的饮食和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),编程统计并按如下格式输出餐饮服务质量调查结果。
Grade Count Histogram
1 5 *****
2 10 **********
3 7 *******
...
**输入格式要求:"%d" 提示信息:"Input the feedbacks of 40 students:\n" "input error!\n"
**输出格式要求:"Feedback\tCount\tHistogram\n" "%8d\t%5d\t"
程序运行示例如下:
Input the feedbacks of 40 students:
10 9 10 8 7 6 5 10 9 8
8 9 7 6 10 9 8 8 7 7
6 6 8 8 9 9 10 8 7 7
9 8 7 9 7 6 5 9 8 7
Feedback Count Histogram
1 0
2 0
3 0
4 0
5 2 **
6 5 *****
7 9 *********
8 10 **********
9 9 *********
10 5 *****
#include<stdio.h> main(){ printf("Input the feedbacks of 40 students:\n"); int i,s[40]={0}; int ret; for(i=0;i<40;i++){ ret =scanf("%d",&s[i]); if(ret!=1||s[i]<1||s[i]>10) { i--; printf("input error!\n"); } } printf("Feedback\tCount\tHistogram\n"); int a[10]={0},j; for(i=0;i<40;i++){ for(j=0;j<10;j++) { if(s[i]==j+1) a[j]++; } } for(i=0;i<10;i++) { printf("%8d\t%5d\t",i+1,a[i]); for(j=0;j<a[i];j++) { printf("*"); } printf("\n"); } }
2.如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(亦称为自恋性数)。如407=4^3+0^3+7^3就是一个阿姆斯特朗数。试编程求1000内的所有3位数的阿姆斯特朗数。
**输出格式要求:"There are following Armstrong number smaller than 1000:\n" " %d "
程序运行示例如下:
There are following Armstrong number smaller than 1000:
153 370 371 407
\\这道题比较简单,但是要注意不要使用pow函数,否则会有精度误差! #include<stdio.h> #include<stdio.h> main() { printf("There are following Armstrong number smaller than 1000:\n"); int i,j,k,f; int a[10]={0,1,2,3,4,5,6,7,8,9},b[10]={0,1,2,3,4,5,6,7,8,9},c[10]={0,1,2,3,4,5,6,7,8,9}; for(i=0;i<10;i++) { for(j=0;j<10;j++) { for(k=0;k<10;k++) { if(a[i]*100+b[j]*10+c[k]==powl(i,3)+powl(j,3)+powl(k,3)&&a[i]*100+b[j]*10+c[k]>1) printf(" %d ",a[i]*100+b[j]*10+c[k]); } } } }
3.输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。
**输入提示信息:"Enter a string: "
**输出格式要求:"digit = %d\n"
程序运行示例如下:
Enter a string: 123
digit = 123
#include <stdio.h> int main(void) { int i, n; char s[10]; /* 输入字符串 */ printf("Enter a string: "); /* 输入提示 */ i = 0; while ((s[i] = getchar( )) != '\n') i++; s[i] = '\0'; /* 将字符串转换为整数 */ n = 0; for (i = 0; s[i] != '\0'; i++) if (s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else /* 遇非数字字符结束转换 */ break; printf("digit = %d\n", n); return 0; }
4.走台阶
楼梯有10阶台阶,上楼可以一步上1阶,也可以1步上2阶,编程计算10阶台阶总共有多少走法.
提示:可以递推计算,如1阶台阶总共一种走法,2阶台阶总共2走法,3阶台阶总共3种走法,直到计算出10阶台阶走法.
输入格式:无
输出格式:"Result=%d"
这类题一看就知道是与递归有关的问题,因此我们很容易用递归解决这道题
#include<stdio.h> int f( int n ) { if ( n == 1 ) { return 1; } else if ( n == 2 ) { return 2; } else { return f(n-1) + f(n-2); } } int main() { int num = f( 10 ); printf("Result=%d",num); return 0; }
5.选择排序法。
用选择排序法将N(N为5)个数从小到大排序后输出。
**输入格式要求:"%d" 提示信息:"Enter No.%2d:"
**输出格式要求:"%d"
程序运行示例如下:
Enter No. 1:5
Enter No. 2:7
Enter No. 3:3
Enter No. 4:9
Enter No. 5:8
35789
解法1:冒泡排序法
main() { int s[N]={0},i,j,a; for(i=0;i<N;i++) { printf("Enter No.%2d:",i+1); scanf("%d",&s[i]); } for(j=0;j<N;j++) { for(i=0;i<N;i++) { if(s[i]>s[i+1]) { a=s[i]; s[i]=s[i+1]; s[i+1]=a; } } } for(i=0;i<N;i++) { printf("%d",s[i]); } }
几何表示:
解法2:选择排序法
#include<stdio.h> #define N 5 main() { int a[N]= {0},i,j,min,k; for(i=0; i<N; i++) { printf("Enter No.%2d:",i+1); scanf("%d",&a[i]); } for ( i = 0; i <N; i ++ ) { k = i; for ( j = i + 1; j < N; j ++) { if ( a[ k ] > a[ j ] ) k = j; } if(k!=i) { min = a[ i ]; a[ i ] = a[ k ]; a[ k ] = min; } } for(i=0; i<N; i++) { printf("%d\n",a[i]); } }
几何表示:
1.前言
这是属于计算机组成原理的东西,越感觉需要把C语言和数据结构学好,所以今天在次与大家分享有关C语言中的按位与(&)按位或(|)按位异或(^)取反(~)。
由于这些运算符号都是基于二进制来说的,所以十进制的计算都需要转换成二进制。下面我们就来介绍一下二进制和十进制之间的转换:
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13转化成十进制要从右到左用二进制的每个数去乘以2的相应次方
不过次方要从0开始
十进制整数转二进制
如:255=(11111111)B
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
=== 1. and(&)运算 ===
and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
00111 11100 (&或者and) ---------------- 00100
=== 2. or(|)运算 ===
or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。
00111 11100 (|或者or) ---------------- 11111
=== 3. xor(^)运算 ===
异或的符号是⊕。
xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
相同位不同则为1,相同则为0。
=== 4.~取反===
就是如果是00111,则变为11000
*****左移位运算符*****
将一个数左移1位,相当于将该数乘以2;
左移2位相当于将该数乘以4,即左边数乘以2的右边数幂的积
eg. 9<<3 的结果是:72 相当于9*2*2*2
*****右移位运算符*****(两边都是正数)
将一个数带符号右移1位,相当于将该数除以2(忽略余数);
带符号右移2位,相当于将该数除以4,即左边数除以2的右边数幂的商
eg. 9>>1 的结果是:4 相当于9/2(忽略余数)
当左边的数字小于右边的数时,结果为0(两边都是正数)
当左边的数小于0时,结果为:左边数的绝对值除以2的右边数幂的商的相反数-1
eg. -9>>2的结果是:-3 相当 于-(9/(2*2))-1
以上是所有内容,希望对大家有所帮助。
1.
The Sarcophagus itself is locked by a secret numerical code. When somebody wants to open it, he must know the code and set it exactly on the top of the Sarcophagus. A very intricate mechanism then opens the cover. If an incorrect code is entered, the tickets inside would catch fire immediately and they would have been lost forever. The code (consisting of up to 100 integers) was hidden in the Alexandrian Library but unfortunately, as you probably know, the library burned down completely.
But an almost unknown archaeologist has obtained a copy of the code something during the 18th century. He was afraid that the code could get to the ``wrong people'' so he has encoded the numbers in a very special way. He took a random complex number B that was greater (in absolute value) than any of the encoded numbers. Then he counted the numbers as the digits of the system with basis B. That means the sequence of numbers an, an-1, ..., a1, a0 was encoded as the number X = a0 + a1B + a2B2 + ...+ anBn.
Your goal is to decrypt the secret code, i.e. to express a given number X in the number system to the base B. In other words, given the numbers X and Byou are to determine the ``digit'' a0 through an.
Input
The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case consists of one single line containing four integer numbers Xr, Xi, Br, Bi (|Xr|,|Xi| <= 1000000, |Br|,|Bi| <= 16). These numbers indicate the real and complex components of numbers X and B, i.e. X = Xr + i.Xi, B = Br + i.Bi. B is the basis of the system (|B| > 1), X is the number you have to express.
Output
Your program must output a single line for each test case. The line should contain the ``digits'' an, an-1, ..., a1, a0, separated by commas. The following conditions must be satisfied:
If there are no numbers meeting these criteria, output the sentence "The code cannot be decrypted.
. If there are more possibilities, print any of them.
4 -935 2475 -11 -15 1 0 -3 -2 93 16 3 2 191 -192 11 -12
8,11,18 1 The code cannot be decrypted. 16,15
十一月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |