2023年信息科学与工程学院学生科协第二次软件培训

news2025/2/26 23:13:25

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 (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

二维数组

有的时候我们需要存储更多的信息,比如一个班级学生的语数外三门的分数,这个时候就需要用到二维数组(矩阵)。

姓名语文数学英语
X909992
Y595959

定义格式

二维数组有着一维数组类似的定义模式:

类型  数组变量名[维数1][维数2]
举个例子:
int x[5][9];

二维数组的访问

二维数组的内部大概是这样的:

012345678
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 码为 73

int result = strcmp(s1, s2);

if (result < 0)
    puts("s1 小于 s2");
else if (result == 0)
    puts("s1 等于 s2");
else
    puts("s1 大于 s2");

result = strcmp(s3, s4);

if (result < 0)
    puts("s3 小于 s4");
else if (result == 0)
    puts("s3 等于 s4");
else
    puts("s3 大于 s4");

输出:

s1 小于 s2
s3 大于 s4

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

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

相关文章

实现多余内容变成省略号

实现效果 代码 <p class"item-content">{{ item.content }}</p>样式 .item-content {white-space: nowrap;/* 禁止换行 */overflow: hidden;/* 隐藏溢出部分 */text-overflow: ellipsis;/* 使用省略号表示溢出部分 */ }

21.4 Python 使用GeoIP2地图定位

GeoIP2是一种IP地址定位库&#xff0c;它允许开发人员根据IP地址查找有关位置和地理位置的信息。它使用MaxMind公司的IP地址数据库&#xff0c;并提供一个方便的Python API。GeoIP2可以用于许多不同的应用程序&#xff0c;例如网站分析、广告定位和身份验证。GeoIP2提供了许多不…

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”

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

天津五家受欢迎的python培训机构 python凭什么这么火?

在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;非常容易上手&#xff0c;许多想学编程的小伙伴都从python入手&#xff0c;今天我们就来聊聊关于大家非常困惑的一些点&#xff0c;下面就一起来看看吧。 python火的原因 …

Java的反射(reflection)机制的简单使用

目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义 Java的反射机制是运行时的状态&#xff0c;可以通过反射来调用类里面的属性和方法&#xff0c;私有的属性和方法也可以调用&#xff0c;也可以对它们进行修改。 二…

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…

升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败

升级 IDE Xcode 15 后本地模拟器 Simulator 全被清空,反复重新尝试 Get 下载频频因网络异常断开而导致失败 ... 注:通过 Get 方式下载一定要保证当前网络环境足够平稳,网络环境不好的情况下该方法几乎成不了 解决办法 Get 方式行不通可以尝试通过 官网 途径先下载 模拟器安装包…

电脑待办事项提醒工具用哪个?

在一个繁忙的办公楼里&#xff0c;人们匆匆忙忙地穿梭着&#xff0c;电脑屏幕前的每个人都有着繁重的工作任务。为了应对这些任务&#xff0c;有人喜欢在纸上列出清单&#xff0c;有人则更愿意在电脑上记录&#xff0c;日常记录待办事项建议大家可以使用提醒工具敬业签。 敬业…

ubuntu 22.04 截图工具 shutter

sudo apt install shutter 快捷键F1 注意不支持wayland&#xff0c;登录时不要选择ubuntu wayland

Java并发编程第10讲——CAS相关知识点详解

前面介绍锁的时候顺便也提到了CAS&#xff0c;但作为JUC的“基石”和面试中的高频考点&#xff0c;还是不够。所以&#xff0c;本篇文章将从CAS的概念入手&#xff0c;逐步深入介绍12个Atomic原子操作类、CAS的实现原理&#xff08;源码解析&#xff09;、Unsafe类、CAS存在的问…

Oracle通过透明网关查询SQL Server 报错ORA-00904

Oracle通过透明网关查询SQL Server 报错ORA-00904 问题描述&#xff1a; 只有全表扫描SELECT * 时SQL语句可以正常执行 添加WHERE条件或指定列名查询&#xff0c;查询语句就报错 问题原因&#xff1a; 字段大小写和SQLSERVER中定义的不一致导致查询异常 解决办法&#xff1a; 给…

JVM——堆内存调优(Jprofiler使用)Jprofile下载和安装很容易,故没有记录,如有需要,在评论区留言)

