传奇广告查询网站,最佳搜索引擎磁力狗,企业营销方案案例范文,去哪儿旅行app下载安装2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题#xff1a;练习题#xff1a; 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…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]9135792468
可以把数组看作是一行连续的多个存储单元。
用更正式的说法是数组是同类型数据元素的有序序列。
定义格式
通常我们是这样定义的
数组中元素的类型 数组变量名[元素数量]
例如
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 (i0;i10;i) { scanf(%d, a[i]); sum a[i]; } for (i0;i10;i) { printf(%d\n, a[i]); } printf(%d, sum);
}可以看到如果要获取数组的所有位置进行输入或输出就必须要通过循环来“遍历”数组即一个一个位置访问.
大家一定要注意这里for的开始和终止条件到底循环了几次每次i的值是多少
显然在这道题目中for是从0开始循环到9结束一共循环了10次。
同样这道题不使用数组也可以完成具体的写法在直播中有提到大家可以通过观看录播进行学习。
练习题
从键盘中读入n(0n10)计算接下来输入n个整数输出它们的平均数并输出大于平均数的所有数。
这道题在直播中也详细的讲述过我们也不再赘述
数组元素数量
回顾一下如何理解下面这句话
注意元素数量必须是一个正整数且在C99标准以前元素数量必须是个确定的数。
现在我们想先输入一个n再根据n的值创建具有n个位置的数组a[n]就有
#include stdio.h
int main()
{int n;scanf(%d, n);int a[n]; //!!!for (int i0;in;i){scanf(%d, a[i]);} for (int i0;in;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二维数组
有的时候我们需要存储更多的信息比如一个班级学生的语数外三门的分数这个时候就需要用到二维数组矩阵。
姓名语文数学英语X909992Y595959
定义格式
二维数组有着一维数组类似的定义模式
类型 数组变量名[维数1][维数2]
举个例子
int x[5][9];二维数组的访问
二维数组的内部大概是这样的
01234567801234
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 score0;for(i0;i3;i){for(j0;j4;j){scanf(%d, table[i][j]);}}for(j0;j4;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.hint main() {printf(%llu, sizeof(a));
}输出
4ASCII 码表 (0~127) 例
#include stdio.hint 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.hint 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.hint main()
{int a 0;printf(%llu, a); // 将 a 在内存中的地址以 64 位无符号十进制整数的形式输出
}数组的地址
分配给数组储存空间通常是连续的。所以如果我们能提供第一个元素的地址那么我们就能够找到后续的元素。
数组有一个特殊的性质在表达式中以及将数组作为函数参数进行传递时数组会隐式转换成一个指针常量其值为数组的首地址且和数组第一个元素的地址相等。关于指针类型的相关知识我们将在第三次软件培训给大家详细讲解。
字符串
C语言是没有字符串类型的那要怎么存储字符串呢我们知道数组所占内存空间是连续的那就很容易想到用字符数组存储字符串。
字符串字面量
字符串字面量用双引号括起来的若干个字符其类型为字符数组不可以被修改类似于整型字面量 1,2,3所有字符串字面量结尾自带 \0例如 esta其类型为 char [5]。
前后相接的若干个字符串字面量就等价于只保留第一个和最后一个双引号。例如 HHUCESTA1234就等价于 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 码为 0C语言标准库中的所有字符串处理函数都是通过 \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));输出
4strcpy将一个字符串从一个字符数组拷贝到另一个字符数组里包含最后的结束符 ‘\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