zoukankan      html  css  js  c++  java
  • C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans

    课程设计

     

    单项选择题标准化考试系


    所属专业:软件project软件三班

    完毕人:潘尚

    一.设计计划.

    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文件。 ");

                       exit(0);

             }

             do

             {

                       py=1;

                       ch=fgetc(fp);

                       for(i=0;ch!=' '&&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(" %d题: ",i+1);

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

                       scanf("%s",&ans);

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

                  {

                                printf("恭喜你答对了。 ");

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

                       }

                       else

                       {

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

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

                       }

             }

             p1=head;

             do

             {

                       head=p1->next;

                       free(p1);

                       p1=head;

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

             printf("******************************* ");

             printf(" 已完毕測试! 共做%d道题:%d错误,%d正确。

    正确率:%5.2f%% ",n,f,t,(float)t/n*100);

             printf("******************************* ");

             printf(" 1.继续答题;2.加入题目。3.返回主菜单; 请选择:");

             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文件。

    ");

                       exit(0);

             }

             struct test*p1=NULL;

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

             do

             {

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

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

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

             do

             {

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

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

             }while(p1->answer1=='');

             do

             {

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

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

             }while(p1->answer2=='');

             do

             {

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

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

             }while(p1->answer3=='');

             do

             {

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

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

             }while(p1->answer4=='');

             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(" 确认输入题目? 1.是。

    2.否。 ");

             scanf("%d",&n);

             if(n==1)

             {

                       fputc(' ',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("是否继续加入? 1.继续加入  2.返回主菜单 ");

                       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("┌────────────────────────────────────────┐ ");

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

             puts("│─────────────1.開始答题。───────────────│ ");

             puts("│─────────────2.加入试题。───────────────│ ");

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

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

             puts("│─────────────5.退出系统。

    ───────────────│ ");

             puts("│****************************************│ ");

             puts("│                    ^-^                 │ ");

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

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

             puts("│                  │     1.01                      │     │ ");

             puts("│                  │                                   │     │ ");

             scanf("%d",&n);

             switch(n)

             {

     

                       case1:exe1();break;

                       case2:exe2();break;

                       case3:

                                system("cls");

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

                                puts("输入不论什么值回到主菜单");getchar();goto leap;

                       case4:

                                system("cls");

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

                                puts("输入不论什么值回到主菜单");getchar();goto leap;

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

             }while(n!=7);

    }

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

    {

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

                       word-=32;

             return(word);

    }

    七.測试.


    菜单

     


    答题

     

     

     

     

    录入

     

     

     

                          

    统计

     

     

     


    帮助

     

     

     


                              

查看全文
  • 相关阅读:
    最大的错误就是没有把自己的软件开发事业当 作一桩生意来看待
    python:open/文件操作
    Python 之ConfigParser
    Python 之ConfigParser
    Python 之ConfigParser
    python的time模块使用
    python的time模块使用
    python的time模块使用
    国外、国内各大OJ
    国外、国内各大OJ
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10518534.html
  • Copyright © 2011-2022 走看看