C语言趣味代码(五)

我想以此篇结束关于C语言的博客,因为在C语言拖得越久越不能给大家带来新的创作,在此我也相信大家对C语言已经有了一个新的认知。进入正题,在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍,从测试版逐步改良,每一步详细讲解让大家能够对学过的知识再有一个全新的认知。

1. 英语练习软件

1.1 单词显示软件

在编写英语学习软件之前,我们先来编写一个只能随机显示单词的程序,我们看下面的代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define QNO 12//单词的数量
char* cptr[] = { "动物","汽车","花","家","桌子","书",
				"椅子","爸爸","妈妈","爱","和平","杂志"};
char* eptr[] = { "animal","car","flower","house","desk","book",
                 "chair","father","mother","love","peace","magazine"};
int main()
{
	int nq, pq;//题目编号和上一次的题目编号
	int sw;//选择中文英文
	int retry;//是否接着尝试
	srand(time(NULL));
	pq = QNO;
	do
	{
		do 
		{
			nq = rand() % QNO;
		} while (nq == pq);
		sw = rand() % 2;
		printf("%s\n", sw ? eptr[nq] : cptr[nq]);
		pq = nq;
		printf("再来一次吗?0-否/1-是:");
		scanf("%d", &retry);
	} while (retry == 1);
	return 0;
}

我们简单运行一下看看效果,然后再这个基础上进行改良:

 程序运行。从“动物”,“汽车”.....以及与这些词对应的英语单词“animal”,"car"...这12组共24个单词中随机选出的单词被显示出来,用于存放指向单词字符串的指针的数组有2个,中文单词是cptr,英文单词的数组是eptr,我们把这两个数组的下标成为单词的“编号”。为了随机选择单词,我们需要用到2个变量nq和sw,这2个变量的值都是随机的。变量nq表示要显示的单词的编号。nq的值设为大于等于0小于QNO的随机数。变量nq设定与上一次现实的单词的编号pq不同的值,所以同一个编号的单词不会被连续选中。变量sw表示显示中文或者英文。sw的值为0时显示为中文单词,为1时显示英语单词,值0和1设为随机数。

1.2 向单词学习软件扩展

在刚才的程序中只能显示单词,现在我们要显示单词的时候提供选项,共学习者选择,学习者选完程序进行正误判断。我们呢来实现一下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define QNO 12
#define CNO 4
char* cptr[] = { "动物","汽车","花","家","桌子","书",
				"椅子","爸爸","妈妈","爱","和平","杂志"};
char* eptr[] = { "animal","car","flower","house","desk","book",
                 "chair","father","mother","love","peace","magazine"};
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;
	c[0] = n;
	for (i = 1; i < CNO; i++)
		c[i] = rand() % QNO;
	return 0;
}
int main()
{
	int nq, pq;
	int na;
	int sw;
	int retry;
	int cand[CNO];
	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)
				printf("\a回答错误。");
		} while (no != na);
		printf("回答正确。");
		pq = nq;
		printf("再来一次吗?0-否/1-是");
		scanf("%d", &retry);
	} while (retry == 1);
	return 0;
}

我们来运行一下看看效果:

 决定用于出题的单词的方法和上一个程序相同,在这个程序中追加了两个函数,下面我们就一起来学习一下这两个函数。

  1. 函数print_cand:显示选项
  2. 函数make_cand:生成选项

函数print_cand用于显示选项,它将接受下面两个参数:

 c:存有选项编号的数组

参数c接收的是存有选项单词编号的数组。

sw:题目的语言(英文/中文)

参数sw的值表示用来出题的单词的语言。若用的是英语,则sw为1,若为中文,则sw为0。for语句 中则显示与题目相反的单词。

函数make_cand用于生成要提示的4个选项,他将接收下面两个参数:

c:存有选项编号的数组

参数c接收的是存有选项单词编号的数组。

n:题目(正确答案)的编号

参数n接收的是正确答案(用于出题的单词)的编号。

运行程序我们会发现,这个程序存在两个隐藏问题:正确答案一定位于选项开头的位置,这让一来学习者就知道答案了。由于后面3个选项设为大小等于0小于QNO的随机数,因此可能会生成相同的随机数值,此时就会出现重复的选项。

1.3 生成选项(改良版本)

为了解决上面程序中的隐藏问题,我们可以将make_cand函数修改成下面这样:

int make_cand(int c[],int n)
{
  int i,j,n;
  c[0]=n;
  for(i=1;i<CNO;i++)
   {
     do
     {
       n=rand()%QNO;
       for(j=0;j<i;j++)
        if(c[j]==n)
          break;
     }while(i!=j);
     c[i]=n;
   }
  j=rand()%CNO;
  if(j!=0)
   swap(int,c[0],c[j]);
  return j;
}

