C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
目录
一、程序填空题 --- 查找字母以及其他字符个数
题目
分析
二、程序修改 --- 数字字符串转双精度值
题目
分析
小数位字符串转数字
三、程序设计 --- 二维数组上下三角区域数据对调
题目
分析
前言
本文来讲解:
查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调C语言二级,最好是能弄懂每一道程序题,这样会对自己的编程能力有很大的提升
适用人群:
- 要参加C语言二级
- 中职学生
- 想提升C语言编程思维
- C语言爱好者
一、程序填空题 --- 查找字母以及其他字符个数
难度:⭐
题目
以下程序的功能是:
统计字符串 (长度不超过 1000 个字符) 中每个字母的个数(不区分大小写),若字符不是字母,则统一归为其他字符。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
代码如下:
在1️⃣2️⃣3️⃣处填空
#include<stdio.h>
#include<string.h>
void countstr(char *st,int cutor[]);
void main()
{char s[1000];
/**********************found***********************/int counters[27]= ___1️⃣___,i;printf("Input a string\n");gets(s);countstr(s,counters);
/**********************found***********************/for(i=0; i<=___2️⃣___;i++)printf("%c : %d\n",i+65,counters[i]);printf("others : %d\n",counters[i]);
}void countstr(char *st,int cutor[])
{int i,j;char t;i=strlen(st);for(j=0;j<i;j++){t=st[j];if(t>='a'&&t<='z')t=t-'a'+'A';if(t>='A'&&t<='Z')
/**********************found***********************/cutor[t- ___3️⃣___]++;elsecutor[26]++;}
}
分析
根据题意以及代码可知
利用27个元素的cutor数组存储26个元素以及1个其他符号
当遇到字母a或A(不区分大小写),则在0号元素位置加一
也就是:'A' - 'A' ----> '任意字母' - 'A' 就是对应的数组下标了
解答代码如下:
#include<stdio.h>
#include<string.h>
void countstr(char *st,int cutor[]);
void main()
{char s[1000];
/**********************found***********************///因为数组里存放的是26个字母以及其他字符的个数//所以要先初始化为 0int counters[27]= 1️⃣{0},i;printf("Input a string\n");gets(s);countstr(s,counters);
/**********************found***********************///因为由for循环下面的输出语句可以知道//最下面个的是输出其他字符//那么当前的这个循环就是输出字母//字母有26个,从0开始就是到25for(i=0; i<=2️⃣25;i++)printf("%c : %d\n",i+65,counters[i]);printf("others : %d\n",counters[i]);
}void countstr(char *st,int cutor[])
{int i,j;char t;i=strlen(st);for(j=0;j<i;j++){t=st[j];if(t>='a'&&t<='z')t=t-'a'+'A';if(t>='A'&&t<='Z')
/**********************found***********************///因为这里要保存某个字母的出现次数//所以就要将对应的字母转换为相应的元素//也就是字母 - 字符A就可以求得当前元素位置了cutor[t- 3️⃣'A']++;elsecutor[26]++;}
}
二、程序修改 --- 数字字符串转双精度值
难度:⭐⭐⭐
题目
函数 int strtoval (char pst [], double* p) 的功能是,将 pst 中带符号的数字字符串转换成双精度数值,直到遇到非数字字符为止。函数返回值为 1 表示转换成功,为 0 表示转换失败,函数成功转换后的数值存储在指针 p 所指的存储单元中。
如:
+123.65a 转换数值后输出 + 123.650000,函数返回值为 1。
-32-3 转换数值后输出 - 32.000000,函数返回值为 1。
56.76a 转换数值后输出 + 56.760000,函数返回值为 1。
283.125 转换数值后输出 + 283.125000,函数返回值为 1。
对 + a8.6 转换失败,函数返回值为 0,输出出错信息。
请改正函数 fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。
代码如下:
在代码中找出3个错误并修改
#include<stdio.h>
int strtoval(char pst[],double* p)
{int sucs;int plus;int i=0;double frac=0.1;*p=0.0;while(pst[i]==' ') i++;
/**********************found***********************/if(pst[i]=='+'&& pst[i]>='0'&&pst[i]<='9'){plus=1;sucs=1;}else if(pst[i]=='-'){plus=0;sucs=1;}else {sucs=0;return sucs;}
/**********************found***********************/if(pst[i]=='+'&& pst[i]=='-')i++;if(pst[i]==' ')i++;if(!(pst[i]>='0'&&pst[i]<='9')){sucs=0;return sucs;}while(pst[i]!='\0'){if(pst[i]>='0'&&pst[i]<='9'){*p=*p*10+pst[i]-'0';i++;}else if(pst[i]== '.')break;else {if(plus==0)*p=-1.0**p;return sucs;}}
/**********************found***********************/if(pst[i]!= '.'){i++;while(pst[i]!='\0'){if(pst[i]>='0'&&pst[i]<='9'){*p=*p+(pst[i]-'0')*frac;frac/=10;i++;}else{if(plus==0)*p=-1.0**p;return sucs;}}return sucs;}return sucs;
}void main()
{char str[][100]={" +123.65a"," -32-3"," 56.76a"," + 283.125"," +a8.6" };double a;int i;for(i=0;i<5;i++)if(strtoval(str[i],&a)==1)printf("vol=%f\n",a);else printf("error,the string is %s\n",str[i]);
}
分析
简要分析题意:
函数 strtoval 的功能是将字符串 pst 转换为双精度浮点数
并将结果存储在指针 p 所指向的内存中
函数返回一个整数,表示转换是否成功,1 表示成功,0 表示失败
根据题意可以知道(可以先分析变量的作用):
sucs 用于检测转换是否成功
plus 用于标记数值是正数还是负数
frac 用于处理小数部分,初始值为 0.1
解答代码如下:
#include<stdio.h>int strtoval(char pst[], double* p) {// sucs 用于记录转换是否成功,1 表示成功,0 表示失败int sucs;// plus 用于记录数值是正数还是负数,1 表示正数,0 表示负数int plus;// i 作为数组的索引,用于遍历字符串int i = 0;// frac 用于处理小数部分,初始值为 0.1,后续每处理一位小数就缩小 10 倍double frac = 0.1;// 将指针 p 所指向的内存初始化为 0.0,为后续存储转换后的双精度浮点数做准备*p = 0.0;// 跳过字符串开头的空格字符// 因为输入的字符串可能在数字或符号前有多个空格,所以使用循环跳过这些空格while (pst[i] == ' ') i++;/**********************found***********************/// 如果当前字符是 '+' 或者是数字字符// 这意味着字符串开头可能是正号或者直接是数字//所以要用逻辑或if (pst[i] == '+'|| (pst[i] >= '0' && pst[i] <= '9')) {// 记录为正数plus = 1;// 记录转换可能成功,因为当前字符符合预期,后续还需继续检查sucs = 1;} // 如果当前字符是 '-'// 表示字符串代表的是一个负数else if (pst[i] == '-') {// 记录为负数plus = 0;// 记录转换可能成功,后续同样要继续检查剩余字符sucs = 1;} // 若既不是 '+'、'-' 也不是数字字符// 说明字符串的起始部分不符合数字转换的要求else {// 记录转换失败sucs = 0;// 返回失败结果,终止函数执行return sucs;}/**********************found***********************/// 如果当前字符是 '+' 或者 '-'// 这是符号位,在后续处理数字时需要跳过if (pst[i] == '+' || pst[i] == '-')// 跳过符号字符i++;// 如果跳过符号后当前字符是空格// 同样需要跳过,保证后续处理的是有效的数字字符if (pst[i] == ' ')// 继续跳过空格i++;// 如果当前字符不是数字字符// 即跳过符号和可能的空格后,没有紧接着有效的数字,说明转换无法继续if (!(pst[i] >= '0' && pst[i] <= '9')) {// 记录转换失败sucs = 0;// 返回失败结果,终止函数执行return sucs;}// 以下开始处理整数部分,直到字符串结束while (pst[i] != '\0') {// 如果当前字符是数字字符if (pst[i] >= '0' && pst[i] <= '9') {// 将当前数字字符转换为数字并累加到 *p 中// 通过 pst[i] - '0' 把字符形式的数字转换为对应的数值,然后更新 *p*p = *p * 10 + (pst[i] - '0');// 移动到下一个字符,继续处理后续内容i++;} // 如果遇到小数点// 意味着整数部分处理结束,要开始处理小数部分else if (pst[i] == '.')// 跳出循环,开始处理小数部分break;// 如果遇到非数字和非小数点的字符// 说明字符串中出现了不符合数字格式的内容else {if (plus == 0)*p = -1.0 * *p;return sucs;}}
/**********************found***********************///如果是小数点的话,就进行小数位的运算if(pst[i]== '.'){i++;while(pst[i]!='\0'){if(pst[i]>='0'&&pst[i]<='9'){ //小数位的转换//先让小数位的数字乘frac(初始为0.1)//之后再将frac*10也就是小数的又后一位//就可以让其变成小数了*p=*p+(pst[i]-'0')*frac;frac/=10;i++;}else{if(plus==0)*p=-1.0**p;return sucs;}}return sucs;}return sucs;}void main() {char str[][100] = {" +123.65a"," -32-3"," 56.76a"," + 283.125"," +a8.6"};double a;int i;for (i = 0; i < 5; i++) {if (strtoval(str[i], &a) == 1)printf("vol=%f\n", a);elseprintf("error,the string is %s\n", str[i]);}
}
程序修改题里面,如果没有思路,可以根据运算符来猜测怎样修改
因为计算机二级考试会有
/**********************found***********************/
这一行进行注释,那么这一行的下面一般就是程序错的位置了
小数位字符串转数字
这里提到了小数位数的字符串转小数,还是很实用的,这里再讨论一下这里
int frac = 0.1;
int i;
for(i = 0; pst[i] != '\0'; i++)
{//小数位的转换//先让小数位的数字乘frac(初始为0.1)//之后再将frac*10也就是小数的又后一位//就可以让其变成小数了*p=*p+(pst[i]-'0')*frac;frac/=10;i++;
}
三、程序设计 --- 二维数组上下三角区域数据对调
难度:⭐⭐⭐
题目
编写一个函数
void change(int p[][N], int n),其功能是将一个int型二维数组的上下三角区域的数据对调,数组大小限制在 100X100。例如,
N = 7时,有二维数组:int a[N][N] = { {11,12,13,14,15,16,17}, {21,22,23,24,25,26,27}, {31,32,33,34,35,36,37}, {41,42,43,44,45,46,47}, {51,52,53,54,55,56,57}, {61,62,63,64,65,66,67}, {71,72,73,74,75,76,77} };上下三角区域的数据对调后
a数组内容为:{11,21,31,41,51,61,71, 12,22,32,42,52,62,72, 13,23,33,43,53,63,73, 14,24,34,44,54,64,74, 15,25,35,45,55,65,75, 16,26,36,46,56,66,76, 17,27,37,47,57,67,77}
代码如下:
在change函数中编写
#include<stdio.h>
#define N 7
void change(int p[][N],int n)
{}void main()
{ int i,j;int a[N][N]={{11,12,13,14,15,16,17},{21,22,23,24,25,26,27},{31,32,33,34,35,36,37},{41,42,43,44,45,46,47},{51,52,53,54,55,56,57},{61,62,63,64,65,66,67},{71,72,73,74,75,76,77}};for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}change(a,N); printf("对调后的二维数组:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}
}
分析
本题看似偏难,但是往正确的方向去想了,找到规律了,就容易了
上下三角区域:也就是右斜中心线不动,对应的行和列进行对调,如图

