m0_62801663 2022-01-04 17:20 采纳率: 72%
浏览 42
已结题

这个代码哪里错了啊?为什么运行不起啊?

/建立一个包含若干个英文单词的词汇表文件。其中每个词条由单词和解释两部分组成
如:apple 苹果
利用该词汇表文件实现背单词的功能。
功能要求:
1.读取已有的词汇表文件。
2.能浏览词汇表的全部词条。
3.背单词功能:由用户指定每次背单词的数目,程序随机分配挑选给定个数的单词(不重复);用户输入相应英语单词,程序给出中文解释;判断输入单词的正误,输入正确得一分;对每个单词统计总得分;总得分最低的单词为生疏单词,让这类单词多出现。
/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 20
#define MAX_NUM 100
typedef struct word
{
char en[MAX_CHAR];
char ch[MAX_CHAR];
}word;
int b=0,c=0;
word s[MAX_NUM];
int num;
void read_from_file()
{
FILE *fp;
int i=0;
fp=fopen("D:\data.txt","rb");
if(!fp)
{
printf("打开文件失败!\n");
return;
}
fread(&num,1,sizeof(num),fp);
for(i=0;i<num;i++)
{
fread(&s[i],1,sizeof(word),fp);
}
fclose(fp);
}

void show()
{
FILE* fp;
fp=fopen("D:\data.txt","r");
if(fp==NULL)
{
printf("文件打开失败!\n");
return;
}
else
{
int fgetc(FILE *fp);

}
fclose(fp);
int i;
for(i=0;i<num;i++)
{
    printf("    %10s%10s\n",s[i].en,s[i].ch);
}

}

void zy()
{
char a1[20];
int b=0,c=0;
int i;
scanf("%s",a1);
for(i=0;s[i].en!='\0';i++)
{
if(strcmp(a1,s[i].en)!=0)
{
scanf("%s",a1);
c+=1;
}
else
{
b+=1;
}
}

printf("\n 恭喜你,回答正确!加%d分!\n\n",c);
printf("Enter 2 继续输入;Enter 1 返回主菜单");

}

void count()
{
printf("\n共计输入错误:%d次 每次扣一分\n",b);
printf("\n共计输入正确:%d次 每次加一分\n",c);
printf(" 你的总得分为:%d分\n\n",(c-b));
printf("Enter Enter 1 返回主菜单");
}

