C語言實現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)
本文實例為大家分享了C語言實現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、任務(wù)概述(文章僅供參考)
1、用文件保存試題庫。(每個試題包括題干、4個備選答案、標(biāo)準(zhǔn)答案)
2、試題錄入:可隨時增加試題到試題庫中
3、試題抽取:每次從試題庫中可以隨機抽出N道題(N由鍵盤輸入)
4、答題:用戶可實現(xiàn)輸入自己的答案
5、自動判卷:系統(tǒng)可根據(jù)用戶答案與標(biāo)準(zhǔn)答案的對比實現(xiàn)判卷并給出成績。
二、功能展示



三、思維導(dǎo)圖

四、程序源碼
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define ERROR 0
#define MAX ?30
typedef int Status;
typedef struct{
?? ?char option1[30],option2[30],option3[30],option4[30],subject[150];
?? ?char result;
}TestNode;
TestNode Testquestions[MAX];
Status SaveNode(int N) ?? ?//把結(jié)構(gòu)體數(shù)組保存到文件"qinhu"中,如成功保存返回TRUE,否則返回ERROR
{?? ?int i;
?? ?FILE *fp;
?? ?if((fp=fopen("qinhu","wb"))==NULL) return ERROR;
?? ?for(i=0;i<N;i++)
?? ??? ?fwrite(&Testquestions[i],sizeof(TestNode),1,fp);
?? ?fclose(fp);
?? ?return TRUE;
}
Status ReadNode(int N)?? ?//從文件讀出結(jié)構(gòu)體數(shù)組的內(nèi)容,如成功讀取返回TRUE,否則返回ERROR
{?? ?FILE *fp;
?? ?int i=0;
?? ?if((fp=fopen("qinhu","rb"))==NULL) return ERROR;
?? ?while(!feof(fp))// 用feof檢測文件是否結(jié)束,如果結(jié)束,返回正確
?? ?{?? ?fread(&Testquestions[i],sizeof(TestNode),1,fp);
?? ??? ?i++;
?? ?}
? ? N=i-1;
?? ?return TRUE;
}
void InputTitle(int N)// 輸入N道試題數(shù)據(jù)
{
?? ?int i;?
?? ?for(i=0;i<N;i++)
?? ?{ ? printf("請輸入第%d道題題目、題干和選項:\n",i+1);//輸入結(jié)構(gòu)體元素內(nèi)容
?? ??? ?printf("請輸入題目:");
?? ? ? ?gets(Testquestions[i].subject);
?? ??? ?printf("請輸入選項A:");
?? ??? ?gets(Testquestions[i].option1);
?? ??? ?printf("請輸入選項B:");
?? ??? ?gets(Testquestions[i].option2);
?? ??? ?printf("請輸入選項C:");
?? ??? ?gets(Testquestions[i].option3);
?? ??? ?printf("請輸入選項D:");
?? ??? ?gets(Testquestions[i].option4);
?? ??? ?printf("請輸入答案:");
?? ??? ?scanf("%c",&Testquestions[i].result);getchar();
?? ??? ?system("cls"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清屏
?? ?}
}
Status InsertNodeA(int N) //輸入試題內(nèi)容
{?? ?
?? ?if(N>MAX) return ERROR;
?? ? ? ?printf("請輸入所要輸入題題目、題干和選項:\n");
?? ??? ?printf("請輸入題目:");
?? ??? ?gets(Testquestions[N].subject);
?? ??? ?printf("請輸入選項A:");
?? ??? ?gets(Testquestions[N].option1);
?? ??? ?printf("請輸入選項B:");
?? ??? ?gets(Testquestions[N].option2);
?? ??? ?printf("請輸入選項C:");
?? ??? ?gets(Testquestions[N].option3);
?? ??? ?printf("請輸入選項D:");
?? ??? ?gets(Testquestions[N].option4);
?? ??? ?printf("請輸入答案:");
?? ??? ?scanf("%c",&Testquestions[N].result);getchar();
?? ??? ?N++; ? ? ? ? ? ? ?//N表示結(jié)構(gòu)體數(shù)組長度,通過加&號使其值能返回
?? ??? ?return TRUE;
}
Status InsertNodeB(int N) //插入試題內(nèi)容
{?? ?
?? ?if(N>MAX) return ERROR;
?? ? ? ?printf("請輸入所要插入題題目、題干和選項:\n");
?? ??? ?printf("請輸入題目:");
?? ??? ?gets(Testquestions[N].subject);
?? ??? ?printf("請輸入選項A:");
?? ??? ?gets(Testquestions[N].option1);
?? ??? ?printf("請輸入選項B:");
?? ??? ?gets(Testquestions[N].option2);
?? ??? ?printf("請輸入選項C:");
?? ??? ?gets(Testquestions[N].option3);
?? ??? ?printf("請輸入選項D:");
?? ??? ?gets(Testquestions[N].option4);
?? ??? ?printf("請輸入答案:");
?? ??? ?scanf("%c",&Testquestions[N].result);getchar();
?? ??? ?N++; ? ? ? ? ? ? ?//N表示結(jié)構(gòu)體數(shù)組長度,通過加&號使其值能返回
?? ??? ?return TRUE;
}
Status DeleteNode(int n)//刪除數(shù)組中的第n個元素?
{?? ?
?? ?return TRUE;
}
? ??
void printNode(TestNode p,int n)//輸出第n道題題目
{?? ?
?? ?printf("(%d) ",n);
?? ?printf("%s\n",p.subject);
?? ?printf(" ?A %s ?",p.option1);
?? ?printf(" ?B %s ?\n",p.option2);
?? ?printf(" ?C %s ?",p.option3);
?? ?printf(" ?D %s ?",p.option4);
}
Status ?Match(TestNode p,char m)//判斷m是否為p題目的答案,若是返回TRUE,否則返回ERROR
{?? ?
?? ?if(m==p.result) return TRUE;
?? ?else return ERROR;
}
void answer(int sum)//進行答題
{
??
?int i,score=0,Num;
?char r;
?? ??
?? ?for(i=1;i<=sum;i++)
?? ?{?? ?Num= rand()%sum; ? ? ? ? ? ? ? ?//隨機函數(shù),以隨機選定何題進行解答
? ? ? ? printNode(Testquestions[Num],Num+1);
?? ? ? ?printf("\n請輸入答案:");
?? ? ? ?scanf("%c",&r);getchar();
?? ??? ?if( Match(Testquestions[Num],r)) //調(diào)用函數(shù)IsMatch判斷所輸入的答案與標(biāo)準(zhǔn)答案是否相同
?? ??? ?{?? ?printf("\n答案正確!\n");
?? ??? ??? ?score++;
?? ??? ?}
?? ? ? ?else printf("\n答案錯誤!\n");
?? ?}
?? ?printf("\n你的總成績?yōu)?%d\n",score);
}
void main()
{?? ?char ?flag='N';
?? ?int N=0,i, sum,score=0,chose;
?
?? ?printf("輸入想建立的題目文件題目數(shù):");
?? ?scanf("%d",&N);getchar();
?? ?InputTitle(N);
?? ?ReadNode(N);
?? ?while(flag=='N'||flag=='n')
?? ?{ printf("\t\t\t單項選擇題標(biāo)準(zhǔn)化考試系統(tǒng)\n ");
? ? ? printf("\n");
?? ? ?printf(" ?\t\t\t1 進行答題并判卷\n");
?? ? ?printf(" ?\t\t\t2 顯示整張試卷內(nèi)容\n");
?? ? ?printf(" ?\t\t\t3 插入試題\n");
?? ? ?printf(" ?\t\t\t4 保存到文件\n");
?? ? ?printf(" ?\t\t\t5 退出系統(tǒng)\n");
?? ? ?printf(" ?\t\t\t ?請選擇:");
?? ? ?scanf("%d",&chose);getchar();
?? ? ?switch(chose)?
?? ? ?{?? ? ?case 1:system("cls");
?? ??? ?printf("請輸入你想要的答題數(shù)目:");
?? ??? ? ? scanf("%d",&sum);getchar();
?? ? ? ? ? answer(sum);
?? ??? ? ? break;
?? ? ? case 2:system("cls");
?? ??? ?for(i=1;i<=N;i++)?
?? ??? ?{ ? ? ?printNode(Testquestions[i-1],i);
?? ??? ??? ? ? printf("\n");
?? ??? ?} ??
?? ??? ?break;
?? ? ? case 3:system("cls");InsertNodeB(N);break;
?? ? ? case 4:system("cls");
?? ??? ?if(SaveNode(N)) printf("保存成功!\n");
?? ??? ? ?else printf("保存失敗!\n");break;
?? ? ? case 5:printf("你將退出系統(tǒng)(Y or N)?");
?? ??? ? ? scanf("%c",&flag);getchar();
?? ??? ? ? if(flag=='Y'||flag=='y') exit(0);
?? ??? ? ? system("cls");break;
?? ? ?default:printf("請輸入正確選擇!\n");
?? ? ?}
?? ?}
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Visual Studio Code上添加小程序自動補全插件的操作方法
這篇文章主要介紹了Visual Studio Code上添加小程序自動補全插件的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程
這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的,跟隨下文來具體了解吧2023-02-02
C++使用new和delete進行動態(tài)內(nèi)存分配與數(shù)組封裝
這篇文章主要介紹了C++使用new和delete進行動態(tài)內(nèi)存分配與數(shù)組封裝,運行期間才能確定所需內(nèi)存大小,此時應(yīng)該使用new申請內(nèi)存,下面我們就進入文章學(xué)習(xí)具體的操作方法,需要的小伙伴可以參考一下2022-03-03

