当前位置: 首页 > news >正文

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]
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 码为 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年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题&#xff1a;练习题&#xff1a; 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…...

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…...

notes_NLP

RNN > LSTM, GRU model特点RNNLSTMinputforgetputput&#xff1b;GRUresetupdate&#xff1b;参数比LSTM少&#xff0c;计算效率更高&#xff1b; 循环神经网络&#xff08;RNN/LSTM/GRU&#xff09; 人人都能看懂的GRU transformer > self-attention 根据Query和Key计…...

内存分段、分页

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

Python-pptx教程之一从零开始生成PPT文件

简介 python-pptx是一个用于创建、读取和更新PowerPoint&#xff08;.pptx&#xff09;文件的python库。 典型的用途是根据动态内容&#xff08;如数据库查询、分析数据等&#xff09;&#xff0c;将这些内容自动化生成PowerPoint演示文稿&#xff0c;将数据可视化&#xff0c…...

k8s 使用ingress-nginx访问集群内部应用

k8s搭建和部署应用完成后&#xff0c;可以通过NodePort&#xff0c;Loadbalancer&#xff0c;Ingress方式将应用端口暴露到集群外部&#xff0c;提供外部访问。 缺点&#xff1a; NodePort占用端口&#xff0c;大量暴露端口非常不安全&#xff0c;并且有端口数量限制【不推荐】…...

企业数据泄露怎么办?

随着数字化时代的到来&#xff0c;威胁企业数据安全的因素越来越多。一旦机密数据泄露&#xff0c;不仅会对企业造成巨大的经济损失&#xff0c;还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时&#xff0c;企业该怎样应对&#xff1f; 1.确认数据泄露 确认是…...

GoLong的学习之路(一)语法之变量与常量

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

Go-Python-Java-C-LeetCode高分解法-第十一周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 我搜集到了50道精选题&#xff0c;适合速成概览大部分常用算法 突…...

封装axios的两种方式

作为前端工程师&#xff0c;经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性&#xff0c;有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…...

【自然语言处理】NLTK库的概念和作用

文章目录 一、NLTK库介绍二、NLTK库的使用2.1 初级使用2.2 中级使用 参考资料 一、NLTK库介绍 Natural Language Toolkit (NLTK)是一个广泛使用的Python自然语言处理工具库&#xff0c;由Steven Bird、Edward Loper和Ewan Klein于2001年发起开发。NLTK的目的是为自然语言处理&…...

Python爬虫如何解决提交参数js加密

注意&#xff01;&#xff01;&#xff01;&#xff01; 仅做知识储备莫拿去违法乱纪&#xff0c;有问题指出来&#xff0c;纯做笔记记录 由于&#xffe5;%…………&&%#%** 所以&#xff01;#&#xffe5;……&*……* 啥也不说直接上代码 import execjs js_ji…...

云数据库及RDS数据库介绍

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

c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))

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

使用 Requests 库和 PHP 的下载

以下是一个使用 Requests 库和 PHP 的下载器程序&#xff0c;用于从 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底层具体实现知道吗?实现原理是什么

从这三个方面来回答&#xff1a; ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构&#xff0c;它是由数组、单向链表、红黑树组成. 当我们初始…...

Go语言“Go语言:掌握未来编程的利器“

Go语音的发展史可以追溯到2009年&#xff0c;当时谷歌公司推出了一款名为“Google Assistant”的智能助手&#xff0c;它使用自然语言处理技术来与用户进行交互。随后&#xff0c;Go语音逐渐发展成为一种广泛使用的语音技术&#xff0c;其发展历程如下&#xff1a; 起步阶段&a…...

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

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

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面板上&#xff0c;搜索想要找的脚本名 2、如何将Unity生成的多个相同游戏物体获得序号 可以使用Unity的API Transform.GetSiblingIndex() 实现。 Transform.GetSiblingIndex()gameobject.idTransform.GetSiblingI…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...