C语言重造一下2022.5.11(数组)

目录

一维数组

定义和引用及初始化

举个栗子

二维数组

定义引用和初始化

举个栗子

字符数组

输入输出

应用:输入一串字符串,统计其中有多少个单词


一维数组

定义和引用及初始化

#include <stdio.h>

#define N 3
int main()
{
	int a = 0,b = 0,c = 0;
	int grp1[N];  //数组的个数只能是常量,也就是说不能直接用int,float类型的变量来定义个数,当然也可以直接写正整数;
	int grp2[3];
	int grp3[3] = {1,2,3};  //数组内可以初始化<=数组个数的数据,数据个数不足数组元素最大个数时,系统自动补0
	int grp4[3] = {1,2};  //等价于grp4 = {1,2,0};
    //grp1,grp2初始化
    grp1[N] = {1,2,3};
    grp2[0] = 1;
    grp2[1] = 2;
    grp2[2] = 3;
	//一维数组的引用
	a = grp4[0];b = grp4[1];c = grp4[2];  //分别引用数组grp4中的第1,2,3个元素
	//同时,数组中的元素存放的地址连续,grp4[0]是数组中的第一个元素,同时,该元素的地址也是该数组的地址
	printf("grp4[0] = %d\n*grp4 = %d\n" , grp4[0] , *grp4);
	printf("grp4[1] = %d\n*(grp4+1) = %d\n" , grp4[1] , *(grp4+1));
	//以上两个输出内容一致
	//新学习的同学特别注意数组的第一个元素是从下标0开始
	return 0;
}

举个栗子

第一个例子是冒泡法排序,我使用了指针做函数参数来进行求解,因为昨天复习了一下指针,所以顺便拿来练练手

冒泡法虽然时间复杂度是O(n^2),但是这玩意挺多地方要用到的,也是容易理解的一个排序方法,所以初学的同学可以多看看课本里引用的例题,课本上好懂一点

#include <stdio.h>

void sort(int* ,int);

void sort(int *p , int num)
{
	//小->大
	int i = 0 ,j = 0, temp = 0;
	for(;i < (num - 1);i++)
	{
		for(j = 0;j < num - 1 - i;j++)
		{
			if(*(p+j+1) < *(p+j))
			{
				temp = *(p+j+1);
				*(p+j+1) = *(p+j);
				*(p+j) = temp;
			}
		}
	}
}

int main()
{
	//冒泡法排序
	int arr[10] ,i;
	printf("Please Enter 10 Numbers:\n");
	for(i = 0;i < 10 ;i++)
	{
		/*scanf("%d",&arr[i]);*/
		scanf("%d",arr+i);
	}
	sort(arr , 10);
	for(i = 0;i < 10;i++)
	{
		printf("%d " , arr[i]);
	}
	return 0;
}

这是运行结果 

 

二维数组

定义引用和初始化

#include <stdio.h>

int main()
{
	//二维数组
	int arr1[3][4];  //可以认为这是定义了一个3*4的矩阵,也可以看成是由3个数组大小为4的数组构成的一个新的数组
	//同一维数组,二维数组的元素内存也是连续的
	//arr1[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 这样定义是有问题的,因为此时编译器认为你要做的是给第四行第五列这个元素赋值,然而这个范围已经越界(3*4)了
	int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	//当要一次性初始化全部元素时,可以写成 int arr2[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	return 0;
}

举个栗子

 将二维数组以矩阵形式打印(直观,打印图形的话也美观点)

#include <stdio.h>

int main()
{
	int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}};
	int i = 0,j = 0;
	for(i = 0;i < 3;i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d\t",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

打擂台算法求最大值

数组里的哪个数最大就是大Boss

#include <stdio.h>

int main()
{
	int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}};
	int h = 0,l = 0, max = 0;
	int i = 0,j = 0;
	max = arr[0][0];
	for(i = 0;i < 3;i++)
	{
		for(j = 0;j < 4;j++)
		{
			if(arr[i][j] > max)
			{
				max = arr[i][j];
				h = i;
				l = j;
			}
		}
	}
	printf("max = %d\nhang = %d\nlie = %d" ,max,h+1,l+1);
	return 0;
}

字符数组

C语言里面没有字符串类型的数据,所以字符串一般存放在字符数组中 

//因为这个例子比较难敲,我就不敲定义引用和初始化了,书上讲的很详细

要注意的点就是'\0'

当定义的字符数用双引号定义时,系统自动在最后一个位置加字符串结束标志'\0'

比如char chr1[] = {"I am handsome!"};共有14个字符,实际上这个数组的大小为15

相比较char chr2 = {'I',' ','a','m',' ','h','a','n','d','s','o','m','e','!'};chr2数组大小为14

 

输入输出

 scanf("%s",str);  //注意这里是数组名,不用取址符号&(其实str本身就是一个地址,数组第一个元素的地址)

//吐槽一下当时学数组时老师讲到指针我以为是钟表上面转的指针(好sb啊当时)

printf("%s",str);  //注意·这里也是使用的数组名,而不是引用的单个数组元素

//printf() 输出直到遇见'\0结束'

 引用string.h头文件输入输出字符数组以及字符串处理

puts(str);

gets(str);

strcat(str1,str2);  //将两个字符串连接

strlen(str);  //计算字符串个数,不包含'\0'

strcmp(str1,str2);  //判断两个字符串是否相等,相等的话返回值为0

//如果不相等,则根据第一个不同的字符的ASCII码值大小选择输出是正数或是负数(str1 - str2)

应用:输入一串字符串,统计其中有多少个单词

这个题目不能想当然,我没有加入word这个变量,而是直接利用空格来判断字符,其实当连续输入两个空格时,并没有两个单词,所以需要word这个变量来判断是否有无单词

#include <stdio.h>

int main()
{
	char str[50] = {0};
	int i , num = 0 , word = 0;
	printf("Please Enter A string:");
	gets(str);
	for(i = 0;str[i] != '\0';i++)
	{
		if(str[i] == ' ')
			word = 0;
		else if(word == 0)
		{
				num++;
				word  = 1;
		}
	}
	printf("%d words\n" , num);
	return 0;
}

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值