c语言-数组(2)字符数组

数组(2)

目录

数组(2)

字符数组

1、字符数组是什么?        

5、字符串的常用函数

gets与scanf的区别

(1)strlen 

(2)strcpy

(3)strcat 

(4)strcmp

数组例题


tip:
        数组是什么? -- 是一种数据类型

字符数组

1、字符数组是什么?        

        -- 一维数组         -- 字符型数组
char ch[5]={'h','e','l','l','o'};->>char ch[5]={"hello"}; ->字符串   相当于->char ch[5]="hello";这种写法。
2、字符串 <->字符串数组         -- 字符串的本质就是一个字符数组
3、通过数组的形式,打印字符串

alt text

4、使用字符串的形式,打印字符数组

-- 字符串的打印格式:%s  -- 默认从字符串的首地址开始,输出到\0结束;

-- 数组名默认代表数组的首地址

alt text


--'\0' :-- 字符串结束符,数组长度足够长,系统默认添加\0;
-- 例如:char ch[6]="hello"; 数组有5位,而数组的长度是6,就会默认添加\0。而如果数组长度是5,如果后面没有\0将会侵占其他空间,输出时就会输出别的数组的值,直到找到\0。

alt text

5、字符串的常用函数

注:字符串数组的常用函数只能用于字符数组,其他类型的数组不能用。
tip:函数都可以通过“man 函数”得到
例如:从man中找函数的参数,man getc
--getc        -输入一个字符         --putc         -输出一个字符
--gets         -输入一个字符串s         --保存输入的字符首地址
--puts         -输出一个字符串

alt text


 

alt text

alt text

注:出现警告很正常,因为以后这个函数很可能会被删,不用在项目中即可。


gets与scanf的区别


        gets能接收空格作为字符串的数据显示,scanf中空格的作用是结束当前变量的输入,进入下一个变量的输入,不能接收空格,有的题目中是统计空格个数,就不可以用scanf,只能用gets。


(1)strlen 

-- 函数作用:

                -- 获取字符串实际长度

-- 头文件:       

        #include<string.h>

alt text


(2)strcpy

-- 函数作用:

          -- 复制字符串

-- 函数原型:

        char *strcpy(char *dest,const char *src);

-- 头文件:

        #include<string.h>

-- 函数参数:
        dest:目的字符串首地址

        src:原字符串首地址

alt text


(3)strcat 

-- 函数作用:

                拼接字符串

-- 函数原型:

                char *strcat(char *dest,const char *src);

-- 函数头文件:

                #include<string.h>

-- 函数参数
        dest:目的字符串首地址

        src:原字符串首地址


--注:目的串的长度要能够容纳两个字符串的内容

alt text


(4)strcmp

-- 函数作用: 

                 --比较字符串

-- 函数原型:

                int strcmp(const char *str1,const char *str2);

-- 函数的头文件:

                #include<string.h>

-- 函数的参数:
                str1:字符串1首地址

                str2:字符串2首地址
-- 函数的返回值:

                相等返回0

                不相等返回s1-s2

alt text


数组例题

1、以下为一维整型数组 a 的正确说明是________.
a)int a(10);
b)int n=10,a[n];
c)int n;
int a[SIZE];
int a[n];
d)#define SIZE 10
scanf("%d",&n);
tip:B写到一起不一定哪个先执行,不一定先给n赋值。C在gcc编译器是正确的,但在其他编译器是错的,所以选D
2、从键盘输入 10 个数,计算并输出它们的最大值、最小值和平均值。

int main()
{
	int a[10];
	printf("请输入 10 个数\n");
	for(int i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	int max = a[0];
	int min = a[0];
	int sum = 0;
	for(int i=0;i<10;i++){
		
		if(max<a[i]){
			max = a[i];
		}
		if(min>a[i]){
			min = a[i];
		}
		sum += a[i];
	}
	float ave = sum/10.0;
	printf("它们的最大值为%d,最小值为%d,平均值为%f\n",max,min,ave);
	return 0;
}
 

注:局部变量都要附上初始值,否则会给随机值。
3、有一个 3*4 的矩阵,找出其中值最大的元素,及其行列号。

int main()
{
	int row,list;
	int a[3][4] = {{1,2,3,4},{10,6,7,2},{2,11,4,1}};
	int max =a[0][0];
	for(int i=0;i<3;i++){  
		for(int j=0;j<4;j++){
			if(a[i][j]>max){
				max = a[i][j];
				row = i;
				list =j;
			}
		}
	}
	printf("其中值最大的元素为%d,行号为:%d,列号为:%d\n",max,row+1,list+1);
	return 0;
}

4、求一个 3*3 的整型矩阵对角线元素之和。

int main()
{
	int sum = 0;
	int a[3][3] = {{1,2,3},{1,2,3},{1,2,3}};
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			if((i==j)||(i+j==2)){
				sum+=a[i][j];
			}
		}
	}
	printf("一个 3*3 的整型矩阵对角线元素之和为:%d\n",sum);
	return 0;
}

