首页 > 代码库 > C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans

C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans

课程设计

 

单项选择题标准化考试系


所属专业:软件工程软件三班

完成人:潘尚

一.设计计划.

1.能够用菜单明确的指导用户操作.

2.操作完成可以返回主菜单.

3.将输入的题目保存至C盘的文本文件中,以便日后读取.

4.若没有题目,提示用户输入题目,建立文本文档于C盘根目录.

5.答题为随机抽取题目进行回答.

6.若输入小写答案选项如abcd,将其转换为大写字母再判断.

7.系统在用户答完题目后可以进行正确率, 答对个数的统计.

 

二.程序模块设计.

1.模块一:菜单操作模块

该模块实现程序的菜单操作.

 

算法

 

(1)在屏幕上呈现美观的菜单..

(2)提示用户输入.

(3)待用户输入选项,swich语句判断,输入错误则重新输入.

2.模块二:题目装入内存模块

 

函数开辟内存空间将试题文件中题目装入内存中.

 

算法:

 

(1)寻找回车符号,判断题目数量.

(2)开辟内存空间,将题目信息装入内存.

(3)关闭文件返回题目总数.

3.模块三:答题模块

在屏幕上输出题目让用户输入答案。判断用户输入答案是否正确.

 

算法:

 

(1)接受用户输入题目数,判断是否小于总共题目或者小于0.

(2)置随机数.

(3)将题目装入内存.

(4)输出题目,等待用户输入答案.

(5)判断输入.

4.模块四:添加试题模块

打开储存试题的文件进行试题信息输入.

 

算法:

 

打开文件,开辟内存空间,判断用户输入,写入文件.

 

四:流程图绘制

 

1.菜单流程图

     



2.装入内存

 



 

3.答题模块



五.问题.

    文件读写时文件指针的移位:

    当用fgetc()函数遍历文件时文件指针是顺序移动的,当遇到回车符时才会判断出文件在第几行。而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到fseek()函数将文件指针移位。而且还要恢复文件指针的位置,用于继续判断当前是文件的第几行。

 

六.源代码.

#include<stdio.h>

#include<stdlib.h>

#defineLEN sizeof(struct test)

structtest

{

         char que[81];

         char answer1[81];

         char answer2[81];

         char answer3[81];

         char answer4[81];

         char ture;

       struct test*next;

       };

struct test *head;//全局变量储存第一个结构体的指针

int zts(int m)//将第m道题装入内存,输入-1时将返回总题数

         FILE *fp;

         structtest *p1=NULL;

         charch,ch1[5];

         inti,n=0,wz,py;

         if((fp=fopen("c:\\test.txt","r"))==NULL)//只读方式打开文件

       {

                   printf("文件打开失败请检查C盘下的test.txt文件。\n");

                   exit(0);

         }

         do

         {

                   py=1;

                   ch=fgetc(fp);

                   for(i=0;ch!=‘\n‘&&ch!=-1;i++)//循环判断回车符个数

              {

                            py++;

                            ch=fgetc(fp);

                   }

                   n++;                         //储存行数的变量

                   if(n==m)//如果当前行数与传入参数相等

                   {

                            if(p1==NULL)//判断是否是第一次开辟内存空间

                            {

                                     p1=(struct test *)malloc(LEN);

                                     head=p1;

                                     p1->next=NULL;

                            }

                            else

                            {

                                     p1->next=p1;

                                     p1=(struct test *)malloc(LEN);

                                     p1->next=NULL;

                            }

                            wz=ftell(fp);//记录指针当前位置

                            fseek(fp,(wz-py-1),0);//调整指针位置到行首

                            fscanf(fp,"%s%s%s%s%s%s",&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1->answer4,&ch1);

                            fseek(fp,wz+1,0);//调整指针位置到行末

                            p1->ture=ch1[0];

                            break;//将数据装入内存后跳出循环

                   }

         }while(!feof(fp));//文件结束跳出循环                                  

         fclose(fp);

         returnn;//返回题目总数n

}

void exe1()

{

         charchange(char word);

         voidmain();

         voidexe2();

         intn,m=0,tm,i,t=0,f=0;

         charans[2];

         structtest *p1;

         system("cls");

         printf("请输入要答题数:");

         scanf("%d",&n);

         tm=zts(-1);

         if(0>n||n>tm)

         {

                   printf("答题数应小于总数!");

                   exe1();

         }

         for(i=0;i<n;i++)//n为用户要答题数

         {

                   do

                   {

                            m=rand();//置随机数

                   }while(!(0<m&&m<=tm));//判断产生的随机数是否符合要求

                            zts(m);

                   p1=head;//zts开辟的结构体首地址赋给p1

                   printf("\n%d题:\n",i+1);

                   printf("%s\n%s\n%s\n%s\n%s\n请输入答案:",p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4);

                   scanf("%s",&ans);

                   if(change(ans[0])==p1->ture)  /*由于用户可能没有转换大小写,故此处添加了大写转换的函数*/

              {

                            printf("恭喜你答对了!\n\n");

                            t++;           /*回答正确的题目数的统计*/

                   }

                   else

                   {

                            printf("对不起,你答错了。。。\n正确答案是:%c\n\n",p1->ture);

                            f++;//回答错误统计

                   }

         }

         p1=head;

         do

         {

                   head=p1->next;

                   free(p1);

                   p1=head;

         }while(p1!=NULL);//释放结构体占用内存

         printf("*******************************\n");

         printf("\n已完成测试!\n共做%d道题:%d错误,%d正确。\n正确率:%5.2f%%\n\n",n,f,t,(float)t/n*100);

         printf("*******************************\n");

         printf("\n\n1.继续答题;2.添加题目;3.返回主菜单;\n请选择:");

         i=0;

         scanf("%d",&i);

         if(i==1)

                   exe1();//继续答题

         else

                   if(i==2)

                            exe2();//添加题目

                   else

                            main();//返回主菜单

}