堆内存调优 当遇到OOM时&#xff0c;可以进行调参 1、尝试扩大堆内存看结果 2、分析内存&#xff0c;看哪个地方出现了问题&#xff08;专业工具&#xff09; 调整初始分配内存为1024M&#xff0c;调整最大分配内存为1024M&#xff0c;打印GC细节&#xff08;如何添加JVM操…

「快学Docker」Docker镜像和容器的创建与管理

「快学Docker」Docker镜像和容器的创建与管理 引言什么是Docker镜像&#xff1f;镜像获取和使用镜像获取镜像使用 什么是Docker容器&#xff1f;Docker容器与主机之间的交互基于Dockerfile创建镜像基于镜像创建容器总结 引言 Docker镜像和容器是当今云计算领域中最受欢迎的技术…

【Buildroot】记一次编译出错gzip: popt-1.16.tar.gz: not in gzip format--更改br里面的默认下载地址

文章目录 我在一次正常的编译过程中遇到了&#xff0c;如下的错误&#xff1a; rootubuntu:/home/liefyuan/Linux/rk356x_linux/buildroot# make -j16 make: Circular /home/liefyuan/Linux/rk356x_linux/buildroot/output/build/iproute2-4.14.1/.stamp_configured <- bus…

Trie树/字典树的原理及实现[C/C++]

文章目录 前言引例&#xff1a;Google经典面试题字典树的原理与实现定义字典树的结构字典树的操作字符串插入字符串查询 字典树的实现字符集数组法节点类结构设计节点的接口字符映射节点类的代码实现 字典树类结构设计字典树接口实现 字符集映射法&#xff08;适用性广&#xf…

idea使用Alibaba Cloud Toolkit实现自动部署

在日常开发过程中&#xff0c;经常会使用到jenkins进行项目部署&#xff0c;但对一些小项目来说&#xff0c;这就过于复杂&#xff0c;就可以使用Alibaba Cloud Toolkit插件配合shell脚本进行项目的远程部署工作。 一、下载Alibaba Cloud Toolkit插件 二、服务器安装nohup 1.…

数据分享 I 地级市人口和土地使用面积基本情况

数据地址&#xff1a; 地级市人口和土地使用面积基本情况https://www.xcitybox.com/datamarketview/#/Productpage?id394 基本信息. 数据名称: 地级市人口和土地使用面积基本情况 数据格式: ShpExcel 数据时间: 2021年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据…

手把手实现简易版vue(二)组件类解析

1、构造器 constructor(propsArgus {}) {const {data () > {},methods {},watch {},computed {}, // 待实现props {}, // 待实现created () > {}, // created钩子函数mounted () > {}, // mounted钩子函数destroyed () > {} // destroyed钩子函数} props…

MySQL云数据库5.5导入到自建MySQL数据库5.7

有一个MySQL云数据库&#xff0c;版本比较老&#xff0c;是5.5. 需要在线下搭建一个测试环境&#xff0c;所以需要将数据还原到一个自建MySQL数据库内。 5.5已经很难找到了&#xff0c;所以安装了一个5.7. 云数据库设置的备份&#xff0c;使用的是全复制文件方法。 还原数据…

电源效率测试标准你知道多少?纳米软件带您了解

电源效率是衡量电源能源利用率和电源质量的重要指标&#xff0c;是电源模块测试的一个重要测试项目。对于电源效率各个国家都有自己的标准&#xff0c;以此来判断能量转换效率&#xff0c;促进提升能源利用率。 什么是电源效率标准? 电源效率标准是衡量电源能量转换率的指标&a…