所以可以先定义i和j两个变量来充当二维数组的行和列
i为行下标,j为列下标
解答代码如下:
#include<stdio.h>
#define N 7
void change(int p[][N],int n)
{int i, j;//控制行for( i = 0; i < n; i++ )//控制列//i + 1是因为在i的左边是已经换好了的//那么i的右边则是没有交换过的//而与i相等没必要做交换所以j = i + 1;for( j = i+1; j < n; j++ ){ //行列行列进行交换int flag = p[i][j];p[i][j] = p[j][i];p[j][i] = flag;}
}void main()
{ int i,j;int a[N][N]={{11,12,13,14,15,16,17},{21,22,23,24,25,26,27},{31,32,33,34,35,36,37},{41,42,43,44,45,46,47},{51,52,53,54,55,56,57},{61,62,63,64,65,66,67},{71,72,73,74,75,76,77}};for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}change(a,N); printf("对调后的二维数组:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}
}
这里就是要注意列j的变化
希望本文对您有所帮助(* ̄︶ ̄)
本文专栏:C语言二级
苟日新,又日新,日日新
相关文章:
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
目录 一、程序填空题 --- 查找字母以及其他字符个数 题目 分析 二、程序修改 --- 数字字符串转双精度值 题目 分析 小数位字符串转数字 三、程序设计 --- 二维数组上下三角区域数据对调 题目 分析 前言 本文来讲解: 查找字母以及其他字符个数、数字字符串…...
VPR概述、资源
SOTA网站: Visual Place Recognition | Papers With Code VPR(Visual Place Recognition) 是计算机视觉领域的一项关键任务,旨在通过图像匹配和分析来识别场景或位置。它的目标是根据视觉信息判断某个场景是否与数据库中的场景匹…...
Electron学习笔记,安装环境(1)
1、支持win7的Electron 的版本是18,这里node.js用的是14版本(node-v14.21.3-x86.msi)云盘有安装包 Electron 18.x (截至2023年仍在维护中): Chromium: 96 Node.js: 14.17.0 2、安装node环境,node-v14.21.3-x86.msi双击运行选择安…...
58.界面参数传递给Command C#例子 WPF例子
界面参数的传递,界面参数是如何从前台传送到后台的。 param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤: 数据绑定:界面元素(如按钮)的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时&#x…...
Git图形化工具【lazygit】
简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…...
前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
AI大模型开发原理篇-3:词向量和词嵌入
简介 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。在实际应用中,词向量和词嵌入这两个重要的NLP术语通常可以互换使用。它们都表示将词汇表中的单词映射到固定大小的连续向量空间中…...
三个不推荐使用的线程池
线程池的种类 其实看似这么多的线程池,都离不开ThreadPoolExecutor去创建,只不过他们是简化一些参数 newFixedThreadPool 里面全是核心线程 有资源耗尽的风险,任务队列最大长度为Integer.MAX_VALUE,可能会堆积大量的请求ÿ…...
星际战争模拟系统:新月的编程之道
星际战争模拟系统:新月的编程之道 作为一名在 25 世纪星际时代成长起来的科学家和军事战略家,我对编程和人工智能的热爱始于童年。我的父亲是一位著名的物理学家,母亲是一位杰出的生物工程师。在他们的影响下,我从小就对科学和技术…...
【CS61A 2024秋】Python入门课,全过程记录P4(Week7 Generators开始,更新于2025/1/29)
文章目录 关于基本介绍👋新的问题更好的解决方案Week7Mon Generators阅读材料Lab 05: Iterators, MutabilityQ1: WWPD: List-MutationQ2: Insert Items 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&…...
Fort Firewall:全方位守护网络安全
Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具,旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台(WFP),能够与系统无缝集成,确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…...
【数据结构】_C语言实现不带头非循环单向链表
目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表,已介绍顺序表,详见下文: 【数据结构】_顺序表-CSDN博客 本文介绍链表; 基于顺序表…...
【Qt】06-对话框
对话框 前言一、模态和非模态对话框1.1 概念1.2 模态对话框1.2.1 代码QAction类 1.2.2 模态对话框运行分析 1.3 非模态对话框1.3.1 代码局部变量和成员变量setAttribute 类 1.3.2 现象解释 二、标准对话框2.1 提示对话框 QMessageBox2.1.1 现象及解释 2.2 问题对话框2.2.1 现象…...
特征缩放:数据归一化
First,新年到了!感谢CSDN一路相伴,成为技术交流的温馨港湾。值此蛇年新春,祝平台人气蒸蒸日上,活动精彩纷呈,助力更多开发者突破技术瓶颈,在新的一年创造无限可能,新年快乐ÿ…...
Kubernetes 环境中的自动化运维实战指南
Kubernetes 作为容器编排领域的领导者,已经成为云原生应用的核心基础设施。然而,随着集群规模的扩大和应用的复杂化,手动运维 Kubernetes 集群变得愈发困难。自动化运维成为提升效率、保障系统稳定性的关键。本文将详细介绍如何在 Kubernetes 环境中实施自动化运维,涵盖工具…...
深入探讨Web应用开发:从前端到后端的全栈实践
在数字化时代,Web应用已成为连接用户与服务的关键桥梁。无论是电商平台、社交媒体,还是企业内部管理系统,Web应用都扮演着不可或缺的角色。本文将深入探讨Web应用开发的全栈实践,从前端的用户体验设计到后端的数据处理与存储&…...
分享|通过Self-Instruct框架将语言模型与自生成指令对齐
结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限, 从而阻碍模型通用性的背景下, Self - Instruct 框架, 通过 自动生成 并 筛选指令数据 微调预训练语言模型, 有效提升了其指令遵循能…...
扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
在数字化时代,音频内容的重要性不言而喻。无论是在线课程、有声读物,还是各种多媒体应用,音频都是传递信息、增强体验的关键元素。扣子平台的音频功能,为开发者和内容创作者提供了一个强大而灵活的工具,让音频的使用和…...
超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准
摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…...
C++并发编程指南03
文章目录 传递参数2.2.1 基本参数传递示例: 2.2.2 注意动态变量指针的传递错误示例:正确示例: 2.2.3 引用参数的传递错误示例:正确示例: 2.2.4 成员函数和对象指针的传递示例:带参数的成员函数示例…...
大数据Hadoop入门3
目录 第五部分(Apache Hive DML语句和函数使用) 1.课程内容大纲和学习目标 2.Hive SQL-DML-load加载数据操作 3.Hive SQL-DML-insert插入数据 4.Hive SQL-DML-select查询-语法书和环境准备 5.Hive SQL-DML-select查询-列表达式和distinct去重 6.Hi…...
Autosar-Os是怎么运行的?(多核系统运行)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…...
【硬件介绍】三极管工作原理(图文+典型电路设计)
什么是三极管? 三极管,全称为双极型晶体三极管,是一种广泛应用于电子电路中的半导体器件。它是由三个掺杂不同的半导体材料区域组成的,这三个区域分别是发射极(E)、基极(B)和集电极&…...
MATLAB基础应用精讲-【数模应用】DBSCAN算法(附MATLAB和python代码实现)
目录 前言 几个高频面试题目 DBSCAN和传统聚类算法对比 算法原理 发展历程 主要事件 发展分析 什么是DBSCAN DBSCAN算法的聚类过程 DBSCAN算法的样本点组成 几个相关的概念: 算法思想 DBSCAN算法优缺点和改进 2.1 DBSCAN算法优缺点 2.2 DBSCAN算法改进 算法流…...
STM32 PWM驱动舵机
接线图: 这里将信号线连接到了开发板的PA1上 代码配置: 这里的PWM配置与呼吸灯一样,呼吸灯连接的是PA0引脚,输出比较单元用的是OC1通道,这里只需改为OC2通道即可。 完整代码: #include "servo.h&quo…...
基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)
一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…...
对比DeepSeek、ChatGPT和Kimi的学术写作摘要能力
摘要 摘要是文章的精华,通常在200-250词左右。要包括研究的目的、方法、结果和结论。让AI工具作为某领域内资深的研究专家,编写摘要需要言简意赅,直接概括论文的核心,为读者提供快速了解的窗口。 下面我们使用DeepSeek、ChatGPT…...
「Unity3D」在Unity中使用C#控制显示Android的状态栏
Unity打包的Android默认都是全屏,如果想要在真机上显示状态栏,就需要额外设置,有两种方式: 第一种,使用Android的Java代码去控制,然后以插件的方式放到Unity中,被C#调用。第二种,使…...
Lua 环境的安装
1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装,安装指令如下: winget install "lua for windows" 也曾使用可执行程序安装过,但由于电脑是加密电脑,最后都已失败告终。使用此方式安装可以安…...
Pyside的QWebEngineProfile类
QWebEngineProfile 是 PySide/Qt 中用于管理浏览器引擎(WebEngine)配置的类,属于 QtWebEngineCore 模块。它主要用于控制网页的全局行为,例如缓存、Cookie、持久化存储、用户代理(User-Agent)、代理设置等。…...
