元旦接到同学的请求,帮他做了个C语言的期末作业,展示如下
学生信息管理
大概就是用结构来读取数据,处理再输出
我的做法是这样的
#include<stdio.h>
#include<string.h>
//一项成绩
typedef struct Score{
char name[31];
int score;
}Score;
//学生成绩结构
typedef struct Transcript{
int n;//成绩科数
Score list[10];
}Transcript;
//学生信息结构
typedef struct Student{
int stuno;
char fullname[21];
int age;
struct Transcript transcript;
}Student;
int Q1functionname(Student list[]);//从文件读取学生信息
void Q2functionname(Student list[],int n);//对学生按年龄排序
void Q2sortbystuno(Student list[],int n);//按学号排序(之前按年龄,现在变回去)
void Q3functionname(Student list[],int n);//从文件获取学生成绩
int Q3findbystuno(Student list[],int stuno,int n);//根据学号找坐标
double Q4functionname(Student list[],int n);//计算平均成绩
void Q5functionname(Student list[],int n);//处理输出学生成绩数据
int main(){
Student list[100]={{.transcript.n=0}};
int n,i,j,k;
n=Q1functionname(list);
Q2functionname(list,n);
for(i=0;i<n;i++){
printf("%d %s %d\n",list[i].stuno,list[i].fullname,list[i].age);
}
Q2sortbystuno(list,n);
printf("\n");
Q3functionname(list,n);
for(i=0;i<n;i++){
k=list[i].transcript.n;
for(j=0;j<k;j++){
printf("%d %s %d\n",list[i].stuno,list[i].transcript.list[j].name,list[i].transcript.list[j].score);
}
}
printf("%lf\n",Q4functionname(list,n));
Q5functionname(list,n);
return 0;
}
int Q1functionname(Student list[]){
FILE *fpin;
int i;
char firstname[10],lastname[10];
fpin=fopen("stu.txt","r");
i=0;
while(fscanf(fpin,"%d %s %s %d",&list[i].stuno,firstname,lastname,&list[i].age)!=EOF){
strcat(list[i].fullname,firstname);
strcat(list[i].fullname," ");
strcat(list[i].fullname,lastname);
i++;
}
fclose(fpin);
return i;
}
void Q2functionname(Student list[],int n){
int i,j,k;
Student t;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(list[k].age>list[j].age){
k=j;
}
}
if(k!=i){
t=list[i];
list[i]=list[k];
list[k]=t;
}
}
}
void Q2sortbystuno(Student list[],int n){
int i,j,k;
Student t;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(list[k].stuno>list[j].stuno){
k=j;
}
}
if(k!=i){
t=list[i];
list[i]=list[k];
list[k]=t;
}
}
}
void Q3functionname(Student list[],int n){
FILE *fpin;
int i,stuno,index,sum;
char s[11];
fpin=fopen("records.txt","r");
while(fscanf(fpin,"%d",&stuno)!=EOF){
index=Q3findbystuno(list,stuno,n);
i=0;
sum=0;
while(1){
fscanf(fpin,"%s",s);
if(s[0]>='0' && s[0]<='9'){
break;
}
else{
strcat(list[index].transcript.list[list[index].transcript.n].name,i==0?"":" ");
strcat(list[index].transcript.list[list[index].transcript.n].name,s);
}
i++;
}
for(i=0;s[i]!='\0';i++){
sum=sum*10+(s[i]-'0');
}
list[index].transcript.list[list[index].transcript.n].score=sum;
list[index].transcript.n++;
}
fclose(fpin);
}
int Q3findbystuno(Student list[],int stuno,int n){
int i;
for(i=0;i<n;i++){
if(list[i].stuno==stuno){
return i;
}
}
}
double Q4functionname(Student list[],int n){
int i,j,k=0;
double ans=0;
for(i=0;i<n;i++){
for(j=0;j<list[i].transcript.n;j++){
if(strcmp(list[i].transcript.list[j].name,"The C Programming")==0){
ans+=list[i].transcript.list[j].score;
k++;
break;
}
}
}
ans/=k;
return ans;
}
void Q5functionname(Student list[],int n){
FILE *fpout;
fpout=fopen("2053624.txt","w");
int i,j;
for(i=0;i<n;i++){
for(j=0;j<list[i].transcript.n;j++){
fprintf(fpout,"%d %s %d ",list[i].stuno,list[i].transcript.list[j].name,list[i].transcript.list[j].score);
if(list[i].transcript.list[j].score<40){
fprintf(fpout,"Not pass\n");
}
else if(list[i].transcript.list[j].score>=40 && list[i].transcript.list[j].score<=44){
fprintf(fpout,"Ordinary Degree(Pass)\n");
}
else if(list[i].transcript.list[j].score>=45 && list[i].transcript.list[j].score<=49){
fprintf(fpout,"Third Class Degree\n");
}
else if(list[i].transcript.list[j].score>=50 && list[i].transcript.list[j].score<=59){
fprintf(fpout,"Lower-second Class Degree\n");
}
else if(list[i].transcript.list[j].score>=60 && list[i].transcript.list[j].score<=69){
fprintf(fpout,"Upper-second Class Degree\n");
}
else if(list[i].transcript.list[j].score>=70 && list[i].transcript.list[j].score<=100){
fprintf(fpout,"First Honors Degree\n");
}
}
}
fclose(fpout);
}
破解迷宫
简单来说就是找迷宫的路线,没有就返回“No path”
一般做法就是暴力回溯(一个作业没必要用太高级的算法),我用来两个结构来嵌套,回溯时省去了许多不必要的麻烦。代码如下
#include <stdio.h>
//起点默认是最上方,终点最下方,当然也可以改,不过程序也要做相应的调整
typedef struct{//一个点坐标
int x,y;
}Point;
typedef struct{//可能的路线以及他们的下一步
int x,y;
int listnum;
Point list[8];
}Route;
int getData(int board[][100]);//获取数据,置入二维数组,返回宽度
void printBoard(int board[][100],int n);//输出迷宫
int crackTheMaze(int board[][100],int n);//破解迷宫
void getRoute(int board[][100],int n,Route route[],int routeNum);//获取可能的下一步
int nextPoint(int board[][100],int n,Route route[],int routeNum);//走到下一步
int back(int board[][100],int n,Route route[],int routeNum);//如果下一步没有路线,回退
int main(){
int board[100][100]={{0}};
int n,i,j,ans;
n=getData(board);
printBoard(board,n);
ans=crackTheMaze(board,n);
if(ans!=-1){
printf("\n");
printBoard(board,n);
printf("%d steps",ans);
}
else{
printf("No path!\n");
}
return 0;
}
int getData(int board[][100]){
FILE *fpin;
int i=0,j,n;
char t;
fpin=fopen("aaa.txt","r");
while(fscanf(fpin,"%c",&t) && t!='\n'){
board[0][i]=t-'0';
i++;
}
n=i;
for(i=1;i<n;i++){
for(j=0;j<n;j++){
fscanf(fpin,"%c",&t);
if(t=='\n'){
fscanf(fpin,"%c",&t);
board[i][j]=t-'0';
}
board[i][j]=t-'0';
}
}
fclose(fpin);
return n;
}
void printBoard(int board[][100],int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(board[i][j]==1){
printf("F ");
}
else if(board[i][j]==0){
printf("Y ");
}
else if(board[i][j]==3){
printf("R ");
}
}
printf("\n");
}
printf("\n");
}
int crackTheMaze(int board[][100],int n){
Route route[10000]={{.listnum=0}};
int routeNum,i,j;
route[0].x=0;
route[0].y=0;
board[0][0]=3;
routeNum=1;
int num=0;
while(1){
if(route[routeNum-1].x==n-1 && route[routeNum-1].y==n-1){
return num;
}
getRoute(board,n,route,routeNum);
while(route[routeNum-1].listnum==0){
if(routeNum==1 && route[0].listnum==0){
return -1;
}
routeNum=back(board,n,route,routeNum);
num--;
}
routeNum=nextPoint(board,n,route,routeNum);
num++;
}
}
void getRoute(int board[][100],int n,Route route[],int routeNum){
int x,y;
x=route[routeNum-1].x;
y=route[routeNum-1].y;
if(x-1>=0 && y-1>=0 && board[x-1][y-1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x-1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y-1;
route[routeNum-1].listnum++;
}
if(x<n && y-1>=0 && board[x][y-1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x;
route[routeNum-1].list[route[routeNum-1].listnum].y=y-1;
route[routeNum-1].listnum++;
}
if(x-1>=0 && y<n && board[x-1][y]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x-1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y;
route[routeNum-1].listnum++;
}
if(x+1<n && y-1>=0 && board[x+1][y-1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x+1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y-1;
route[routeNum-1].listnum++;
}
if(x-1>=0 && y+1<n && board[x-1][y+1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x-1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y+1;
route[routeNum-1].listnum++;
}
if(x+1<n && y<n && board[x+1][y]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x+1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y;
route[routeNum-1].listnum++;
}
if(x<n && y+1<n && board[x][y+1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x;
route[routeNum-1].list[route[routeNum-1].listnum].y=y+1;
route[routeNum-1].listnum++;
}
if(x+1<n && y+1<n && board[x+1][y+1]==0){
route[routeNum-1].list[route[routeNum-1].listnum].x=x+1;
route[routeNum-1].list[route[routeNum-1].listnum].y=y+1;
route[routeNum-1].listnum++;
}
}
int nextPoint(int board[][100],int n,Route route[],int routeNum){
int x,y;
x=route[routeNum-1].list[route[routeNum-1].listnum-1].x;
y=route[routeNum-1].list[route[routeNum-1].listnum-1].y;
route[routeNum-1].listnum--;
board[x][y]=3;
route[routeNum].x=x;
route[routeNum].y=y;
routeNum++;
return routeNum;
}
int back(int board[][100],int n,Route route[],int routeNum){
board[route[routeNum-1].x][route[routeNum-1].y]=0;
routeNum--;
return routeNum;
}
这个迷宫的测试案例时用的自动生成,也就是我首页那个迷宫游戏的算法,只是那个是js,而这是c生成的,下一次我讲解一下迷宫生成的算法
谢谢阅读