谭浩强 第六章利用数组处理批量数据

目录

数组是C语言中重要的概念,能简便的创建大量变量。作者通过学习谭浩强的书籍,总结出数组相关知识点与大家交流;


1.一维数组

在介绍一维数组之前,先来了解下什么是数组。数组,英文名为array,简写为arr(一般在C语言中用arr来指代数组)可以理解为数学中的集合。是具有相同特征元素的集合。比如,一群打篮球的人,你就可以创建一个数组,数组的元素就是打篮球的人的名字。

  • 一维数组的定义

 定义方式:类型    int float double char .......

                   数组名   arr1,arr2,......

                   [常量表达式]   只能为常量不能为变量

int arr[10];定义了10个整型变量,将其存储到arr这个数组中。(相比于一个一个创建,效率提升)

常见错误举例:

//#define _CRT_SECURE_NO_WARNINGS 1
//常见错误
//1.[]中存入变量
//int n;
//scanf("%d", n);
//int arr[n];//[]中只能为常量
//若提前调用函数,则n会根据函数的值来
//void func(int n)
//{
//	int arr[2 * n];//在每次调用func函数时,都会得到不同的数组长度,成这样的数组为可变长数组,但在执行函数后n不变。
//
//}
  • 一维数组的初始化

初始化就是给数组赋值 ,初始化的方式多样,下面介绍常见初始化方式;

1.给所有元素赋值

int arr1[5]={12345};5个元素全部初始化

2.部分元素赋值

若部分元素赋值,则其余部分默认为0(整形数组),若为字符型数组,则默认为\0;若为指针型数组,默认为NULL,即空指针;

int arr2[5]= {1,2,3};则其余两个元素默认为0;

3.若数据个数确定,则可以不用添加长度(常用于字符型数组)

int arr3[]= {1,2,3,4,5};    char ch [] = {"i love c"};char ch [] = "i love c";

  • 一维数组的引用

引用,是通过下标(subscript)完成;C语言中,默认第一个元素的下标为0;即,若一个数组的长度为n,则其下标的最大值为n-1;

注意:引用时下标不要超过最大值,否则有溢出危险

    int arr[5] = { 1,2,3,4,5 };//定义了一个长度为5的数组
    printf("%d\n", arr[0]);//分别打印出数组中的元素
    printf("%d\n", arr[1]);
    printf("%d\n", arr[2]);
    printf("%d\n", arr[3]);
    printf("%d\n", arr[4]);
    printf("%d\n", arr[5]);//这是个错误的代码,数组长度为5,则下标最大值为4;

一维数组程序举

#include <stdio.h>//输出斐波那契数列前25个数字(要求每行输出5个)
int main()
{
	int i;
	int arr[20];//定义一个长度为20的数组,用于存放20个数字;
	arr[0] = 1;
	arr[1] = 1;
	for (i = 2; i < 20; i++)
	{
		arr[i] = arr[i - 1] + arr[i - 2];//根据数列性质,利用for循环实现将前20个数字存储到数组中
	}
	for (i = 0; i < 20; i++)
	{
		if (i % 5 == 0)//实现5个数一换行
			printf("\n");
		printf("%10d", arr[i]);
	}
   return 0;
}

冒泡排序法 (核心:for循环的嵌套)

  1.  
    #define _CRT_SECURE_NO_WARNINGS 1
    //练习冒泡排序法(输入五个数字,实现升序排列)
    //冒泡排序法就是两两比较,将较大的数字通过比较移动到后面,实现升序或降序处理
    #include<stdio.h>
    int main()
    {
    	int i,j,t;
    	int arr[5];
    	printf("请输入五个数字");
    	for (i = 0; i<5; i++)
    	{
    		scanf("%d", &arr[i]);//将5个数字存储到数组中
        }
    	printf("\n");
    	for (j = 0; j < 4; j++)//冒泡排序法的核心:for循环的嵌套;//一共5个数字,第一趟比较需要4次,第二趟比较需要3次,以此类推;
    	{
    		for (i = 0; i<4-j; i++)
    		{
    			if(arr[i]>arr[i+1])//接下来进行比较
    			{
    				t = arr[i + 1]; arr[i + 1] = arr[i]; arr[i] = t;//交换前后两个数字顺序
    			}
    		}
    	}
    	printf("升序处理的数字为:\n");
    	for (i = 0; i < 5; i++)
    	{
    		printf("%d  ", arr[i]);
    	}
    
    	return 0;
    }
    

2.二维数组

二维数组通常称为矩阵(matrix),写成row(行)和column(列)的形式。

  • 二维数组的定义:

类型 数组名称 [常量表达式] [常量表达式] 

                        行(row)      列(column)

float arr [3][4];相当于创建了一个3*4的矩阵int arr[10][10];

  • 二维数组的初始化

1.各个元素都赋值 

#include <stdio.h>
int main()
{
	int arr[2][2] = { {1,2},{3,4} };//全体元素都赋值
	int i, j;
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++)
		{
			if (j% 2 == 0)
				printf("\n");
			printf("%5d", arr[i][j]);
		}
	}
    return 0;
}

2.部分赋值

int arr [3][4]={{1,2},{3,4}}//其余元素为0;

3.在赋值时行数可不做要求,系统会根据列数自动分配;

int arr[][3]={1,2,3,4,5,6};很明显是两行三列(尽量不要这么写,不是好的代码风格)

3.二维数组的引用

同一维数组,注意不要超过下标的最大值即可;

4.二维数组程序练习