此项的操作和上一个程序相同,把正确答案的编号n赋给数组的开头元素c[0]。这个for语句负责生成剩下的3个选项,把变量i的值增量给1,2,3,进行3次循环。这里和前面程序的不同之处在于,for语句的循环体里面加入了do...while语句,形成了二重循环的结构,在内侧的do...while语句的作用下,程序会一直重复生成随机数直到出现没有选过的选项值为止,这样一来就避免了选项出现重复,接下来我们要做的是移动正确答案,首先生成随机数0~3,把该值设为j,如果生成的随机数刚好为0,那么就变成了c[0]和c[0],这是程序会通过if语句跳过交换处理(正确答案的移动操作)。此外,用随机数生成的j的值的范围必须设为0~3而不能是1~3,因为正确答案绝不能位于开头。

1.4 单词文件的读取

如果用于出题的单词只有12个,学习者很容易就能记住,下面我们来让程序能够处理更多的单词。如果单词达到了一定的数量,那么就应该提供一个单词专用文件,以便追加和删除单词,但是在这种情况下,程序方面单词数量就会变得不明确,也就无法把单词存入“数组”,因此在声明时数组的元素个数必须是已知的,因此我们需要在运行程序时为任意元素个数的数组动态分配空间。

#include<stdio.h>
#include<time.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_tango()
{
    int i;
    FILE* fp;
    if ((fp = fopen("TANGO.txt","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()
{
    int i;
    int nq, pq;
    int na;
    int sw;
    int retry;
    int cand[CNO];
    if (read_tango() == 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)
                printf("回答错误。");
        } while (no != na);
        printf("回答正确。");
        pq = nq;
        printf("再来一次吗?0-否/1-是:");
        scanf("%d", &retry);
    } while (retry == 1);
    for (i = 0; i < QNO; i++)
    {
        free(eptr[i]);
        free(cptr[i]);
    }
    free(eptr);
    free(cptr);
    return 0;
}

我们来运行一下看看效果:

用于存放中文单词的cptr和用于存放英语单词的eptr这两个指针指向的都是指向char型的指针,即指向“指向已动态分配的字符串的”指针的数组。我们准备的单词数据是以“TANGO”为名称的文本文档形式,如下图:

第一行写入了一个整数值表示单词数量,从第二行起准备了英语单词和对应的中文释义,函数read_tango用于打开文本文件“TANGO”,并在分配存储空间的同时读取单词,当文件无法打开时或者存储空间分配失败时返回1,正常读取时返回0。在这里读取文件会常遇到一个问题那就是中文会出现乱码的情况,如下图:

那怎么解决这种问题呢?我只需要找到文本文件点击另存为,将其编码改为ASNI即可:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/597791.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——图的基础知识与其表示

一&#xff1a;定义 由顶点的集合和边的集合组成&#xff1b;常以 G(V,E) 表示&#xff0c;G 代表图&#xff0c;V代表 顶点的集合&#xff0c;E代表边的集合&#xff1b; 如图&#xff1a; 在G1图中&#xff0c;有 0~4 五个顶点&#xff0c;有 0-1&#xff0c;0-2&…

专题五_位运算(2)

目录 面试题 01.01. 判定字符是否唯一 解析 题解 268. 丢失的数字 解析 题解 371. 两整数之和 解析 题解 面试题 01.01. 判定字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:bool isUnique…

Ubuntu上使用audit2allow解决Android Selinux问题

1.安装工具 sudo apt install policycoreutils 2.运行命令 提前用dmesg或者串口抓取kernel log 遇到错误&#xff0c;提示需要用-p指定policy file&#xff0c;然偶尝试创建一个policy空文件&#xff0c;用-p选项&#xff0c;遇到如下错误 3.规避问题 首先跟进错误log的堆栈…

面试集中营—Spring篇

Spring 框架的好处 1、轻量&#xff1a;spring是轻量的&#xff0c;基本的版本大约2MB&#xff1b; 2、IOC&#xff1a;控制反转&#xff0c;Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了&#xff0c;而是由容易来控制&#xff0c;一个字&#xff1a;爽&#xf…

leetcode-有重复数字的全排列-98

题目要求 思路 1.同【没有重复项的全排列-97】这个题一样&#xff0c;都是递归的题&#xff0c;区别在于这个可能会包含重复的数字&#xff0c;因此&#xff0c;不能只是简单的通过两个值是否相等然后用标志位标记&#xff0c;而是新增了一个数组&#xff0c;这个数组专门用于…

libevent的使用

文章目录 libevent封装的框架思想常用函数分析使用fifo的读写未决和非未决bufferevent特性bufferevent函数客户端和服务器连接和监听libevent实现socket通信 libevent封装的框架思想 libevent框架&#xff1a;1. 创建 event_base (乐高底座)2. 创建 事件evnet 3. 将事件 添加…

【C++练级之路】【Lv.20】位图和布隆过滤器(揭开大数据背后的神秘面纱)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、位图1.1 位图的概念1.2 位图的优势1.3 位图的模拟实现1.3.1 成员变量与默认成员函数1.3.2 test1.3.3…

AI智能分析视频监控行业的发展趋势和市场发展浅析

监控视频AI智能分析技术的现状呈现出蓬勃发展的态势&#xff0c;这一技术源于计算机视觉和人工智能的研究&#xff0c;旨在将图像与事件描述之间建立映射关系&#xff0c;使计算机能够从视频图像中分辨出目标信息。 在技术上&#xff0c;监控视频AI智能分析技术已经实现了对视…

Jenkins 2.164.3 安装插件(当前官网正式版本: 2.440.3 LTS)

Jenkins 2.164.3安装插件 1. 安装jenkins1.1 宿主机安装1.2 docker安装(linux) 2. 登录jenkins3. 修改配置文件 这篇文章如果放在5、6年前写出来毫无意义&#xff0c;因为安装2.164.3之后&#xff0c;推荐的插件即可自动安装。但是在2024年&#xff0c;当前正式版本是2.440.3 L…

【论文阅读】 Loss Functions for Image Restoration with Neural Networks

Loss Functions for Image Restoration with Neural Networks 论文地址摘要I. 引言II 相关工作用于图像恢复的神经网络B 找到更好的解决方案。 三、图像恢复的损失层A. l1 错误 The l1 ErrorB. SSIMC. MS-SSIMD. The Best of Both Worlds: MS-SSIM L1 四、结果A. Joint Denois…

四化智造MES(WEB)对接打通金蝶云星空余料入库查询(入库记录查询)接口与生产退料单新增接口

四化智造MES&#xff08;WEB&#xff09;对接打通金蝶云星空余料入库查询&#xff08;入库记录查询&#xff09;接口与生产退料单新增接口 接通系统&#xff1a;四化智造MES&#xff08;WEB&#xff09; “MES助力智能制造过程控制:MES管理生产订单的整个生产流程,通过对生产过…

npm install 及使用cordova打包常见错误大全(附解决方案)

问题1、cb() 这是我们在install过程中最最常见问题&#xff0c;网络上的解决方式也都是大同小异&#xff0c;要么就是升级node(误人子弟)&#xff0c;项目里的node是不可以随意升级的&#xff0c;它有可能会导致其他依赖又不适配&#xff0c;起始很多时候就是由于咱们配置的镜像…

Linux基础之git与调试工具gdb

目录 一、git的简单介绍和使用方法 1.1 git的介绍 1.2 git的使用方法 1.2.1 三板斧之git add 1.2.2 三板斧之git commit 1.2.3 三板斧之git push 二、gdb的介绍和一些基本使用方法 2.1 背景介绍 2.2 基本的使用方法 一、git的简单介绍和使用方法 1.1 git的介绍 Git是一…

记录一下3月底到4月的前端开发工程师面经

文章会持续更新 1.https 原理&#xff08;加密 证书&#xff09; 客户端使用https的url访问web服务器&#xff0c;要求与服务器建立ssl连接web服务器收到客户端请求后&#xff0c;会将网站的证书&#xff08;包含公钥&#xff09;传送一份给客户端客户端收到网站证书后会检查证…

学术咸鱼入门指南(2)

巧用思维导图阅读文献 化整为零&#xff1a;读文献&#xff0c;从拆分文章的结构开始 大家在初步接触自己学科的论文时&#xff0c;要了解清楚基本的范式&#xff0c;日后读起来就比较顺了。 科研论文的第一部分&#xff0c;是文章的标题&#xff0c;摘要和关键词&#xff0…

HNU-人工智能-作业1

人工智能-作业1 计科210x 甘晴void 第1题 考虑一个实时的在线电话翻译系统&#xff0c;该系统实现英语与日语之间的实时在线翻译&#xff0c;讨论该系统的性能度量&#xff0c;环境&#xff0c;执行器&#xff0c;感知器&#xff0c;并对该环境的属性进行分析。&#xff08;10…

革新品质检测,质构科技重塑肉类行业新篇章

革新品质检测&#xff0c;质构科技重塑肉类行业新篇章 在现代社会&#xff0c;消费者对食品安全和品质的要求日益提升&#xff0c;特别是在肉类行业。为了满足这一市场需求&#xff0c;质构科技凭借其精准、高效的优势&#xff0c;正逐渐成为肉类品质检测的新星。今天&#xf…

网络安全的未来:挑战、策略与创新

引言&#xff1a; 在数字化时代&#xff0c;网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化&#xff0c;如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样&#xff0c;包括但不限于恶意软件、…

iPhone查看本机号码只需要这3招,不再为号码忘记犯愁!

在日常生活中&#xff0c;我们经常需要使用手机号码进行各种通讯活动&#xff0c;但有时候会忘记自己的手机号码&#xff0c;让人感到非常尴尬。不过&#xff0c;如果您是iPhone用户&#xff0c;那么您可以放心了&#xff01;因为在iphone查看本机号码只需要简单的几个步骤&…

ShardingSphere 5.x 系列【27】 数据分片原理之 SQL 改写

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 正确性改写2.1 标识符改写2.1.1 表名称2.1.2 索引名称2.1.3 Schem…
最新文章