c语言 课设1 《考试宝典》

该博客展示了一个用C语言编写的考试宝典程序。程序包含创建题目结构体、读取txt文件、生成随机不重复数字等功能,能从题库中随机抽取题目进行考试,记录答题成绩和时间,并将结果写入日志文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define max 100
#define len 5
#define lens 20
typedef struct Que{
    int id;
    char que[max];
    char a[max];
    char b[max];
    char c[max];
    char d[max];
    char ans[max];
    struct Que*next;
}que;

1.创建每个题目的结构体

int ids=1;
que* reading(){
    char ch[max];//每一行 
    FILE*fp=fopen("《西游记》程序设计期末考试.txt","r");
    que*head=(que*)malloc(sizeof(que));//表头 
    que*s;
    head->next=NULL;
    head->id=-1;
    strcpy(    head->que,"请选择你的科目");
    strcpy(    head->a,"1.C语言");
    strcpy(    head->b,"2.英语");
    strcpy(    head->c,"3.日语");
    strcpy(    head->d,"4.高数");
    strcpy(    head->ans,"");
    s=head;
    if(NULL==fp){
        printf("no\n");
        return NULL;
    }
    while(NULL!=fgets(ch,max,fp)){
        que*newque;
        if(ch[0]=='#'&&ch[1]!='#'){
            //title
            newque=(que*)malloc(sizeof(que));
            newque->id=ids;
            ids++;
            strcpy(newque->que,&ch[1]);
            newque->next=NULL;
            if(head->next==NULL){
                head->next=newque;
            }else{
                s->next=newque;
            }
            s=newque;
        }
        else if(ch[0]=='#'&&ch[1]=='#'){
            //ans
            strcpy(newque->ans,&ch[2]);
//            printf("%d\n",newque->id);
//            puts(newque->que);
//            puts(newque->ans);
        }
        else if(ch[0]=='A'&&ch[1]==' '){
            strcpy(newque->a,ch); 
        }
        else if(ch[0]=='B'&&ch[1]==' '){
            strcpy(newque->b,ch);
        }
        else if(ch[0]=='C'&&ch[1]==' '){
            strcpy(newque->c,ch);
        }
        else if(ch[0]=='D'&&ch[1]==' '){
            strcpy(newque->d,ch);
        }
        
    }
    fclose(fp);
    return head;
}

2.读取txt文件

void show(que*s){//show题库 
    que*p;
    p=s->next;
    while(p){
        printf("%d\n",p->id);
        printf("%s",p->que);
        printf("%s",p->a);
        printf("%s",p->b);
        printf("%s",p->c);
        printf("%s",p->d);
        printf("答案: %s",p->ans);
        p=p->next;
    }
}

3.显示题库内容(可写可不写)

int*randlist(int list[len]){//随机不重复数字 
    int i;
    int j;
    int a;
    srand((unsigned)time(NULL));
    for(i=0;i<len;i++){
        while(true){
            a=rand()%19+1;//随机数范围1-19; 
            for(j=0;j<i;j++){
                if(list[j]==a){
                    break;
                }
            }
            if(j==i){
                list[i]=a;
                break;
            }
        }
    }
    for(i=0;i<len;i++){
        printf("%d ",list[i]);
    }
    printf("\n");
    return list;
}

4.创建随机不重复数字

void showque(que*p){//show题目 
    printf("%s",p->que);
    printf("%s",p->a);
    printf("%s",p->b);
    printf("%s",p->c);
    printf("%s",p->d);
    printf("%s",p->ans);//答案 
}

5.显示题目子功能

void showtitle(que*p){//show标题 
    puts(p->que);
    puts(p->a);
    puts(p->b);
    puts(p->c);
    puts(p->d);
    printf("\n");
}

6.显示标题子功能

char* touppercase(char *a){
    int i;
    for(i=0;i<strlen(a);i++){
        if(a[i]>=97){
            a[i]=a[i]-32;
        }
    }
    return a;
}

7.小写字母转换成大写