void exe2() //实现用户自主输入题目

{

         char change(char word);

         void main();

         system("cls");

         int n;

         FILE *fp;

         if((fp=fopen("c:\\test.txt","a"))==NULL)

         {

                   printf("文件打开失败请检查C盘下的test.txt文件。\n");

                   exit(0);

         }

         struct test*p1=NULL;

         p1=(struct test*)malloc(LEN);//开辟内存空间

         do

         {

                   printf("请输入题目:");

                   scanf("%s",&p1->que);

         }while(p1->que[0]==‘\0‘);

         do

         {

                   printf("请输入选项A");

                   scanf("%s",&p1->answer1);

         }while(p1->answer1==‘\0‘);

         do

         {

                   printf("请输入选项B");

                   scanf("%s",&p1->answer2);

         }while(p1->answer2==‘\0‘);

         do

         {

                   printf("请输入选项C");

                   scanf("%s",&p1->answer3);

         }while(p1->answer3==‘\0‘);

         do

         {

                   printf("请输入选项D");

                   scanf("%s",&p1->answer4);

         }while(p1->answer4==‘\0‘);

         printf("请输入答案:");

         do

         {

                   scanf("%c",&p1->ture);

                   p1->ture=change(p1->ture);

         }while(p1->ture!=‘A‘&&p1->ture!=‘B‘&&p1->ture!=‘C‘&&p1->ture!=‘D‘);

         printf("\n确认输入题目?\n1.是。 2.否。\n");

         scanf("%d",&n);

         if(n==1)

         {

                   fputc(‘\n‘,fp);

                   fputs(p1->que,fp);

                   fputc(‘ ‘,fp);

                   fputs("A.",fp);

                   fputs(p1->answer1,fp);

                   fputc(‘ ‘,fp);

                   fputs("B.",fp);

                   fputs(p1->answer2,fp);

                   fputc(‘ ‘,fp);

                   fputs("C.",fp);

                   fputs(p1->answer3,fp);

                   fputc(‘ ‘,fp);

                   fputs("D.",fp);

                   fputs(p1->answer4,fp);

                   fputc(‘ ‘,fp);

                   fputc(p1->ture,fp);

                   fclose(fp);

                   printf("保存成功!");

                   system("cls");

                   free(p1);

                   printf("是否继续添加?\n1.继续添加  2.返回主菜单\n");

                   scanf("%d",&n);

                   if(n==1)

                            exe2();

                   else

                            main();

         }

         else

         {

                   free(p1);

                   exe2();

         }

}

void main()

{

         voidchange(char word);

leap:         system("cls");         //调用dos命令

         int n;

         puts("┌────────────────────────────────────────┐\n");

         puts("│****欢迎使用单项选择题标准化考试系统****|\n");

         puts("│─────────────1.开始答题。───────────────│\n");

         puts("│─────────────2.添加试题。───────────────│\n");

         puts("│─────────────3.帮助说明。───────────────│\n");

         puts("│─────────────4.版权信息。───────────────│\n");

         puts("│─────────────5.退出系统。───────────────│\n");

         puts("│****************************************│\n");

         puts("│                    ^-^                 │\n");

         puts("│                  ┌──────────────┐      │\n");

         puts("│                  │ copyright@潘尚      │     │\n");

         puts("│                  │     1.01                      │     │\n");

         puts("│                  │                                   │     │\n");

         scanf("%d",&n);

         switch(n)

         {

 

                   case1:exe1();break;

                   case2:exe2();break;

                   case3:

                            system("cls");

                            printf("这是一款自我检测的答题系统,试题保存在c盘根目录的test.txt文本文件中,可自行加入试题.\n\n可直接打开c盘文件自行添加题目\n\n\n注意格式:题目 选项A. B. C. D. 答案\n\n\n");getchar();

                            puts("输入任何值回到主菜单");getchar();goto leap;

                   case4:

                            system("cls");

                            printf("版权所有:潘尚。联系:574273250@qq.com\n\nedition1.01 \n\n 来自华中科技大学文华学院软件三班 \n\n");getchar();

                            puts("输入任何值回到主菜单");getchar();goto leap;

                   case5:printf("\n欢迎再次使用,再见^-^\n");getchar();

         }while(n!=7);

}

char change(char word)  /*转换为大写字母*/

{

         if((word>=‘a‘)&&(word<=‘z‘))

                   word-=32;

         return(word);

}

七.测试.


菜单

 


答题

 

 

 

 

录入

 

 

 

                      

统计

 

 

 


帮助

 

 

 


                          

C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans