2023年信息科学与工程学院学生科协第二次软件培训
2023年信息科学与工程学院学生科协第二次软件培训
文章目录
- 2023年信息科学与工程学院学生科协第二次软件培训
- 一维数组
- 数组的概念
- 定义格式
- 一维数组的访问
- 例题:
- 练习题:
- 数组元素数量
- 一维数组的初始化
- 二维数组
- 定义格式
- 二维数组的访问
- 二维数组的存储结构
- 二维数组的初始化
- 例题
- 代码实现
- 字符型 char
- 字符在内存中的存储
- 单字节字符字面量
- ASCII 码表 (0~127)
- 补充:不同种数据参与算术运算时的规律
- 数据的地址
- 数组的地址
- 字符串
- 字符串字面量
- 字符数组
- '\0'的意义
- 字符串的输出
- 字符串的输入
- 常用的字符串处理函数
一维数组
数组的概念
a[10]: | a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|---|
9 | 1 | 3 | 5 | 7 | 9 | 2 | 4 | 6 | 8 |
可以把数组看作是一行连续的多个存储单元。
用更正式的说法是,数组是同类型数据元素的有序序列。
定义格式
通常我们是这样定义的:
数组中元素的类型 数组变量名[元素数量]
例如:
int x[10];
char z[10];
float y[10];
解释: int x[10]; 代表生成了10个格子,每个格子中只能装int型数据(否则将会发生自动类型转换)
注意:元素数量必须是一个正整数且在C99标准以前,元素数量必须是个确定的数(这里的“确定的数”之后会做更详细的解释)。
一维数组的访问
我们可以通过多种途径对一维数组进行访问:
scanf("%d", &x[0]); //读入一个数,并存放到x[0]中
printf("%d", x[1]); //输出x[1]的值
x[2] = 2; //将x[2]赋值为2
a = x[3]; //把x[3]的值赋给变量a
注意!!!下标不能越界!(下标指的是上式子中x[2]的2)
C语言中,数组下标范围是0到n-1,而不是1到n。而C语言不要求检查下标的范围。因此,当下标超出范围时,程序可能会执行不可预知的行为。
例题:
从键盘中输入10个int型数据,分行输出这些值,并输出它们的平均值
#include <stdio.h>
int a[10];
double sum = 0.0;
int i;
int main()
{for (i=0;i<10;i++) { scanf("%d", &a[i]); sum += a[i]; } for (i=0;i<10;i++) { printf("%d\n", a[i]); } printf("%d", sum);
}
可以看到,如果要获取数组的所有位置进行输入或输出,就必须要通过循环来“遍历”数组,即一个一个位置访问.
大家一定要注意这里for的开始和终止条件!到底循环了几次?每次i的值是多少?
显然,在这道题目中,for是从0开始循环,到9结束,一共循环了10次。
同样,这道题不使用数组也可以完成,具体的写法在直播中有提到,大家可以通过观看录播进行学习。
练习题:
从键盘中读入n(0<n<10),计算接下来输入n个整数,输出它们的平均数,并输出大于平均数的所有数。
(这道题在直播中也详细的讲述过,我们也不再赘述)
数组元素数量
回顾一下,如何理解下面这句话:
注意:元素数量必须是一个正整数且在C99标准以前,元素数量必须是个确定的数。
现在我们想先输入一个n,再根据n的值创建具有n个位置的数组a[n],就有:
#include <stdio.h>
int main()
{int n;scanf("%d", &n);int a[n]; //!!!for (int i=0;i<n;i++){scanf("%d", &a[i]);} for (int i=0;i<n;i++){printf("%d", a[i]);}
}
那么,这里 int a[n]; 中的n就并不是一个确定的数。所以,这一段代码在C99标准以前就不可以运行。大家可以在自己的编译器上运行,看看自己的编译器支不支持该操作。
如果不行的话,我们可以通过申请很大空间的数据来防止此问题,例如 int a[n]; 只要能保证n小于50,则该数组就可以实现我们的目的
一维数组的初始化
一维数组的初始化也有很多种方式,常用的有以下几种:
int a[3] = {0};//将所有元素初始化为0
int a[3] = {1, 2, 3};//对每个元素分别赋值
int a[] = {1, 2, 3};//偷懒的写法,让编译器自己计算数组的大小
已知数组a被下述语句初始化:
int a[6] = {1, 2, 3};
编程输出数组a的所有元素,你有什么发现?
输出应该是这样的:
1 2 3 0 0 0
二维数组
有的时候我们需要存储更多的信息,比如一个班级学生的语数外三门的分数,这个时候就需要用到二维数组(矩阵)。
姓名 | 语文 | 数学 | 英语 |
---|---|---|---|
X | 90 | 99 | 92 |
Y | 59 | 59 | 59 |
定义格式
二维数组有着一维数组类似的定义模式:
类型 数组变量名[维数1][维数2]
举个例子:
int x[5][9];
二维数组的访问
二维数组的内部大概是这样的:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | |||||||||
1 | |||||||||
2 | |||||||||
3 | |||||||||
4 |
x[i-1][j-1] 表示二维数组的第i行第j列的元素。以int x[5][9]为例:
该数组最后一个元素应该是x[4][8]
注意横纵坐标的开始都是0!(这一点跟一维数组一样)
下标不能越界!
二维数组的存储结构
二维数组本质上是数组的数组,即以数组作为数组元素的数组。
在内存中,二维数组和一维数组一样是以线性方式存储的。如图:
二维数组的初始化
同样的,二维数组也有很多种初始化的方法:
对每个元素进行赋值:
int x[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int x[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};对部分元素进行赋值:
int x[3][4]={{1,2},{5,6},{9,10}};
int x[3][4]={1,2,3};简略形式:
int x[][4]={1,2,3,4};
等价于
int x[1][4]={1,2,3,4};
例题
我们从键盘输入依次甲乙丙丁四人的语文、数学、英语成绩,最后如果一个人的数学成绩大于80,则输出他的三门课程的平均分(输入时按照下面表格的形式一行一行输入)
甲 | 乙 | 丙 | 丁 | |
---|---|---|---|---|
语文 | ||||
数学 | ||||
英语 |
代码实现
#include <stdio.h>
int main()
{int table[3][4];int i, j;int score=0;for(i=0;i<3;i++){for(j=0;j<4;j++){scanf("%d", &table[i][j]);}}for(j=0;j<4;j++){if(table[1][j]>80){score = table[0][j] + table[1][j] + table[2][j];printf("%lf", (double)score/3);}}return 0;
}
字符型 char
字符在内存中的存储
一个char类型变量在内存中仅占1个字节,即sizeof(char)的值为1,通常我们会将最高位定为0,所以此时一共会有128个字符,包括96个可打印字符和32个控制字符。字符是以ASCII码的形式储存在内存中的 (控制字符的ASCII码为0~31)。
但实际128个字符可能并不够用,所以不固定最高位的话会扩充到256个,但扩充的部分并不适用于所有的系统。
单字节字符字面量
由一对单引号括起来的单个字符,如 ‘a’, ’ ', ‘\n’, ‘\0’, ‘\141’,其类型为 int
例:
#include <stdio.h>int main() {printf("%llu", sizeof('a'));
}
输出
4
ASCII 码表 (0~127)
例:
#include <stdio.h>int main()
{char x = 97;printf("%c", x); // 根据ASCII码打印字符,a的ASCII码为97,故输出a
}
输出:
a
补充:不同种数据参与算术运算时的规律
一般来说,若两种类型的字节数不同,则会先将字节数低的数据类型转换成字节数高的类型再运算。
若字节数相同,但一种为有符号,一种无符号 (比如int与unsigned int),则会都转换成无符号再运算,因为这样可以最好地保存下来数据的精度
例:
-
char 或 short 型和 int 型参与运算,则会将 char 或 short 转换成 int
-
所有的浮点型都会先转换成 double 运算,即使是含 float 的表达式
-
int 或 float 型和 double 型参与运算,则会先将 int 或 float 转换成 double
可以用一元运算符 sizeof 在一定程度上验证这一点
#include <stdio.h>int main()
{int i = 10;short s = 20;char c = '\\';printf("%llu\n", sizeof(c + i));printf("%llu\n", sizeof(s + i));
}
输出
4
4
数据的地址
当你定义一个变量的同时,操作系统就会自动为变量分配一个储存它的位置。这个"位置"就是它的地址 (地址其实就是一个数值)。例如,定义变量 int a
,可以通过取地址符来获得它的地址,就像这样:&a
。
例:
#include <stdio.h>int main()
{int a = 0;printf("%llu", &a); // 将 a 在内存中的地址以 64 位无符号十进制整数的形式输出
}
数组的地址
分配给数组储存空间通常是连续的。所以,如果我们能提供第一个元素的地址,那么我们就能够找到后续的元素。
数组有一个特殊的性质:在表达式中,以及将数组作为函数参数进行传递时,数组会隐式转换成一个指针常量,其值为数组的首地址,且和数组第一个元素的地址相等。关于指针类型的相关知识,我们将在第三次软件培训给大家详细讲解。
字符串
C语言是没有字符串类型的,那要怎么存储字符串呢?我们知道,数组所占内存空间是连续的,那就很容易想到用字符数组存储字符串。
字符串字面量
字符串字面量:用双引号括起来的若干个字符,其类型为字符数组,不可以被修改,类似于整型字面量 1,2,3,所有字符串字面量结尾自带 '\0'
,例如 "esta"
,其类型为 char [5]
。
前后相接的若干个字符串字面量,就等价于只保留第一个和最后一个双引号。例如 "HHUC""ESTA""1234"
就等价于 "HHUCESTA1234"
。
字符数组
字符数组也可以像其他类型的数组一样,使用大括号初始化
char s0[5] = {'s', 'h', 'a', 'r', 'e'}; // 注意不要越界
char s1[] = {'e', 'f', 'f', 'o', 'r', 't'}; // 编译时自动计算长度,这里 s1 的长度为 6
char s2[10] = {'p', 'a', 'r', 't'}; // 同其他类型数组一样,若初始化不完全后面默认置0
除此之外,字符数组还可以用字符串字面量进行初始化。
char s0[] = "CHINA"; // 自带 '\0',故 s0 的长度为 6
char s1[20] = "CHINA"; // 初始化不完全,后面默认置 0
char s2[] = {'C', 'H', 'I', 'N', 'A'}; // s2 的长度为 5
'\0’的意义
\0
的 ASCII 码为 0,C语言标准库中的所有字符串处理函数,都是通过 '\0'
来得知字符串的结束位置。
字符串的输出
例:
char a[5] = {'a', 'b'};
// 给哪个地址就从哪里开始输出,直到'\0'时候结束输出 (不输出'\0')
printf("%s", a); // 或者 &a[0]char b[5] = {'a', 'b'};
puts(b); // 基本同 printf,但会额外输出换行
输出:
abab
字符串的输入
例:
char s[20]; // 数组长度为20,最多只能从键盘上输入19个字符,因为要给最后的'\0'留一个位置
scanf("%s", s); // 会自动加上'\0',注意输入空格会停止读取
printf("%s", s);
输入:
Hello World
输出:
Hello
例:
char s[20];
gets(s); // gets可以读入空格
printf("%s", s);
输入:
My name is ZhangSan
输出:
My name is ZhangSan
常用的字符串处理函数
若要使用C语言标准库中的字符串处理函数,需要 #include <string.h>
strlen
:用于计算指定字符串的长度。
例:
char str[] = "esta";
printf("strlen(str):%d\n", strlen(str));
输出:
4
strcpy
:将一个字符串从一个字符数组拷贝到另一个字符数组里,包含最后的结束符 ‘\0’。
注意:为了避免溢出,必须确保用于存放的数组长度足以容纳待拷贝的字符串 (长度需要包含结束符 ‘\0’)。
例:
char s0[100] = "";
char s1[100] = "How are you?";
strcpy(s0, s1); // 将 s1 中的内容拷贝至 s0
printf("%s", s0);
输出:
How are you?
strcat
:将一个字符连接到目标字符串后边,在此过程将覆盖第一个参数的结束符 '\0'
,被覆盖的这个 \0
决定了要从目标字符串开始追加内容的位置。
例:
char s0[100] = "How old";
char s1[100] = " are you?";
strcat(s0, s1);
puts(s0);
输出:
How old are you?
strcmp
:根据ASCII码比较两个字符串的大小。
从第一个字符开始,依次比较每个字符的 ASCII 码大小,直到发现两个字符不相等或结束时('\0'
)为止。
例:
char s1[100] = "abcdefg";
char s2[100] = "abcdefgh";
char s3[100] = "this is a string"; // i 的 ASCII 码为 105
char s4[100] = "this Is a string"; // I 的 ASCII 码为 73int result = strcmp(s1, s2);if (result < 0)puts("s1 小于 s2");
else if (result == 0)puts("s1 等于 s2");
elseputs("s1 大于 s2");result = strcmp(s3, s4);if (result < 0)puts("s3 小于 s4");
else if (result == 0)puts("s3 等于 s4");
elseputs("s3 大于 s4");
输出:
s1 小于 s2
s3 大于 s4
相关文章:

