英语单词学习软件【动态分配空间】

以下是一串单词学习程序

/* 单词学习程序(从文件中读取单词)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define	CNO		4		/* 选项数量 */

#define swap(type, x, y)   do { type t = x; x = y; y = t; } while (0)

int	QNO;				/* 单词数量 */
char **cptr;			/* 指向中文单词的指针数组 */
char **eptr;			/* 指向英语单词的指针数组 */

/*--- 显示选项 ---*/
void print_cand(const int c[], int sw)
{
	int i;

	for (i = 0; i < CNO; i++)
		printf("(%d) %s  ", i, sw ? cptr[c[i]] : eptr[c[i]]);
	printf(":");
}

/*--- 生成选项并返回正确的下标 ---*/
int make_cand(int c[], int n)
{
	int i, j, x;

	c[0] = n;						/* 在开头元素中存入正确答案 */

	for (i = 1; i < CNO; i++) {
		do {						/* 生成不重复的随机数 */
			x = rand() % QNO;
			for (j = 0; j < i; j++)
				if (c[j] == x)		/* 已经生成了相同的随机数 */
					break;
		} while (i != j);
		c[i] = x;
	}

	j = rand() % CNO;
	if (j != 0)
		swap(int, c[0], c[j]);	/* 移动正确答案 */

	return j;
}

/*--- 读取单词 ---*/
int read_danci(void)
{
	int	i;
	FILE *fp;

	if ((fp = fopen("U3 TEXT A", "r")) == NULL) return 1;

	fscanf(fp, "%d", &QNO);			/* 读取单词数量 */

	if ((cptr = calloc(QNO, sizeof(char *))) == NULL) return 1;
	if ((eptr = calloc(QNO, sizeof(char *))) == NULL) return 1;

	for (i = 0; i < QNO; i++) {
		char etemp[1024];
		char ctemp[1024];

		fscanf(fp, "%s%s", etemp, ctemp);
		if ((eptr[i] = malloc(strlen(etemp) + 1)) == NULL) return 1;
		if ((cptr[i] = malloc(strlen(ctemp) + 1)) == NULL) return 1;
		strcpy(eptr[i], etemp);
		strcpy(cptr[i], ctemp);
	}
	fclose(fp);

	return 0;
}

int main(void)
{
	int i;
	int nq, pq;			/* 题目编号和上一次的题目编号 */
	int na;				/* 正确答案的编号 */
	int sw;				/* 题目语言(0:中文/1:英语)*/
	int cand[CNO];		/* 选项的编号 */

	if (read_danci() == 1) {
		printf("\a单词文件读取失败。\n");
		return 1;
	}
	srand(time(NULL));	/* 设定随机数的种子 */

	pq = QNO;			/* 上一次的题目编号(不存在的编号)*/

	do {
		int no;

		do {						/* 决定用于出题的单词的编号 */
			nq = rand() % QNO;
		} while (nq == pq);			/* 不连续出同一个单词 */

		na = make_cand(cand, nq);	/* 生成选项 */
		sw = rand() % 2;

		printf("哪一个是%s?\n", sw ? eptr[nq] : cptr[nq]);

		do {
			print_cand(cand, sw);	/* 显示选项 */
			scanf("%d", &no);
			if (no != na)
				puts("回答错误。");
		} while (no != na);
		puts("回答正确。");

		pq = nq;
		
	} while (1);

	for (i = 0; i < QNO; i++) {
		free(eptr[i]);
		free(cptr[i]);
	}
	free(cptr);
	free(eptr);

	return 0;
}

读取的文件需要自己创建

文件样例如下:

样例

运行结果

样例

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值