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.mzph.cn/pingmian/7537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM笔记-常用命令

1、jstat jstat是一个极强的监视JVM的工具&#xff0c;可以用来监视JVM的各种堆和非堆的大小以及内存使用量。 Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]jstat的常用用法如图所示&#xff…

python - rst file to html

文章目录 python - rst file to html概述笔记下载安装PyCharm最新的学习版新建虚拟环境为Conda的工程添加docutils库新建python文件&#xff0c;添加转换代码运行自己写的python文件&#xff0c;执行转换转换结果END python - rst file to html 概述 开源工程中有一个.rst文件…

Java集合 总结篇(全)

Java集合 集合底层框架总结 List 代表的有序&#xff0c;可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以&#xff0c;当数组空间不够的时候&#xff0c;会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表&#xff0c;不支持…

Delta lake with Java--数据增删改查

之前写的关于spark sql 操作delta lake表的&#xff0c;总觉得有点混乱&#xff0c;今天用Java结合真实的数据来进行一次数据的CRUD操作&#xff0c;所涉及的数据来源于Delta lake up and running配套的 GitGitHub - benniehaelen/delta-lake-up-and-running: Companion reposi…

【JAVA |基础】运算符、程序逻辑控制以及方法的使用

目录 一、前言 二、操作符 1.算术运算符 2.赋值运算符 3.比较运算符 4.逻辑运算符 5.条件&#xff08;三目、三元&#xff09;运算符 6.位运算符(都是基于二进制来计算) 三、 程序逻辑控制 1.顺序结构 2.分支结构 if语句 Switch语句 3.循环结构 while语句 for循环…

Hive3.0新特性:Materialized Views 物化视图

Materialized Views 物化视图 在 Apache Hive 3.0 中引入了物化视图&#xff08;Materialized Views&#xff09;的支持&#xff0c;它们是预先计算并缓存了查询结果的数据结构&#xff0c;以提高查询性能和降低延迟。物化视图通过将查询的结果存储在物理表中来实现&#xff0…

算法提高之玉米田

算法提高之玉米田 核心思想&#xff1a;状态压缩dp 将图存入g数组 存的时候01交换一下方便后面判断即g数组中0为可以放的地方 state中1为放的地方 这样只要state为1 g为0就可以判断不合法 #include <iostream>#include <cstring>#include <algorithm>#includ…

桥接模式类图与代码

欲开发一个绘图软件&#xff0c;要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例&#xff0c;对应的绘图程序如表 7.7 所示。 根据绘图软件的扩展性要求&#xff0c;该绘图软件将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况&#xff0c;现采用桥接…

Application exit(Out of memory)

Qt for WebAssembly 开发的网页&#xff0c;在 iOS 设备上打开会提示&#xff1a;Out of memory 如图&#xff1a; 解决办法&#xff1a; 环境&#xff1a;Qt 6.7.0 WebAssembly multi-threaded Emscripten Compiler 3.1.50 在CMakeLists.txt 中增加&#xff1a; set_tar…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看&#xff08;非必须&#xff09; docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地&#xff0c;这样即使容器被删除&#xff0c;数据也不会丢失。 mkd…

Python + selenium如何截图!

废话不多说&#xff0c;直接进入正题 一、直接截取网页全屏 截全屏的时候&#xff0c;我们用到的内置方法为save_screenshot("demo1.png") from selenium import webdriver from time import sleepclass test:driver webdriver.Chrome()driver.maximize_window()…

《架构思维:从程序员到CTO》:通往顶级架构师之路

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

PCIE协议-1

1. PCIe结构拓扑 一个结构由点对点的链路组成&#xff0c;这些链路将一组组件互相连接 - 图1-2展示了一个结构拓扑示例。该图展示了一个称为层级结构的单一结构实例&#xff0c;由一个根复合体&#xff08;Root Complex, RC&#xff09;、多个端点&#xff08;I/O设备&#xf…

ubuntu20部署3d高斯

3d高斯的链接&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 系统环境 ubuntu20的系统环境&#xff0c;打算只运行训练的代码&#xff0c;而不去进行麻烦的可视化&#xff0c;可视化直接在windows上用他们预编译好的exe去可视化。&#xff08;因为看的很…

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取 暗区突围是一款很火爆的第一人称射击网游&#xff0c;现在终于要上线PC端啦&#xff01;小伙伴们是不是已经迫不及待想要体验电脑上的硬核射击快感了&#xff1f;暗区突围pc端资格已经陆续发放&#xff0c;想要参与PC端…

TC8002D 是一颗带关断模式的音频功放IC

一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时&#xff0c;负载(3Ω)上的平均功率 为3 W&#xff0c;且失真度不超过10%。而对于手提设备而言&#xff0c;当VDD作用于关断端时&#xff0c;TC8002D将会进入关断模式&#xff0c;此时的功耗极…

探索淘宝API接口对接(属性规格丨sku价格丨详情图丨优惠券等):打造智能电商解决方案

一、引言 随着电子商务的快速发展&#xff0c;越来越多的企业和开发者希望通过自动化和智能化的方式接入电商平台&#xff0c;以实现更高效的数据交互和业务流程。淘宝作为中国最大的电商平台之一&#xff0c;其提供的API接口成为了众多企业和开发者关注的焦点。本文将探讨淘宝…

【spring】Bean的生命周期回调函数和Bean的循环依赖

目录 1、Bean的生命周期 2、Bean的生命周期回调函数 2.1、初始化的生命周期回调 2.2、销毁的生命周期回调 3、Bean的循环依赖 1、Bean的生命周期 spring的bean的生命周期主要是创建bean的过程&#xff0c;一个bean的生命周期主要是4个步骤&#xff1a;实例化&#xff0c;…

视频剪辑图文实例:一键操作,轻松实现视频批量片头片尾减时

视频剪辑是现代媒体制作中不可或缺的一环&#xff0c;而批量处理视频更是许多专业人士和爱好者的常见需求。在剪辑过程中&#xff0c;调整视频的片头片尾时长可以显著提升视频的质量和观感。本文将通过图文实例的方式&#xff0c;向您展示如何一键操作&#xff0c;轻松实现视频…

直播录屏怎么录?分享3种方法

随着网络直播的兴起&#xff0c;直播录屏已成为众多网友记录精彩瞬间、分享有趣内容的重要工具。直播录屏不仅能帮助我们回顾和保存直播中的精彩片段&#xff0c;还能为创作者提供更多的素材和灵感。 本文将为大家介绍3种直播录屏的方法&#xff0c;帮助大家能够更好地利用这一…