5、利用数组实现斐波那契数列的前 30 项,并要求格式化对齐, 每行值输出5 个数。(斐波那契数列:1 1 2 3 5 8 13 21……)

int main()
{
	int a[30]={1,1};	//没有被初始化的默认为0
	for(int i=2;i<30;i++){
		a[i]=a[i-2]+a[i-1];
	}
	printf("斐波那契数列的前 30 项为:\n");
	for(int i=0;i<30;i++){
		printf("%d\t",a[i]);
		if((i+1)%5==0){     //一行输出5个数
			printf("\n");
		}
	}
	printf("\n");
	return 0;
}

6、 输入 10 进制数转换为二进制进行输出

int main()
{
	printf("请输入一个10进制数:");
	int n = 0;
	scanf("%d",&n);
	
	int num[32] = {0};
	int i = 0;
	while(n != 0)   // n=10;      0101 0000 
	{
		num[i] = n%2;
		n= n/2;
		i++;
	}
	//打印
	for(int j= i-1;j>=0;j--)
	{
		printf("%d",num[j]);
		if(j % 4 == 0)
		{
			printf(" ");
		}
	}
	printf("\n");	
	return 0;
}

7、将一个 3×3 矩阵转置,(行变列列变行)

int main()
{
	int num[3][3] = {1,2,3,4,5,6,7,8,9};
	printf("转置前:\n");
	for(int i = 0;i<3;i++)
	{
		//打印列
		for(int j = 0;j<3;j++)
		{
			printf("%d ",num[i][j]);
		}
		printf("\n");
	}
	//转置
	for(int i=0;i<3;i++)
	{
		for(int j=i;j<3;j++)
		{
			int temp = num[i][j];
			num[i][j] = num[j][i];
			num[j][i] = temp;
		}
	}
	//打印
	printf("转置后:\n");
	for(int i = 0;i<3;i++)
	{
		//打印列
		for(int j = 0;j<3;j++)
		{
			printf("%d ",num[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	return 0;
}

8、分别给出 3 个学生的 4 门课程的成绩,求其中的最高成绩、各门课程的平 均成绩和总平均成绩。

int main()
{
	//录入数据
	int num[3][4] = {0};
	printf("请输入三个学生4门课成绩:\n");
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			scanf("%d",&num[i][j]);
		}
	}
	//求最高成绩
	int max = num[0][0];
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			if(max < num[i][j])
			{
				max = num[i][j];
			}
		}
	}

	printf("最高成绩是:%d\n",max);
	//求各门课平均分

	float avg_sum = 0;

	for(int j=0;j<4;j++)
	{
		int sum = 0;         // 各门课的总分
		for(int i=0;i<3;i++)
		{
			sum += num[i][j];
		}
		float avg = sum/3.0;
		printf("第%d门课的平均分是:%.2f\n",j+1,avg);
		avg_sum+= avg;      // 计算总平均分作准备
	}

	//求总平均分
	float avg = avg_sum / 4;
	printf("总平均分是:%.2f\n",avg); 
	return 0;
}

9、按以下输出格式打印杨辉三角的前 10 行

int main()
{
	int num[10][10] = {0};
	//1.先把所有的1保存起来
	
	for(int i=0;i<10;i++)
	{
		num[i][0] = 1;
		num[i][i] = 1;
	}

	//2.填充数据  -- 从第2行第1列开始,其后每一个数字 = 上一行的本列+上一行的上一列
	for(int i = 2;i<10;i++)
	{
		for(int j = 1;j< i;j++)
		{
			num[i][j] = num[i-1][j] + num[i-1][j-1];
		}
	}

	//3.打印 
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<=i;j++)
		{
			printf("%d ",num[i][j]);
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值