数组(2)
目录
tip:
数组是什么? -- 是一种数据类型
字符数组
1、字符数组是什么?
-- 一维数组 -- 字符型数组
char ch[5]={'h','e','l','l','o'};->>char ch[5]={"hello"}; ->字符串 相当于->char ch[5]="hello";这种写法。
2、字符串 <->字符串数组 -- 字符串的本质就是一个字符数组
3、通过数组的形式,打印字符串
4、使用字符串的形式,打印字符数组
-- 字符串的打印格式:%s -- 默认从字符串的首地址开始,输出到\0结束;
-- 数组名默认代表数组的首地址
--'\0' :-- 字符串结束符,数组长度足够长,系统默认添加\0;
-- 例如:char ch[6]="hello"; 数组有5位,而数组的长度是6,就会默认添加\0。而如果数组长度是5,如果后面没有\0将会侵占其他空间,输出时就会输出别的数组的值,直到找到\0。
5、字符串的常用函数
注:字符串数组的常用函数只能用于字符数组,其他类型的数组不能用。
tip:函数都可以通过“man 函数”得到
例如:从man中找函数的参数,man getc
--getc -输入一个字符 --putc -输出一个字符
--gets -输入一个字符串s --保存输入的字符首地址
--puts -输出一个字符串
注:出现警告很正常,因为以后这个函数很可能会被删,不用在项目中即可。
gets与scanf的区别
gets能接收空格作为字符串的数据显示,scanf中空格的作用是结束当前变量的输入,进入下一个变量的输入,不能接收空格,有的题目中是统计空格个数,就不可以用scanf,只能用gets。
(1)strlen
-- 函数作用:
-- 获取字符串实际长度
-- 头文件:
#include<string.h>
(2)strcpy
-- 函数作用:
-- 复制字符串
-- 函数原型:
char *strcpy(char *dest,const char *src);
-- 头文件:
#include<string.h>
-- 函数参数:
dest:目的字符串首地址
src:原字符串首地址
(3)strcat
-- 函数作用:
拼接字符串
-- 函数原型:
char *strcat(char *dest,const char *src);
-- 函数头文件:
#include<string.h>
-- 函数参数
dest:目的字符串首地址
src:原字符串首地址
--注:目的串的长度要能够容纳两个字符串的内容
(4)strcmp
-- 函数作用:
--比较字符串
-- 函数原型:
int strcmp(const char *str1,const char *str2);
-- 函数的头文件:
#include<string.h>
-- 函数的参数:
str1:字符串1首地址
str2:字符串2首地址
-- 函数的返回值:
相等返回0
不相等返回s1-s2
数组例题
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;
}