void start(que*head,int list[len]){
    int i;
    int j;
    int k;
    int time1;
    int time2;
    int cmp=0;
    int result=0;
    que*p;
    char set[max];
    char s;
    int sumgrate=0;
    int userans;
    p=head;
    que**listque=(que**)malloc(sizeof(que*)*lens);
    for(i=0;i<lens;i++){//把题库用堆数组存储 
        listque[i]=p;
        p=p->next;
    }
    for(i=0;i<lens;i++){
        printf("%d ",listque[i]->id);
    }
    printf("\n");
    showtitle(listque[0]);
    printf("进入考试界面: \n");
    scanf("%s",&set);
    time1=time(NULL);
    for(i=0;i<len;i++){//随机五道题 
        showque(listque[list[i]]);
        printf("请输入您的正确答案:  \n");
        scanf("%s",&set);
        for(k=0;k<strlen(set);k++){
            if(set[k]>=97&&set[k]<=122){
                set[k]=set[k]-32;
            }
        }//大小写转换
//        puts(set);
//        printf("%s",listque[list[i]]->ans);
           if(listque[list[i]]->ans[strlen(listque[list[i]]->ans)-1]=='\n'){
            listque[list[i]]->ans[strlen(listque[list[i]]->ans)-1]=0;
        }
        cmp=strcmp(set,listque[list[i]]->ans);
//        printf("%d\n",cmp);
        if(cmp==0){
            printf("RIGHT\n");
            result=result+20;
        }else{
            printf("ERROR\n");
        }
    }
    time2=time(NULL);
    int finatime=time2-time1;
    printf("最终成绩: %d分\n",result);
    printf("答题所用时间: %ds\n",time2-time1);
    fps=fopen("日志.txt","w");
    char str[max];
    char str2[max];
    sprintf(str,"%d",result);
    sprintf(str2,"%d",finatime);
    fputs("总分:",fps);
    fputs(str,fps);
    fputs("分",fps);
    fputs("\n",fps);
    fputs("答题所用时间:",fps);
    fputs(str2,fps);
    fputs("s",fps);
    fclose(fps);
}

8.项目总体运行代码

