C程序设计(第五版)谭浩强 学习笔记—重点及易错点(第6章)

5 篇文章 0 订阅
3 篇文章 0 订阅

第6章 利用数组处理批量数据

(1)数组是一个有序数据的集合;
(2)用一个数组名和下标来维一地确定数组中的元素;
(3)数组中的每一个元素必须是同一类型。

6.1怎么定义与引用一维数组

6.1.1定义一维数组

定义一维数组的一般格式:
类型符 变量名 [个数]
例如:int a[10];
注意:例如指定a[10],表示数组a有10个元素,下标由0-9,没有10。
int a[n];是不合法的,C语言不容许对数组的大小做动态的定义。

6.1.2引用一维数组

引用一维数组的一般格式:
变量名[下标];
例如:a[6];

6.1.3一维数组的初始化

  1. 在定义时对全部数组元素赋初值
    例如:int a[10]={0,2,3,4,5,6,7,8,9};
  2. 定义时对一部分元素赋初值(自动补零)
    例如:int a[10]={0,2,3,4,5};
  3. 在对全部元素赋初值时,由于元素的个数已经确定,在定义时可以不加个数
    例如:int a[ ]={0,2,3,4,5,6,7,8,9};
    说明:如果定义了一个数组,并对部分元素赋初值,那些没有赋初值的元素会根据不同数据类型,自动赋初值。例如:数值型为0,字符型为“\0”,指针型为NULL。

6.1.4一位数组程序举例

对十个数值进行有小到大排序(起泡法
起泡法基本思路是:每次将相邻的两数比较,将较小的调到前面。
基本思路

代码:

#include <stdio.h>
int main()
{
 int a[10];
 int i,j,t;
 printf("input 10 numbers :\n");
 for (i=0;i<10;i++)
  scanf("%d",&a[i]);
 printf("\n");
 for(j=0;j<9;j++)   //进行9次循环,实现9趟比较
  for(i=0;i<9-j;i++)  //在每一趟中进行9-j次比较
   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;

结果:
在这里插入图片描述

6.2怎么定义与引用二维数组

二维数组常称为矩阵(matrix)。把二维数组写成行(row)和列(column)的排列形式,可以有助于形象化地理解二维数组的逻辑结构。

6.2.1定义二维数组

类型说明符 数组名 [常量表达式] [常量表达式];
例如:float pay[3][6];
警告:float a[3, 4], b[5, 10]; //在一对方括号内不能写两个下标
二维数组的存储:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。

6.2.2引用二维数组元素

数组名[下标] [下标];
“下标”可以是整型常量或整型表达式。
数组元素可以出现在表达式中,也可以被赋值,如:b[1][2]=a[2][3]/2;

6.2.3二维数组的初始化

(1)分行给二维数组赋初值。(最清楚直观)
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值。
int a[3][4]={{1},{5,6}};
1 0 0 0
5 6 0 0
0 0 0 0
(4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; ==== int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

6.2.4 二维数组程序举例

有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

int main()
{
	int i,j,hang,lie,max;
	int a[3][4]={1,2,3,4,6,7,8,9,-10,10,-5,2};
	hang=0;
	lie=0;
	max=a[0][0];
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
	{
		if(a[i][j]>max)
	{
		hang=i;
	lie=j;
	max=a[i][j];

	}
	}
	}
	printf("最大为%d,位于:第%d行,第%d列\n",max,hang,lie);
}

6.3字符数组

C语言中没有字符串类型,也没有字符串变量,字符串是储存在字符数组中的。

6.3.1定义字符数组

例如:
char c[10];
c[0]=‘I’; c[1]=’ ‘;c[2]=‘a’;c[3]=‘m’;c[4]=’ ';c[5]=‘h’;c[6]=‘a’;c[7]=‘p’;c[8]=‘p’;c[9]=‘y’;
在这里插入图片描述

6.3.2字符数组的初始化

对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋给数组中各元素。
char c[10]={′I′,′ ′ ,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′}; //把10个字符依次赋给c[0]~c[9]这10个元素
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\0′)。

6.3.3引用字符数组中的元素

像普通数组一样。

#include <stdio.h>
int main()
{
	char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
	int i;
	for(i=0;i<15;i++)
		printf("%c",c[i]);
	printf("\n");
	return 0;
}

6.3.4字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的。
在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符′\0′作为结束标志。

6.3.5字符数组的输入输出

(1) 逐个字符输入输出。用格式符“%c”输入或输出一个字符。
(2) 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串(string)的输入输出。
例如:

#include <stdio.h>
int main()
{
	char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
	int i;
	for(i=0;i<15;i++)
		printf("%c",c[i]);
	printf("\n");
	return 0;
}
#include <stdio.h>
int main()
{
	char c[]="China";
	printf("%s\n",c);
	return 0;
}

注意:
(1) 输出的字符中不包括结束符′\0′。
(2) 用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(3) 如果数组长度大于字符串的实际长度,也只输出到遇′\0′结束。
(4) 如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。

从键盘输入:
China↙
系统会自动在China后面加一个′\0′结束符。
例如:

char c[6];
scanf("%s",c);

如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。
从键盘输入:
How are you? ↙
由于有空格字符分隔,作为3个字符串输入。
例如:

char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);

在这里插入图片描述
从键盘输入:
How are you? ↙
由于系统把空格字符作为输入的字符串之间的分隔符,因此只将空格前的字符″How″送到str中。

char str[13];
scanf("%s",str);

在这里插入图片描述

scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组第一个元素的地址(或者说数组的起始地址)。

6.3.6使用字符串处理函数

在这里插入图片描述
注意:puts函数自动换行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引用:部分图片来源于《C程序设计(第五版)谭浩强 》附带课件。

  • 11
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DP+GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值