记一次简单的C语言大作业

元旦接到同学的请求,帮他做了个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生成的,下一次我讲解一下迷宫生成的算法

谢谢阅读

本文作者: 小世炎
本文链接: https://blog.xiaoshiyan.top/archives/189
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议 转载请注明出处!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