int main(){
    int list[len]={0};
    que*head;
    head=reading();
//    show(head);
    randlist(list);
    start(head,    list);
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define max 100
#define len 5
#define lens 20
typedef struct Que{
	int id;
	char que[max];
	char a[max];
	char b[max];
	char c[max];
	char d[max];
	char ans[max];
	struct Que*next;
}que;
int ids=1;
que* reading(){
	char ch[max];//每一行 
	FILE*fp=fopen("《西游记》程序设计期末考试.txt","r");
	que*head=(que*)malloc(sizeof(que));//表头 
	que*s;
	head->next=NULL;
	head->id=-1;
	strcpy(	head->que,"请选择你的科目");
	strcpy(	head->a,"1.C语言");
	strcpy(	head->b,"2.英语");
	strcpy(	head->c,"3.日语");
	strcpy(	head->d,"4.高数");
	strcpy(	head->ans,"");
	s=head;
	if(NULL==fp){
		printf("no\n");
		return NULL;
	}
	while(NULL!=fgets(ch,max,fp)){
		que*newque;
		if(ch[0]=='#'&&ch[1]!='#'){
			//title
			newque=(que*)malloc(sizeof(que));
			newque->id=ids;
			ids++;
			strcpy(newque->que,&ch[1]);
			newque->next=NULL;
			if(head->next==NULL){
				head->next=newque;
			}else{
				s->next=newque;
			}
			s=newque;
		}
		else if(ch[0]=='#'&&ch[1]=='#'){
			//ans
			strcpy(newque->ans,&ch[2]);
//			printf("%d\n",newque->id);
//			puts(newque->que);
//			puts(newque->ans);
		}
		else if(ch[0]=='A'&&ch[1]==' '){
			strcpy(newque->a,ch); 
		}
		else if(ch[0]=='B'&&ch[1]==' '){
			strcpy(newque->b,ch);
		}
		else if(ch[0]=='C'&&ch[1]==' '){
			strcpy(newque->c,ch);
		}
		else if(ch[0]=='D'&&ch[1]==' '){
			strcpy(newque->d,ch);
		}
		
	}
	fclose(fp);
	return head;
}
void show(que*s){//show题库 
	que*p;
	p=s->next;
	while(p){
		printf("%d\n",p->id);
		printf("%s",p->que);
		printf("%s",p->a);
		printf("%s",p->b);
		printf("%s",p->c);
		printf("%s",p->d);
		printf("答案: %s",p->ans);
		p=p->next;
	}
}
int*randlist(int list[len]){//随机不重复数字 
	int i;
	int j;
	int a;
	srand((unsigned)time(NULL));
	for(i=0;i<len;i++){
		while(true){
			a=rand()%19+1;//随机数范围1-19; 
			for(j=0;j<i;j++){
				if(list[j]==a){
					break;
				}
			}
			if(j==i){
				list[i]=a;
				break;
			}
		}
	}
	for(i=0;i<len;i++){
		printf("%d ",list[i]);
	}
	printf("\n");
	return list;
}
void showque(que*p){//show题目 
	printf("%s",p->que);
	printf("%s",p->a);
	printf("%s",p->b);
	printf("%s",p->c);
	printf("%s",p->d);
	printf("%s",p->ans);//答案 
}
void showtitle(que*p){//show标题 
	puts(p->que);
	puts(p->a);
	puts(p->b);
	puts(p->c);
	puts(p->d);
	printf("\n");
}
char* touppercase(char *a){
	int i;
	for(i=0;i<strlen(a);i++){
		if(a[i]>=97){
			a[i]=a[i]-32;
		}
	}
	return a;
}
void start(que*head,int list[len]){
	int i;
	int j;
	int k;
	int time1;
	int time2;
	int cmp=0;
	int result=0;
	que*p;
	char set[max];
	char s;
	int sumgrate=0;
	int userans;
	FILE*fps;
	p=head;
	que**listque=(que**)malloc(sizeof(que*)*lens);
	for(i=0;i<lens;i++){//把题库用堆数组存储 
		listque[i]=p;
		p=p->next;
	}
	for(i=0;i<lens;i++){
		printf("%d ",listque[i]->id);
	}
	printf("\n");
	showtitle(listque[0]);
	printf("进入考试界面: \n");
	scanf("%s",&set);
	time1=time(NULL);
	for(i=0;i<len;i++){//随机五道题 
		showque(listque[list[i]]);
		printf("请输入您的正确答案:  \n");
		scanf("%s",&set);
		for(k=0;k<strlen(set);k++){
		    if(set[k]>=97&&set[k]<=122){
		    	set[k]=set[k]-32;
		    }
		}//大小写转换
//		puts(set);
//		printf("%s",listque[list[i]]->ans);
		if(listque[list[i]]->ans[strlen(listque[list[i]]->ans)-1]=='\n'){
			listque[list[i]]->ans[strlen(listque[list[i]]->ans)-1]=0;
		}
		cmp=strcmp(set,listque[list[i]]->ans);
		if(cmp==0){
			printf("RIGHT\n");
			result=result+20;
		}else{
			printf("ERROR\n");
		}
	}
	time2=time(NULL);
	int finatime=time2-time1;
	printf("最终成绩: %d分\n",result);
	printf("答题所用时间: %ds\n",time2-time1);
	fps=fopen("日志.txt","w");
	char str[max];
	char str2[max];
	sprintf(str,"%d",result);
	sprintf(str2,"%d",finatime);
	fputs("总分:",fps);
	fputs(str,fps);
	fputs("分",fps);
	fputs("\n",fps);
	fputs("答题所用时间:",fps);
	fputs(str2,fps);
	fputs("s",fps);
	fclose(fps);
}
int main(){
	int list[len]={0};
	que*head;
	head=reading();
//	show(head);
	randlist(list);
	start(head,	list);
}

我会长期保持更新滴!

喜欢的朋友记得点个关注哟!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值