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



三、思維導(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檢測(cè)文件是否結(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("請(qǐng)輸入第%d道題題目、題干和選項(xiàng):\n",i+1);//輸入結(jié)構(gòu)體元素內(nèi)容
?? ??? ?printf("請(qǐng)輸入題目:");
?? ? ? ?gets(Testquestions[i].subject);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)A:");
?? ??? ?gets(Testquestions[i].option1);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)B:");
?? ??? ?gets(Testquestions[i].option2);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)C:");
?? ??? ?gets(Testquestions[i].option3);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)D:");
?? ??? ?gets(Testquestions[i].option4);
?? ??? ?printf("請(qǐng)輸入答案:");
?? ??? ?scanf("%c",&Testquestions[i].result);getchar();
?? ??? ?system("cls"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清屏
?? ?}
}
Status InsertNodeA(int N) //輸入試題內(nèi)容
{?? ?
?? ?if(N>MAX) return ERROR;
?? ? ? ?printf("請(qǐng)輸入所要輸入題題目、題干和選項(xiàng):\n");
?? ??? ?printf("請(qǐng)輸入題目:");
?? ??? ?gets(Testquestions[N].subject);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)A:");
?? ??? ?gets(Testquestions[N].option1);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)B:");
?? ??? ?gets(Testquestions[N].option2);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)C:");
?? ??? ?gets(Testquestions[N].option3);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)D:");
?? ??? ?gets(Testquestions[N].option4);
?? ??? ?printf("請(qǐng)輸入答案:");
?? ??? ?scanf("%c",&Testquestions[N].result);getchar();
?? ??? ?N++; ? ? ? ? ? ? ?//N表示結(jié)構(gòu)體數(shù)組長(zhǎng)度,通過(guò)加&號(hào)使其值能返回
?? ??? ?return TRUE;
}
Status InsertNodeB(int N) //插入試題內(nèi)容
{?? ?
?? ?if(N>MAX) return ERROR;
?? ? ? ?printf("請(qǐng)輸入所要插入題題目、題干和選項(xiàng):\n");
?? ??? ?printf("請(qǐng)輸入題目:");
?? ??? ?gets(Testquestions[N].subject);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)A:");
?? ??? ?gets(Testquestions[N].option1);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)B:");
?? ??? ?gets(Testquestions[N].option2);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)C:");
?? ??? ?gets(Testquestions[N].option3);
?? ??? ?printf("請(qǐng)輸入選項(xiàng)D:");
?? ??? ?gets(Testquestions[N].option4);
?? ??? ?printf("請(qǐng)輸入答案:");
?? ??? ?scanf("%c",&Testquestions[N].result);getchar();
?? ??? ?N++; ? ? ? ? ? ? ?//N表示結(jié)構(gòu)體數(shù)組長(zhǎng)度,通過(guò)加&號(hào)使其值能返回
?? ??? ?return TRUE;
}
Status DeleteNode(int n)//刪除數(shù)組中的第n個(gè)元素?
{?? ?
?? ?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)//進(jìn)行答題
{
??
?int i,score=0,Num;
?char r;
?? ??
?? ?for(i=1;i<=sum;i++)
?? ?{?? ?Num= rand()%sum; ? ? ? ? ? ? ? ?//隨機(jī)函數(shù),以隨機(jī)選定何題進(jìn)行解答
? ? ? ? printNode(Testquestions[Num],Num+1);
?? ? ? ?printf("\n請(qǐng)輸入答案:");
?? ? ? ?scanf("%c",&r);getchar();
?? ??? ?if( Match(Testquestions[Num],r)) //調(diào)用函數(shù)IsMatch判斷所輸入的答案與標(biāo)準(zhǔn)答案是否相同
?? ??? ?{?? ?printf("\n答案正確!\n");
?? ??? ??? ?score++;
?? ??? ?}
?? ? ? ?else printf("\n答案錯(cuò)誤!\n");
?? ?}
?? ?printf("\n你的總成績(jī)?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單項(xiàng)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)\n ");
? ? ? printf("\n");
?? ? ?printf(" ?\t\t\t1 進(jìn)行答題并判卷\n");
?? ? ?printf(" ?\t\t\t2 顯示整張?jiān)嚲韮?nèi)容\n");
?? ? ?printf(" ?\t\t\t3 插入試題\n");
?? ? ?printf(" ?\t\t\t4 保存到文件\n");
?? ? ?printf(" ?\t\t\t5 退出系統(tǒng)\n");
?? ? ?printf(" ?\t\t\t ?請(qǐng)選擇:");
?? ? ?scanf("%d",&chose);getchar();
?? ? ?switch(chose)?
?? ? ?{?? ? ?case 1:system("cls");
?? ??? ?printf("請(qǐng)輸入你想要的答題數(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("請(qǐng)輸入正確選擇!\n");
?? ? ?}
?? ?}
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳談c++11 final與override說(shuō)明符
下面小編就為大家?guī)?lái)一篇詳談c++11 final與override說(shuō)明符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Visual Studio Code上添加小程序自動(dòng)補(bǔ)全插件的操作方法
這篇文章主要介紹了Visual Studio Code上添加小程序自動(dòng)補(bǔ)全插件的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題
下面小編就為大家?guī)?lái)一篇淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
C++寫(xiě)注冊(cè)表項(xiàng)實(shí)例
這篇文章主要介紹了C++寫(xiě)注冊(cè)表項(xiàng)實(shí)例,可實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)的功能,是進(jìn)行Windows桌面應(yīng)用程序開(kāi)發(fā)中非常重要的技巧,需要的朋友可以參考下2014-10-10
C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊(duì)列的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊(duì)列的實(shí)現(xiàn)過(guò)程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的,跟隨下文來(lái)具體了解吧2023-02-02
C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝
這篇文章主要介紹了C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝,運(yùn)行期間才能確定所需內(nèi)存大小,此時(shí)應(yīng)該使用new申請(qǐng)內(nèi)存,下面我們就進(jìn)入文章學(xué)習(xí)具體的操作方法,需要的小伙伴可以參考一下2022-03-03

