C语言编写背单词程序

建立一个包含若干个英文单词的词汇表文件。其中每个词条由单词和解释两部分组成
如:apple 苹果
利用该词汇表文件实现背单词的功能。
功能要求:
1.读取已有的词汇表文件。
2.能浏览词汇表的全部词条。
3.背单词功能:由用户指定每次背单词的数目,程序随机分配挑选给定个数的单词(不重复);用户输入相应英语单词,程序给出中文解释;判断输入单词的正误,输入正确得一分;对每个单词统计总得分;总得分最低的单词为生疏单词,让这类单词多出现。

共参考:

#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 (Min > q->frequency) Min = q->frequency;
            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 || x <= 0) {
        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; 
        }
    }
}