2023年信息科学与工程学院学生科协第二次软件培训
2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题:练习题: 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…...

渗透测试tomcat错误信息泄露解决办法
解决方法: 1、使用tomcat8.5.16,会重定向非法url到登录url 2、配置server.xml,加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…...
notes_NLP
RNN > LSTM, GRU model特点RNNLSTMinputforgetputput;GRUresetupdate;参数比LSTM少,计算效率更高; 循环神经网络(RNN/LSTM/GRU) 人人都能看懂的GRU transformer > self-attention 根据Query和Key计…...

内存分段、分页
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 前言 每个进程都有一套自己的虚拟地址,尽管进程可能有相同的虚拟地址,…...

Python-pptx教程之一从零开始生成PPT文件
简介 python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。 典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化,…...

k8s 使用ingress-nginx访问集群内部应用
k8s搭建和部署应用完成后,可以通过NodePort,Loadbalancer,Ingress方式将应用端口暴露到集群外部,提供外部访问。 缺点: NodePort占用端口,大量暴露端口非常不安全,并且有端口数量限制【不推荐】…...
企业数据泄露怎么办?
随着数字化时代的到来,威胁企业数据安全的因素越来越多。一旦机密数据泄露,不仅会对企业造成巨大的经济损失,还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时,企业该怎样应对? 1.确认数据泄露 确认是…...