void main()
{
int i,n;
do
{
system("cls");
printf("\n\t\t\t背单词系统\n");
printf("");
printf("\n\n菜单:1-显示单词信息 2-背诵 3-查询成绩 4-退出\n\n");
printf("
");
printf("\n请输入数字以办理相应的功能");
scanf("%d",&n);
if(n>=1&&n<=4)
{
i=1;
getchar();
}
else
{
i=0;
printf("请输入正确的数字!");
}
}while(i==0);
switch(n)
{
case 1:show();break;
case 2:zy();break;
case 3:count();break;
case 4:exit(0);
}
}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-01-04 19:57
    关注

    供参考:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    typedef struct word
    {
        char danci[64];
        char jieshi[64];
        int  frequency;
        struct word* next;
    }Word;
    int N = 0, Min = 0;
    Word* input_file()      //从文件载入
    {
        char danci[64], jieshi[64];
        int  frequency;
        Word* head = NULL, * p = NULL, * p1 = NULL;
        FILE* fp;
        if ((fp = fopen("danciku.txt", "r")) == NULL)
        {
            printf("danciku.txt文件不存在.");
        }
        else{
            Min = INT_MAX;
            while (1)
            {
                if (fscanf(fp, "%s %s %d\n", danci, jieshi, &frequency) != 3) break;
                p = (Word*)malloc(sizeof(Word));
                if (!p) {
                    printf("申请内存空间失败!");
                    break;
                }
                p->next = NULL;
                strcpy(p->danci, danci);
                strcpy(p->jieshi, jieshi);
                p->frequency = frequency;
                if (Min > frequency) Min = frequency;
                if (head == NULL)
                    head = p;
                else
                    p1->next = p;
                p1 = p;        
                N++;
            }
            fclose(fp);
        }
        return head;
    }
    void print(Word* p)
    {
        //system("color 01");
        Word* head = p;
        while (head != NULL)
        {
            printf("           %s %s\n", head->danci, head->jieshi);
            head = head->next;
        }
    }
    void input(Word** p)
    {
        char ch;
        int  n = 0;
        Word* head = NULL, * q = NULL;
        FILE* fp;
        if ((fp = fopen("danciku.txt", "a")) == NULL)
        {
            printf("danciku.txt 文件打开失败!");
        }
        else{
            for (head = NULL, q = (*p); q != NULL; head = q, q = q->next);
            do{
                printf("请输入英语单词和其解释(中间用空格隔开):\n");
                q = (Word*)malloc(sizeof(Word));
                if (!q) {
                    printf("申请内存空间失败!");
                    break;
                }
                q->next = NULL;
                scanf("%s %s", q->danci, q->jieshi);
                q->frequency = 0;
                if (head == NULL)
                    (*p) = q;
                else
                    head->next = q;
                head = q;
                fprintf(fp, "%s %s %d\n", q->danci, q->jieshi, q->frequency);
                n++;
                printf("你已成功录入了%d个单词,目前共%d个单词\n", n, N + n);
                printf("\n是否继续录入单词,回答Y or N。\n");
                getchar();
                scanf(" %c", &ch);
            } while (ch == 'Y' || ch == 'y');
            fclose(fp);
            N += n;
        }
     }
    void translate(Word *p)
    {
        //system("color c0");
        FILE* fp;
        char danci[64];
        int a[100], x, number = 0;
        int j, i, n, min, k;
        Word* head = p;
        printf("\t请输入你要检测的单词数量:");
        getchar();
        scanf("%d", &x);
        srand((unsigned int)time(NULL));
        for (i = 0; i < 100; i++)
            a[i] = i;
        i = 0; min = Min;
        if (x > N){
            printf("\t对不起,没那么多单词。\n");
        }
        else{
            while (1)
            {
                n = rand() % N;
                if (a[n] != -1)
                {
                    for (j = 0, head = p; j < n; j++)
                        head = head->next;
                    if (head->frequency <= min)
                    {
                        printf("\n\t中文:[ %s ] ,",head->jieshi);
                        printf("请输入对应单词: ");
                        getchar();
                        scanf("%s", danci);
                        if (strcmp(danci, head->danci) == 0)
                        {
                            printf("\t恭喜你,答对了。\n\t该单词你已获%d分\n\n", ++head->frequency);
                            number++;
                            if (Min >= head->frequency-1)   Min = head->frequency;
                        }
                        else{
                            printf("\t抱歉,你答错了\a\n\t该单词你已获%d分\n\n", --head->frequency);
                            if (Min > head->frequency)   Min = head->frequency;
                        }
                        a[n] = -1;
                        if ((++i) == x)
                        {
                            printf("\t你本次共答对%d道题\n", number);
                            break;
                        }
                    }
                    else
                        continue;
                }
                else {
                    if (head->frequency > min)
                        min++;
                }
            }
            if ((fp = fopen("danciku.txt", "w")) == NULL)
            {
                printf("danciku.txt 文件打开失败!");
            }
            else {
                head = p;
                while (head)
                {
                    fprintf(fp, "%s %s %d\n", head->danci, head->jieshi, head->frequency);
                    head = head->next;
                }
                fclose(fp);
            }
        }
    }
    void main()
    {
        int n=1;
        Word* head = input_file();  //初始化链表
        //system("color a4");
        while (n)
        {
            printf("\n\n");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置当前输出为蓝色
            printf("\t***********************************************\n");
            printf("\t**                                           **\n");
            printf("\t**");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置当前输出为红色
            printf("     1、单词录入");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置当前输出为绿色
            printf("          2、单词展示      ");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置当前输出为蓝色
            printf("**\n");
            printf("\t**                                           **\n");
            printf("\t**");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置当前输出为绿色
            printf("     3、单词检查");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置当前输出为红色
            printf("          4、退出系统      ");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置当前输出为蓝色
            printf("**\n");
            printf("\t**                                           **\n");
            printf("\t***********************************************\n");
            printf("     请选择您需要的操作序号<1-4>,按回车结束:");
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置当前输出为红色
            scanf("%d", &n);
            switch (n)
            {
            case 1:input(&head);   break;
            case 2:print(head);    break;
            case 3:translate(head);break;
            case 4:
                //system("color f4");
                n = 0;
                break;
            default: 
                printf("\t你输入了错误,请重新输入。");
                break; 
            }
        }
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月12日
  • 已采纳回答 1月4日
  • 创建了问题 1月4日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么