C语言数组的那些子事儿

新手上路,不足还请指教,欢迎交流

1、数组的赋值

第一种,用赋值语句对数组元素逐个赋值,小白才会写的东东,很麻烦

在这里插入图片描述
以上第一个for循环是对数组元素逐个赋值,第二个for循环是从最后一个元素逐个输出。

第二种,初始化赋值

在这里插入图片描述
以上是在初始化的时候就已经定义好了元素的值,因此只需要一个for循环输出即可。

加深理解:数组初始化与未初始化的比较

在这里插入图片描述
a是已经初始化的数组,虽然只写了前三位,但后面会默认为0。b未初始化,虽然也会默认其数组里面的元素值为0,但在运行的时候极有可能出错,如图出现后三位乱码的情况。

第三种,动态赋值

用户输入十个数,显示最大的那一个
用scanf接收你赋值给数组元素的值

在这里插入图片描述

2、多维数组的赋值

在这里插入图片描述
在大括号里再用的大括号则代表了每行的元素值,如上图,{1},{2},{3}即代表了三行四列的每行第一个元素分别是1,2,3。
在这里插入图片描述
如果只有一个大括号则默认顺序数组元素的值

3、数组理解与应用

在这里插入图片描述

4、字符型数组的获取与输出

在这里插入图片描述
C语言中结构体中,为什么scanf接收char型数据不用&?

int i;
char s[10];
scanf("%d %s", &i, s);

i 的类型是 int,%d 需要一个 int* 的参数,因此需要一个 &
s 的类型是 char*,%s 需要一个 char* 的参数,因此直接写上 s 就可以了。
定义s[10] 为 char数据类型,s[10]是一个数组,s表示数组所在的内存段的头地址。而scanf()函数所需要的地址,其实质就是一段数据所对应的内存段的起始地址,s已经是其数据所在的内存段的头地址,自然不需要“&”取值。

5、筛法

“ 输出15以内大于1的所有质数 ”的方法—筛法,筛法的思想是“标记出所有非质数,输出所有没被标记的数字

对于n以内的筛选来说,如果 n 是合数,C 为 n 的最小正因数,则有


根据基本数论,可以确信只要找到了 c 就可以确定 n 是合数,并将 n 进行标记。
所以声明一个mark数组,用于标记所有质数。首先将1和0对应的位置都标记成了1(标记的值表示“假”),也就是说它们必然不是质数。而对之后所有的待筛的数字都标记为了0(标记的值为“真)。已知2是最小的质数,如代码中for循环所示,要将 2 作为第一个正因数,开始筛法。
在这里插入图片描述
在循环中,if ( mark[c] )确保了当前选的正因数c是一个质数时才去用它进行非质数的标记,在 if 里的一层 for 循环遍举了待排查所有因数是 c 的合数,并将它们都再mark数组中都标记上1了。通过这样的标记,mark数组里面是1的元素的索引都是非质数了。接下来将所有标记是 0 的元素索引都输出出来就能达到的目。

练习

对于一个大于1的整数,如果除了1和它本身,它不再被其它正整数整除,那么它是一个质数
对于给定的一个大于1的正整数N,和一个大于1的正整数M,N一定大于M,按从小到大的顺序输出所有小于等于
N且大于等于M的质数

输入格式

每次程序运行时,程序仅需输入两个正整数,分别为上述描述中的N和M,两个正整数之间用一个空格分隔

输出格式

按从小到大的顺序输出所有小于等于N且大于等于M的质数,一个数单独占一行

样例输入

30 5

样例输出

5
7
11
13
17
19
23
29
在这里插入图片描述

memset() 函数

memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”的意思。该函数的原型为:

# include <string.h>
void *memset(void *s, int c, unsigned long n);

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

上题意味:将mark数组里所有的元素都用0替代

memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。

memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。如果用 memset 的话反而显得麻烦。

当然,数组也可以直接进行初始化,但 memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。

这时有人会问:“字符串数组不是最好用’\0’进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为’\0’吗?”

可以的。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 ‘\0’ 和 0 是等价的,因为字符 ‘\0’ 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 ‘\0’ 的作用,所以通常我们就写“0”。

memset 函数的第三个参数 n 的值一般用 sizeof() 获取,这样比较专业。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof§,这是新手经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof§ 的值都是 4。

6、折半查找

给定N个整数和K个待查找的整数M1,M2,…,MK。如果待查找的整数在给定的N个整数中,输出待查找的整数是数组中第几个元素,如果待查找的整数不在给定的N个整数中,则输出0。

输入格式

输入包括三行。第一行输入两个整数N(1<=N<=1000000)、K(1<=K<=1000000),分别表示给定的整数总个数和待查找的数的个数。第二行自小到大输入N个整数Numberi(1< =Numberi <=1000000,其中1<= i <=N), 每两个整数之间用一个空格隔开。第三行输入K个整数 Numberj(1≤ Numberj≤1000000,其中1 ≤ j ≤ K),每两个整数之间用一个空格隔开。

输出格式

输出为一行,包括K个部分,每个部分为题目描述中待查找的元素索引或0,K个部分之间用一个空格分隔。输出行尾不含多余空格。

样例输入3

6 4
1 2 4 6 7 8
9 1 5 2

样例输出

0 1 0 2

注释:EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。

在这里插入图片描述

7、矩阵翻转输出

在这里插入图片描述

输入格式

第一行输入2个整数,分别对应题目描述中的m和n(1≤m,n≤100),两个整数之间用个空格分隔。接下来输入m行,每行包含n个数,每两个数之间用一个空格分隔。接下来输入一行,输入一个路数为1或0。当输入为1时,对矩阵进行水平翻
转,当输入为0时对矩阵进行竖直翻转

输出格式

输出包括m行,每行包含n个整数,按要求输出翻转后的矩阵,每行任意两个竖数之间用一个空格分隔,每行最后一个数后面没有空格

样例输入1

2 3
1 2 3
3 4 6
1

样例输出1

3 2 1
6 4 3

样例输入2

3 2
1 2
3 4
5 6
0

样例输出2

5 6
3 4
1 2
在这里插入图片描述

8、矩阵旋转输出

对于一个给定的3×3矩阵,将其顺时针旋转90度后输出

输入格式

需要输入三行,第 i 行输入三个整数,之间用一个空格分开

输出格式

输出为三行,每行包括三个数要求的一致(从直观上看,输出结果应为输入的矩阵旋转90度后的结果),每个数用一个空格分开,最后一个教后面没有空格
在这里插入图片描述
在这里插入图片描述

9、爬楼梯问题

要么上 2 个台阶,要么上 3 个台阶,爬 NN阶台阶有多少种不同的方式?(2≤N≤50)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值