GoLong的学习之路(一)语法之变量与常量
目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota(特殊)(需要重点记忆) GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…...

Go-Python-Java-C-LeetCode高分解法-第十一周合集
前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 我搜集到了50道精选题,适合速成概览大部分常用算法 突…...
封装axios的两种方式
作为前端工程师,经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性,有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…...
【自然语言处理】NLTK库的概念和作用
文章目录 一、NLTK库介绍二、NLTK库的使用2.1 初级使用2.2 中级使用 参考资料 一、NLTK库介绍 Natural Language Toolkit (NLTK)是一个广泛使用的Python自然语言处理工具库,由Steven Bird、Edward Loper和Ewan Klein于2001年发起开发。NLTK的目的是为自然语言处理&…...
Python爬虫如何解决提交参数js加密
注意!!!! 仅做知识储备莫拿去违法乱纪,有问题指出来,纯做笔记记录 由于¥%…………&&%#%** 所以!#¥……&*……* 啥也不说直接上代码 import execjs js_ji…...

云数据库及RDS数据库介绍
1.云数据库概念 云数据库是指被优化或部署到一个虚拟计算环境中的数据库,具有按需付费、按需扩展、高可用性以及存储整合等能力。 2.云数据库特性 云数据库的特性有:实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审…...

c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))
上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客 各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerow…...

