C语言复习-第六章

171 阅读6分钟

@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;
}

四.练习题目