@TOC
数组:相同==数据类型==的一组==有序==数据集合。
一.一维数组
1.定义数组
类型说明符 数组名[常量表达式]
int a[10];
常量表达式:常量和符号常量
不能动态定义数组大小
数组大小不依赖于程序运行时的变量的值
//int分配四个字节,此数组共40字节
标识符命名规则→第三章.数据表现形式及运算 一个对象(变量,函数,符号常量,数组,类型等)的名字,区分字母大小写,只由字母,数字和下画线组成,且第一个字符不能为数字
2.引用元素
数组名[下标]
下标从0开始
形式相同含义不同:定义元素个数,引用序号
//6.1-P141逆序输出数组元素
#include <stdio.h>
int main()
{
int i, a[10]; //定义数组,下标变量
for (i = 0; i <= 9; i++)//利用循环改变下标
a[i] = i; //利用循环赋值数组元素
for (i = 9; i >= 0; i--) //利用循环反向索引数组元素
printf("%d", a[i]); //依次输出数组元素
printf("\n");
return 0;
}
3.初始化
int a[10]={0};
定义时,初始化
自动给未赋值的元素赋值为0(字符型'\0',指针型NULL)
元素全部赋值时可不指定数组长度
//6.2-P143兔子数列
#include <stdio.h>
int main()
{
int i;
int f[20] = {1,1};
for (i = 2;i < 20; i++)
f[i] = f[i-2] + f[i-1];
for (i = 0;i< 20; i++)
{
if (i%5 == 0) printf("\n");//控制每输出五个换行
printf("%12d", f[i]);
}
printf("\n");
return 0;
}
%12d: 至少分配12个字符的宽度来显示这个整数。如果整数的位数少于12位,那么==前面会用空格填充==;如果整数的位数超过12位,整数将完整地打印出来,而不会截断。
4.程序
使用数组计算并保存中间数据
排序算法 1.冒泡:相邻比较,小的调前。 外循环→轮次,内循环→该轮比较的次数 第i轮要n-i次比较
//6.3-P145从小到大排序十个数
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
printf("input 10 numbers:\n");
for (i = 0; i < 10; i++)//注意等号是否需要
scanf_s("%d", &a[i]);//输入十个数,默认时用空格隔开输入
printf("\n");
for (j = 0; j < 9; j++)//外循环,比较9轮
for (i = 0; i < 9 - j; i++)//内循环次数
if (a[i] > a[i + 1])//相邻比较
{
t = a[i]; a[i] = a[i + 1]; a[i + 1] = t;//大的在后,小的在前
}
printf("the sorted numbers:\n");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);//最后顺序输出+
printf("\n");
return 0;
}
二.二维数组
矩阵,行列的逻辑结构→要用循环的嵌套
1.定义数组
类型说明符 数组名[常量表达式][常量表达式]
float a[3][4];
元素按行存放(逻辑上),内存中是线性连续存放的。
a[0],a[1],a[2]可以看作一维数组名
2.引用数组元素
数组名[下标][下标]
下标是整型表达式,下标值应在定义范围为内
数组元素可在表达式中,也可赋值
3.初始化
分行赋值,全部赋值,部分赋值
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={{1},{ },{9}};//从各行左开始赋值,后面自动赋值为0。分行或全部,可省略第一维长度。
4.程序
//6.4-P150行列交换的新数组
#include<stdio.h>
int main()
{
int a[2][3] = {{1,2,3},{4,5,6}};
int b[3][2], i, j;//i行,j列
printf("array a:\n");
for (i = 0; i <= 1; i++)
{
for (j = 0; j <= 2; j++)
{
printf("%5d", a[i][j]);
b[j][i] = a[i][j];
}
printf("\n");
}
printf("array b:\n");
for (i = 0; i<= 2; i++)
{
for (j = 0; j <= 1; j++)
printf("%5d", b[i][j]);
printf("\n");
}
return 0;
}
//6.5-P150打擂台法求最大
#include<stdio.h>
int main()
{
int i, j, row = 0, colum = 0, max;
int a[3][4] = { {1,2,3,4},{9,8,7,6},{-10,10,-5,2} };
max = a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if (a[i][j] > max)
{
max = a[i][j];
row = i;
colum = j;
}
printf("max=%d\nrow=%d\ncolum=%d\n", max, row, colum);
return 0;
}
三.字符数组
字符型属于整型,以ASCII码存储,占一个字节 ==字符串==存放在==字符型数组==中
1.定义数组
char c[10];一个元素放一个字符
int c[10];可以用整型数组存放,但是浪费内存
2.初始化
char c[ ]={'c',' ','p','r','o','g','r','a','m'};根据初值个数自动定义数组长度
char c[10 ]={'c',' ','p','r','o','g','r','a','m'};//空格也是字符
从左开始依次赋,其余自动定义为空字符'\0'(无实义)
二维字符数组(可表现平面图形,规则同上)
char c[ ]="I am happy"用字符串常量来初始化,
3.引用元素
//6.6-P152输出已知字符串
#include<stdio.h>
int main()
{
char c[15] = { 'I',' ','a','m',' ','a','s','t','u','d','d','e','n','t','.' };
int i;
for (i = 0; i < 15; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
//6.7-P153输出棱形
#include<stdio.h>
int main()
{
char diamond[][5] = { {' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},
{' ','*',' ','*'},{' ',' ','*'} };
int i, j;
for (i = 0; i < 5; i++)
{for(j=0;j<5;j++)
printf("%c", diamond[i][j]);
printf("\n");
}
return 0;
}
4.结束标志
字符串的有效长度(实际长度)vs 字符数组的长度:
遇到'\0'字符串结束,把'\0'前的字符组成一个字符串 系统自动在==字符串常量==加'\0'后存储在数组中
char c[ ]="I am happy"用字符串常量来初始化,有效长度不变,数组长度大1 用短的字符串代替长度字符串,要人为在后加上'\0'
数组不一定以'\0'结束
5.输入输出
%c -- 逐个字符 %s -- 整个字符串 %o -- 以八进制形式输出数组起始地址
printf 输出项 填 ==字符数组名==,不是元素名 遇到第一个'\0'结束,输出前面的有效长度
char c[6];
scanf("%s",c);//输入项也为字符数组名
数组名表示该数组第一个元素的地址(数组的起始地址),不用再加取地址符&
char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);//输入时用 空格 作为字符串间分隔,输入空格跳至下一个字符串数组
6.字符串的库函数
#include <string.h>//函数声明
1.puts(str) 输出==一个==以'\0'结束的字符串,包括转义字符 2.gets(str) 输入==一个==字符串到数组,得到起始地址 3.strcat(str,str) 连接,放入前面数组,取消前者'\0',保留后者'\0' 4.strcpy(str1,?,n) 复制后面==字符数组或字符串常量==中前n个字符,到前面==数组==中
若未初始化前面数组,不确定未被复制的字节内容
数组名是常量地址,值不能改变
5.strcmp(?,?) 比较字符串
从左到右逐个比ASCII码,至遇到'\0'或==出现不同==为止 结果为正整数(前大),0(相等),负整数
6.strlen(?) 测字符串实际长度 7.strlwr()换成小写 8.strupr()换成大写
//6.8-P162统计字符中单词个数
#include<stdio.h>
int main()
{
char string[81];
int i, num = 0, word = 0;
char c;
gets(string);
for (i = 0; (c = string[i]) != '\0'; i++)
if (c == ' ')word = 0;
else if(word==0)
{
word = 1;
num++;
}
printf("There are %d words in this line.\n", num);
return 0;
}