使用 Requests 库和 PHP 的下载
以下是一个使用 Requests 库和 PHP 的下载器程序,用于从 www.people.com.cn 下载音频。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 import requests from bs4 import BeautifulSoup import pafy import timedef get_proxy():url "https://www.…...

ConcurrentHashMap底层具体实现知道吗?实现原理是什么
从这三个方面来回答: ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始…...
Go语言“Go语言:掌握未来编程的利器“
Go语音的发展史可以追溯到2009年,当时谷歌公司推出了一款名为“Google Assistant”的智能助手,它使用自然语言处理技术来与用户进行交互。随后,Go语音逐渐发展成为一种广泛使用的语音技术,其发展历程如下: 起步阶段&a…...

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”
在使用达梦数据库管理工具时,我们测试过程中时常需要更新表数据,有时为了便捷,会直接使用管理工具修改表数据的值,但偶尔会遇到“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”的报…...

TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)
import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50#数据所在文件夹 base_dir ./data/cats_and_dogs train_dir os…...

Unity开发过程中的一些小知识点
1、如何查询挂载了指定脚本的游戏物体 可以直接在Hierarchy面板上,搜索想要找的脚本名 2、如何将Unity生成的多个相同游戏物体获得序号 可以使用Unity的API Transform.GetSiblingIndex() 实现。 Transform.GetSiblingIndex()gameobject.idTransform.GetSiblingI…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...