//转置数组的练习
int main()
{
	int arr1 [2] [3] = { {1,2,3},{4,5,6} };
	int arr2[3][2];
	int i, j;
	printf("arr1:\n");
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 3; j++)
		{
			if (j % 3 == 0)
				printf("\n");
			printf("%7d", arr1[i][j]);
			arr2[j][i] = arr1[i][j];

		}

	}
	printf("\n");
	printf("arr2(转置后):\n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 2; j++)
		{
			if (j % 2 == 0)
				printf("\n");
			printf("%7d", arr2[i][j]);
		}
	}



	return 0;
}
//利用擂台算法来找出数组中最大值,并给出其row,column;

int main()
{
	int arr[4][5] = { {12,23,31,26,11},{10,11,56,67,79} ,{64,65,98,90,35 },{10,20,30,40,50} };
	int i, j,row,column;
	int max;
	max = arr[0][0];//定义一个最大值,并使数组第一个元素为擂主
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 5; j++)
		{
			if (arr[i][j] > max)
			{
				max = arr[i][j];
				row = i;
				column = j;
			}
		}
	}
	printf("max=%d\nrow=%d\ncolumn=%d\n" ,max,row,column);


	return 0;
}

3.字符数组 

字符数组,即用来存放字符的的数组。要注意,C语言中并没有字符串类型,字符串类型是以字符数组的形式出现。

1.字符数组的定义                                                                                                                                 类似于数值型数组定义方式,类型   数组名称  [常量表达式]      char ch[];  char[][];二维数组                             注意:我们知道,字符型数据的存储是通过ascii值存放的,所以字符型数据可以看作整形数据的一部分,即一下定义方式也合法;

int ch [10];
ch[0]=1;//但是这种定义方式占用空间,因为int类型占4个字节,char类型占一个字节

2.字符数组的初始化 

//对每个元素都赋值
char ch [4]={'l','o','v','e'};
//若字符长度确定,可以不指明长度.更加方便便捷
char ch []={'l','o','v','e'};
//若初始值小于指定长度,则系统自动补充\0;即空操作符;
char ch[5]={'l','o','v','e'};
char ch[3][3]={{' ','*',' '},{'*',' ','*'},{' ','*',' '}}
//注意单引号之内不能什么也没有,你可以添加空格
//也可以一次性输入,用''''括起来
char ch ={"i love you"};

3.字符数组的引用

方法和数值型数组相同,通过下标来引用;

4.字符串的结束标志

字符串的结束标志为\0,在ascii码值中对应空操作符;

printf("love\0you");
//字符串的结束标志为\0,这个程序的只会输出love;
//一般情况下,系统会自动在字符串末尾添加\0,作为结束标志;

    5.字符数组的输入与输出

1.逐个字符输出,char ch [4]={'h','e','h','e'};printf("%c",ch[i]);

若想从e输出,则:printf("%s",&a[1]);

2.以字符串输出   char ch ="hehe";printf("%s",ch);注意:输出字符串时类型为string,即%s;同时,输出时要用数组名,因为你要一下子输出所有元素,而不是单个元素输出;逻辑为,先找到数组ch的起始地址,逐个字符输出,直到遇到\0;

3.字符串的输入scanf("%s",ch);注意:这个地方不用&,因为数组一旦创建就有一个起始地址,自动存到内存中了;

补充:

//用for循环实现读取字符串结束标志
for(i=0;arr[i]!=\0;i++);
//实现从字符串中提取数字
if('0'<=arr[i] && '9'>=arr[i]);

4.字符串的处理函数

//以下函数在引用时要添加#include <string.h>


//1.puts函数  字符串输出函数    
puts(str);//注意puts输出的一定是以\0结尾的字符串;若不是,令arr[i]='\0'
//注意和putchar函数的区别,putchar只能输出单个字符;

//2.fgets函数  字符串输入函数
fgets(str,sizeof(str),stdin);输入时不会读取\0;
//函数对str作用后会得到他的初始地址;

//3.strlen函数  字符串长度计算函数
strlen(str);//他计算的是实际长度,且不包括\0;
char arr [10]={"i am you"}
strlen(arr)=6;

//4.strcmp函数  字符串比较函数
strcmp(str1,str2);
//strcmp(str1,str2)>0;str1在str2后面;
//strcmp(str1,str2)<0;str1在str2前面;
//strcmp(str1,str2)=0;str1和str2完全相同;
//后面的单词更大,且小写比大写大;

//5.strcat函数   字符串连接函数
strcat(str1,str2);//把str2连接到str1之后;
//一定要注意str1的长度是否足够大

//6.strcpy函数   字符串复制函数   strncpy函数  可以限制长度复制字符串
strcpy(str1,str2);将str2的字符串赋值给str1;
strcpy(str1,"china");

strncpy(str1,str2,2);//将str2的字符串前两个字符赋给str1;
strncpy(str1,"china",2);//将ch两个字符赋给str1;

//7.strupr函数   字符串变大写函数        strlwr函数   字符串变小写函数;
strupr(str);
strupr("china")=CHINA;



5.总结

数组概念是C语言学习中重要的一个概念,他解释了在C语言中如何表示字符串,即通过字符数组;一维数组,二维数组也很重要,他们为我们提供了一个简单的创建大量变量的方法,要充分理解数组的作用,即定义一个数组后,会自动产生一个初始地址;要理解二维数组的概念,可以用线性代数中的矩阵概念来理解,要认识到二维数组其实可以看为特殊的一维数组(和分块矩阵的概念类似);字符数组也很重要,告诉我们如何实现字符串的输出与输入;在数组中,我们还学习了两个重要的排序方法,一是冒泡排序法(核心为for循环的嵌套),二是擂台法,希望大家能够勤加练习,谢谢观看!

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值