高级程序设计语言吴 凡
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第七章 数组电子科技大学通信与信息工程学院概述
回顾:基本数据类型(整型、浮点型、字符型)
存储特点:每个变量单独存放。
构造类型:
int n[100]
100
101
102
103
104
...
199
n[0]
n[1]
n[2]
n[3]
n[4]
...
n[199]
struct student{
int number;
char name[10];
int age;
union sex;
int phone;
}
108
张三
number
name
sex
phone
男
83201234
电子科技大学通信与信息工程学院构造类型
构造类型:是由基本类型构造而成(例如:
数组、结构体、共同体、枚举型)
构造类型每一个 分量 可以是:基本类型,也可以是构造类型
存储特点:构造类型变量的每个分量占用 相邻的存储空间
重点:如何 访问 构造类型变量的分量电子科技大学通信与信息工程学院数组
有序 数据的集合:例如:矩阵,成绩表
若干分量 组成
分量具有 相同类型
按顺序形式组织
数组:按序列排列的具有相同数据类型的若干变量的集合
数组名 ——表示一个数组(例,int num[10];)
数组名 结合 下标 ——表示数组中元素
例:数组 num中的第 3号元素 (变量 ),num[2]
电子科技大学通信与信息工程学院一维数组
定义:
类型名 数组名 [常量表达式 ];
例,int num[10] 例,char str[5]
...
n[0]
n[1]
n[9]
int型分量
(2bytes)
10个分量
(2*10=20B)
str[0]
str[1]
char型分量
(1byte)
5个分量
(1*5=5B)str[2]str[3]
str[4]
电子科技大学通信与信息工程学院一维数组的定义
注意
数组名 是用户定义的数组标识符,与变量的命名规则相同
数组名 后只能根方括号 "[ ]"
方括号中的 常量表达式 表示数据元素的个数,
称为数组的长度。
常量表达式 只能是可以是 常量和符号常量,不能是变量。
例如,int index;
scanf(“%d”,&index);
int num[index]; 错误!!
电子科技大学通信与信息工程学院一维数组的存储
用 连续的内存单元 来存放数组中的各元素
数组所需的内存空间:由数组元素的类型和数组的长度(数组元素个数)共同决定
总字节数 = sizeof(基本类型 )*数组长度
例,int num[10],
总字节数 = sizeof(int)*10= 20Bytes
电子科技大学通信与信息工程学院一维数组元素的引用
数组先定义,再使用
在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
例:输出 10个元素的数组,for(i=0; i<10; i++)
printf("%d",a[i]);
而不能用,printf("%d",a);
数组元素引用的一般形式为:数组名 [下标 ]
例,a[6],a[i],a[i+1]
电子科技大学通信与信息工程学院一维数组元素的引用
下标:
表示元素在数组中的顺序号
下标取值从 0~数组长度- 1
例,int a[10]; 下标取值,0~ 9,即该数组的元素为
a[0],a[1],a[2],..,a[9]
下标取值可以是整型常量和整型表达式
例,a[n] = a[n-1]+a[0];
电子科技大学通信与信息工程学院一维数组元素的引用
例:读程序
注意:数组下标与循环变量的关系
#include "stdio.h"
main()
{
int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
i = 9;
while(i >= 0)
printf("%d ",a[i]);
}
电子科技大学通信与信息工程学院一维数组的初始化
1,在定义数组时,给数组元素赋初值
例,int a[4] = {1,3,5,7};?a[0]=1; a[1]=3; a[2]=5;
a[1]=7;
2,给部分元素赋初值
例,int a[10]={0,1,2,3,4};表示只给 a[0]~ a[4]5个元素赋值,而后 5个元素自动赋 0值。
3,给全部元素赋值时,可以不写数组长度
例,int a[ ]={1,2,3,4,5};?int a[5]={1,2,3,4,5};
注意:当数组长度与提供的初始值的个数不想同时,
数组长度不能省略电子科技大学通信与信息工程学院一维数组的初始化
例:读程序
#include "stdio.h"
main()
{
int i;
int a[5] = {1,2,3,4,5};
int b[5] = {1,2,3};
int c[] = {1,2,3,4,5};
int d[5];
for(i=0;i<5;i++)
printf("a[%d]=%d ",i,a[i]);
printf("\n");
for(i=0;i<5;i++)
printf("b[%d]=%d ",i,b[i]);
printf("\n");
for(i=0;i<5;i++)
printf("c[%d]=%d ",i,c[i]);
printf("\n");
for(i=0;i<5;i++)
printf("d[%d]=%d ",i,d[i]);
}
电子科技大学通信与信息工程学院一维数组程序举例
例( P116例 6.7和 P124例 7.2) Fibonacci数列,F1 = 1,F2 = 1,Fn = Fn-1+Fn-2 (n>=3),求前 20项数据,要求每行输出 4个数据。
#include "stdio.h"
main()
{
long int f1 = 1,f2 = 1,tmp;
int i;
printf("%16ld%16ld",f1,f2);
for(i=2; i<10; i++){
f1 = f1 + f2;
f2 = f2 + f1;
printf("%16ld%16ld",f1,f2);
if (i % 2 == 0)
printf("\n");
}
}
#include "stdio.h"
main()
{
long int f[21] = {0,1,1};
int i;
for(i = 3; i < 21; i++)
f[i] = f[i-1] + f[i-2];
for(i = 1; i < 21; i++){
printf("%16ld",f[i]);
if (i%4 ==0) printf("\n");
}
}
电子科技大学通信与信息工程学院一维数组程序举例
例:统计全班某门考试的平均分数和最高分数(设全班 30人)
#include "stdio.h"
main()
{
int i;
float sum=0.0,high=0.0,
float score,average;
printf("Input scores(30)\n");
for(i=0; i<30; i++){
scanf("%f",&score);
sum += score;
if (score > high)
high = score;
}
average = sum / i;
printf("average=%f\t",average);
printf("High score=%f\n",high);
}
#include "stdio.h"
main()
{
float score[30]={0};
for (i=0; i<30; i++)
scanf("%f",&score[i]);
for (i=0; i<30; i++){
sum += score[i];
if (score[i] > high)
high = score[i];
}
average = sum / i;
printf("average=%f\t",average);
printf("High score=%f\n",high);
}
电子科技大学通信与信息工程学院一维数组程序举例
例( P124例 7.3)冒泡法排序
9
8
4
5
2
0 9
8
4
5
2
0
9
8
4
5
2
09
8
4
5
2
09
第一趟
9
8
4
5
2
0
第二趟 第三趟 第四趟 第五趟
第一趟(共比较 5次),大数 9“沉底”,小数“浮起”;
第二趟(共比较 4次),次大数 8“沉底”(倒数第二位),
小数“浮起”;
如此循环,可以推之 6个数需要进行 5趟冒泡;那么 N个数,
需要进行 N- 1趟冒泡,并且,第 i趟冒泡,需要两两比较 N
- i次
8
4
5
2
0
09
8
电子科技大学通信与信息工程学院冒泡法排序
要排序的数可以放在数组中(设有 N个数)
用二重循环控制排序过程:
外循环 i控制冒泡的趟数( N- 1)
内循环 j控制每趟冒泡需要比较的次数( N- i)
输入 n个数到 s[1]~s[n]
外循环,i从 1~n-1趟内循环,j从 1到 n-i次
s[j]>s[j+1]
Y N
交换 s[j]和
s[j+1]的值输出 n个数,s[1]~s[n]
#define NUM 6
main(){
int s[NUM+1] = {0,9,8,4,5,2,0};
int i,j,k,tmp;
for (i = 1; i <= NUM-1; i++){
for (j = 1; j <= NUM-i; j++)
if (s[j] > s[j+1]){
tmp = s[j];
s[j] = s[j+1];
s[j+1] = tmp;
}
for (k = 1; k <= NUM; k++)
printf("%10d",s[k]);
printf("\n");
}
}
电子科技大学通信与信息工程学院二维数组
理解二维数组:
数组的元素又是一个数组,所以可以将二维数组理解为“数组的数组”
照次理解,还可以构造出三维数组,四维数组,
等多维数组
a00 a01 a02
a10 a11 a12
a20 a21 a22
int a[0][3],a[0][0]; a[0][1]; a[0][2]
int a[1][3],a[1][0]; a[1][1]; a[1][2]
int a[2][3],a[2][0]; a[2][1]; a[2][2]
int a[3][] int a[3][3]
电子科技大学通信与信息工程学院
二维数组定义:
类型说明符 数组名 [常量表达式 1][常量表达式 2]
常量表达式 1:表示第一维下标的长度
常量表达式 2,表示第二维下标的长度
例,int a[3][4];
理解 1:定义了一个 3行 4列的数组,数组名为 a,该数组的下标变量共有 3× 4个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
理解 2:定义了一个一维数组 a,有三个元素,a[0]、
a[1],a[2],而每一个元素又是一个包含 4个整型元素的一维数组二维数组的定义
int a[][]
int a[0][4],a[0][0] a[0][1] a[0][2] a[0][3]
int a[1][4],a[1][0] a[1][1] a[1][2] a[1][3]
int a[2][4],a[2][0] a[2][1] a[2][2] a[2][3]
电子科技大学通信与信息工程学院二维数组的存储
二维数组在概念上可以理解成行 × 列矩阵,
但在存储器是一维的,所以二维数组在内存中是按照一定规则存储:
按 行 存放
char c[2][3]
c[0][0]
c[0][1]
c[0][2]
c[1][0]
c[1][1]
c[1][2]
2000
2001
2002
2003
2004
2005
地址电子科技大学通信与信息工程学院二维数组元素的引用
二维数组的 元素 也称为双下标 变量,引用形式:
数组名 [下标 ][下标 ]
下标应为整型常量或整型表达式
例,int a[3][4],b[4][2] /*定义数组 */
a[2][1+2] = b[i-1][1]; /*对二维数组的引用 */
注意:
下标的取值范围
区别数组的定义与引用:
数组定义:方括号中给出的是该数组某一维的长度,即可取下标的最大值,长度只能是整型常量
数组引用:引用数组中的一个 变量,该变量在 数组中的位置 由下标说明,下标可以是常量,变量或表达式电子科技大学通信与信息工程学院二维数组的初始化
按存放顺序赋初值
例,int x[2][3] = {1,2,3,4,5,6};
等价,x[0][0]=1; x[0][1]=2; x[0][2]=3; x[1][0]=4; x[1][1]=5;
x[1][2]=5;
按行赋初值
例,int x[2][3] = {{1,2,3},{4,5,6}};
部分赋初值,未赋初值 的元素自动取 0值
1,int x[2][3] = {1,2,3,4}; 等价,
x[0][0]=1; x[0][1]=2; x[0][2]=3; x[1][0]=4; x[1][1]=0;
x[1][2]=0;
2,int x[2][3] = {{1,2,},{4}}; 等价,
x[0][0]=1; x[0][1]=2; x[0][2]=0;
x[1][0]=4; x[1][1]=0; x[1][2]=0;
电子科技大学通信与信息工程学院二维数组的初始化
如对全部元素赋初值,则第一维的长度可以省略
例,int a[ ][3]={1,2,3,4,5,6,7,8,9};
等价,int a[3][3]={1,2,3,4,5,6,7,8,9};
注意:不能省略二维长度电子科技大学通信与信息工程学院二维数组举例
一般二维数组的处理用二重循环来实现,
用循环变量的值控制数组元素的下标
例:读程序
#include "stdio.h"
main()
{
int i,j,a[3][3];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
scanf("%d",&a[i][j]);
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");
}
}
按行输入按行输出电子科技大学通信与信息工程学院二维数组举例
例:读程序
#include "stdio.h"
main()
{
int i,j,a[3][3];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
scanf("%d",&a[j][i]);
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");
}
}
按列输入按行输出电子科技大学通信与信息工程学院二维数组举例
一般二维数组的处理用二重循环来实现,
用循环变量的值控制数组元素的下标
例:一个学习小组有 5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
张 王 李 赵 周
Math 80 61 59 85 76
c 75 65 63 87 77
English 92 71 70 90 85
电子科技大学通信与信息工程学院
#include "stdio.h"
main()
{
int i,j,sum=0,a[5][3];
float sub_ave[3],total_ave;
for(i=0;i<3;i++){
switch (i){
case 0,printf("input Math score\n");break;
case 1,printf("input C score\n");break;
case 2,printf("input Eglish score\n");break;
}
for(sum=0,j=0;j<5;j++){
scanf("%d",&a[j][i]);
sum += a[j][i];
}
sub_ave[i] = sum / 5.0;
}
total_ave=(sub_ave[0]+sub_ave[1]+sub_ave[2])/3.0;
printf("math_ave:%f\t c_ave:%f\t Eng_ave:%f\n",
sub_ave[0],sub_ave[1],sub_ave[2]);
printf("total_average,%f\n",total_ave);
}
电子科技大学通信与信息工程学院字符数组(字符串)
C语言中用一维数组来存放字符串变量
字符数组的定义、初始化、引用与一维数组类似,不过对于字符数组的引用部分还有一些独特的方法
字符数组定义形式:
一维,char 数组名 [长度 ];
二维,char 数组名 [长度 1] [长度 2];
例,char c[5];
电子科技大学通信与信息工程学院字符数组初始化
按元素赋初值
例,char s[5] = {'a','b','c','d','e'};
例,char s[10] = {'x','y','z'};
注意:
当初值个数不足时,系统会自动地用 \0(空字符,ASCII
值= 0)来填充
字符串长度与数组长度不一定相同 ——如何来判断字符串的实际长度?
a b c d e
s[0] s[1] s[2] s[3] s[4]
x y z \0 \0 \0 \0 \0 \0 \0
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
电子科技大学通信与信息工程学院字符数组初始化
使用字符串常量赋初值
例,char s[6] = "china";
等价 char s[6] = {"china"};
等价 char s[] ="china";
注意:
以字符串常量赋初值时,系统会自动地在字符串后面添加结束标志,\0”——原因?
数组的长度 >=字符串长度 +1
c h i n a \0
s[0] s[1] s[2] s[3] s[4] s[5]
电子科技大学通信与信息工程学院字符数组初始化
总结:
为了测定字符串的实际长度,C规定了 字符串结束标志,\0(ASCII值为 0),即遇到 \0表示该字符串结束
按元素赋初值时,字符数组可以不包含 \0,但为了能测定字符串的实际长度,一般人为地给字符数组赋上一个 \0作为结束
例,char s[] = "china";
等价 char s[6] = {?c?,‘ h?,'i','n','a','\0'};
电子科技大学通信与信息工程学院字符数组初始化
例:读程序
#include "stdio.h"
main()
{
char a[10] = "china";
char b[] = "china";
char c[5] = {'c','h','i','n','a'};
int i;
for (i=0; i<10; i++){
printf("a[%d]=%-8d",i,a[i]);
if (!((i+1)%5)) printf("\n");
}
for (i=0; i<10; i++){
printf("b[%d]=%-8d",i,b[i]);
if (!((i+1)%5)) printf("\n");
}
printf("\n");
for (i=0; i<5; i++)
printf("c[%d]=%-8d",i,c[i]);
}
电子科技大学通信与信息工程学院字符数组的引用与输入输出( IO)
对于字符数组引用:
可以 逐个引用 字符串中的 单个 字符变量
也可以 一次引用整个 字符数组(字符串)
字符串的 IO
逐个引用 ——用 %c格式描述符
例,(Input)
char s[4];
scanf("%c%c%c%c",&s[0],&s[1],&s[2],&s[3]);
例,(Output)
char s[]="abc";
printf("%c,%c,%c",s[0],s[1],s[2]);
电子科技大学通信与信息工程学院字符数组的引用与输入输出( IO)
一次引用 ——用 %s格式描述符
例,(Output) char s[]="abc";
printf{"%s",s};
例,(Iutput) char s[10];
scanf("%s",s);
注意:
1,用 %s输出字符串时,遇到第一个 \0就停止输出 —
—\0字符串结束标志
2,用 %s输出字符串时,要求提供字符串首地址,对于一维数组,就是数组名数组名=该数组的首地址数组名=该数组的首地址电子科技大学通信与信息工程学院
%s格式描述符
例:读程序
char s[2][3]={'a','b','c','d','e','\0'};
printf ("%s\n",s);
例:读程序
char s[2][3]={{"ab"},{"cd"}};
printf ("%s\n",s);
例:读程序
char a[3][4]={{"*"},{"**"},{"***"}};
printf("%s\n",a);
printf("%s\n%s\n%s\n",a[0],a[1],a[2]);
第 2行首地址
(数组名+第 1维下标 )
电子科技大学通信与信息工程学院
%s格式描述符
例:读程序
char str[3][5];
scanf("%s%s%s",str[1],str[2],str[3]);
输入,how are you?
注意:
sancf用 %s输入 多个字符串(区别 %c) 时,遇 空格 或回车 便认为是一个字符串结束
h o w \0 \0
a r e \0 \0
y o u? \0
内存 Str1[5]
Str2[5]
Str3[5]
电子科技大学通信与信息工程学院字符串处理函数
C语言提供了丰富的字符串处理函数,可分为字符串的输入、输出、合并、修改、比较、
转换、复制、搜索几类。
使用字符串函数的声明放在头文件 "string.h"
电子科技大学通信与信息工程学院字符串输入函数 gets
调用格式,gets (字符数组名 )
功能:从标准输入设备输入一个字符串放到指定数组中;函数返回值为该字符数组的首地址
注意:
使用 gets( )时,以回车为结束,而将空格视为普通字符(区别 scanf)
例,#include"stdio.h"#include"string.h"
main()
{char str[15];
printf("input string:\n");
gets(str);
printf("%s",str);
}
电子科技大学通信与信息工程学院字符串输出函数 puts
调用格式,puts (字符数组名 )
功能:把字符数组中的字符串(以 \0结束)
输出到标准输出。
注意:
puts()输出字符串后会自动换行
puts(str); 等价于 printf("%s\n",str);
puts(gets(str));
电子科技大学通信与信息工程学院字符串拷贝函数 strcpy
调用格式:
strcpy (目的字符数组名,源字符数组名 )
功能:把源字符数组中的字符串拷贝到目的字符数组中。字符串结束标志,\0”也一同拷贝。
注意:
源字符数可以是一个字符串常量
目的字符数组 1的长度 >=源字符数组的长度
不能 把字符串或字符数组 直接赋值 给一个字符数组,
而应使用 strcp()完成此功能
例,char str1[10],str2[10];
str1 = "china";X
str2 = str1X
strcpy(str1,"china");
strcpy(str2,str1);
电子科技大学通信与信息工程学院字符串连接函数 strcat
调用格式:
strcat (字符数组名 1,字符数组名 2)
功能:把字符数组 2中的字符串连接到字符数组 1 中字符串的后面,并删去字符串 1后的串标志,\0”。函数返回值是字符数组 1的首地址。
例:
#include"stdio.h"
#include"string.h"
main()
{
char str1[30]="My name is ";
char str2[10];
printf("input your name:\n");
gets(str2);
strcat(str1,str2);
puts(st1);
}
电子科技大学通信与信息工程学院字符串连接函数 strcat
注意:
字符数组 1应定义足够的长度,否则不能全部装入被连接的字符串
字符串的连接应该使用 strcat( )函数,而不能使用+号例
char c[10];
c = "abc"+"de"X
strcpy(c,"abc");
strcat(c,"de");
电子科技大学通信与信息工程学院字符串比较函数 strcmp
调用格式:
strcmp(字符数组名 1,字符数组名 2)
功能:按照 ASCII码顺序 逐个 比较两个数组中的字符串,并由函数返回值返回比较结果。
比较结果
相等,strcmp( "AB","AB"),返回值 =0;
大于,strcmp( "ab","AB"),返回值 >0;
小于,strcmp( "AB","aB"),返回值 <0;
电子科技大学通信与信息工程学院测字符串长度函数 strlen
格式,strlen(字符数组名 )
功能:测字符串的实际长度 (不含字符串结束标志‘ \0?) 并作为函数返回值。
电子科技大学通信与信息工程学院
strlwr() & strupr()
strlwr()函数
格式,strlwr(字符串 );
功能:将字符串中大写字母转换为小写字母
strupr()函数
格式,strupr(字符串 );
功能:将字符串中小写字母转换为大写字母电子科技大学通信与信息工程学院程序举例
例:读程序
#include"stdio.h"
#include"string.h"
main()
{
char str[40];
int i;
printf("input a string:\n");
gets(str);
i = strlen(str);
for (; i>=0; i--)
putchar(str[i]);
puts("");
}
电子科技大学通信与信息工程学院例:输入一行字符串,统计单词数
( P138 例 7.8)
思路:
输入字符串 ——puts()还是 scanf()?
单词之间应有空格相隔,所以统计单词数可以通过计算空格数来实现
单词间若有多个空格,视为 1个空格
行首的空格不应计数
如何寻找空格(即跳过单词)?
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第七章 数组电子科技大学通信与信息工程学院概述
回顾:基本数据类型(整型、浮点型、字符型)
存储特点:每个变量单独存放。
构造类型:
int n[100]
100
101
102
103
104
...
199
n[0]
n[1]
n[2]
n[3]
n[4]
...
n[199]
struct student{
int number;
char name[10];
int age;
union sex;
int phone;
}
108
张三
number
name
sex
phone
男
83201234
电子科技大学通信与信息工程学院构造类型
构造类型:是由基本类型构造而成(例如:
数组、结构体、共同体、枚举型)
构造类型每一个 分量 可以是:基本类型,也可以是构造类型
存储特点:构造类型变量的每个分量占用 相邻的存储空间
重点:如何 访问 构造类型变量的分量电子科技大学通信与信息工程学院数组
有序 数据的集合:例如:矩阵,成绩表
若干分量 组成
分量具有 相同类型
按顺序形式组织
数组:按序列排列的具有相同数据类型的若干变量的集合
数组名 ——表示一个数组(例,int num[10];)
数组名 结合 下标 ——表示数组中元素
例:数组 num中的第 3号元素 (变量 ),num[2]
电子科技大学通信与信息工程学院一维数组
定义:
类型名 数组名 [常量表达式 ];
例,int num[10] 例,char str[5]
...
n[0]
n[1]
n[9]
int型分量
(2bytes)
10个分量
(2*10=20B)
str[0]
str[1]
char型分量
(1byte)
5个分量
(1*5=5B)str[2]str[3]
str[4]
电子科技大学通信与信息工程学院一维数组的定义
注意
数组名 是用户定义的数组标识符,与变量的命名规则相同
数组名 后只能根方括号 "[ ]"
方括号中的 常量表达式 表示数据元素的个数,
称为数组的长度。
常量表达式 只能是可以是 常量和符号常量,不能是变量。
例如,int index;
scanf(“%d”,&index);
int num[index]; 错误!!
电子科技大学通信与信息工程学院一维数组的存储
用 连续的内存单元 来存放数组中的各元素
数组所需的内存空间:由数组元素的类型和数组的长度(数组元素个数)共同决定
总字节数 = sizeof(基本类型 )*数组长度
例,int num[10],
总字节数 = sizeof(int)*10= 20Bytes
电子科技大学通信与信息工程学院一维数组元素的引用
数组先定义,再使用
在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
例:输出 10个元素的数组,for(i=0; i<10; i++)
printf("%d",a[i]);
而不能用,printf("%d",a);
数组元素引用的一般形式为:数组名 [下标 ]
例,a[6],a[i],a[i+1]
电子科技大学通信与信息工程学院一维数组元素的引用
下标:
表示元素在数组中的顺序号
下标取值从 0~数组长度- 1
例,int a[10]; 下标取值,0~ 9,即该数组的元素为
a[0],a[1],a[2],..,a[9]
下标取值可以是整型常量和整型表达式
例,a[n] = a[n-1]+a[0];
电子科技大学通信与信息工程学院一维数组元素的引用
例:读程序
注意:数组下标与循环变量的关系
#include "stdio.h"
main()
{
int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
i = 9;
while(i >= 0)
printf("%d ",a[i]);
}
电子科技大学通信与信息工程学院一维数组的初始化
1,在定义数组时,给数组元素赋初值
例,int a[4] = {1,3,5,7};?a[0]=1; a[1]=3; a[2]=5;
a[1]=7;
2,给部分元素赋初值
例,int a[10]={0,1,2,3,4};表示只给 a[0]~ a[4]5个元素赋值,而后 5个元素自动赋 0值。
3,给全部元素赋值时,可以不写数组长度
例,int a[ ]={1,2,3,4,5};?int a[5]={1,2,3,4,5};
注意:当数组长度与提供的初始值的个数不想同时,
数组长度不能省略电子科技大学通信与信息工程学院一维数组的初始化
例:读程序
#include "stdio.h"
main()
{
int i;
int a[5] = {1,2,3,4,5};
int b[5] = {1,2,3};
int c[] = {1,2,3,4,5};
int d[5];
for(i=0;i<5;i++)
printf("a[%d]=%d ",i,a[i]);
printf("\n");
for(i=0;i<5;i++)
printf("b[%d]=%d ",i,b[i]);
printf("\n");
for(i=0;i<5;i++)
printf("c[%d]=%d ",i,c[i]);
printf("\n");
for(i=0;i<5;i++)
printf("d[%d]=%d ",i,d[i]);
}
电子科技大学通信与信息工程学院一维数组程序举例
例( P116例 6.7和 P124例 7.2) Fibonacci数列,F1 = 1,F2 = 1,Fn = Fn-1+Fn-2 (n>=3),求前 20项数据,要求每行输出 4个数据。
#include "stdio.h"
main()
{
long int f1 = 1,f2 = 1,tmp;
int i;
printf("%16ld%16ld",f1,f2);
for(i=2; i<10; i++){
f1 = f1 + f2;
f2 = f2 + f1;
printf("%16ld%16ld",f1,f2);
if (i % 2 == 0)
printf("\n");
}
}
#include "stdio.h"
main()
{
long int f[21] = {0,1,1};
int i;
for(i = 3; i < 21; i++)
f[i] = f[i-1] + f[i-2];
for(i = 1; i < 21; i++){
printf("%16ld",f[i]);
if (i%4 ==0) printf("\n");
}
}
电子科技大学通信与信息工程学院一维数组程序举例
例:统计全班某门考试的平均分数和最高分数(设全班 30人)
#include "stdio.h"
main()
{
int i;
float sum=0.0,high=0.0,
float score,average;
printf("Input scores(30)\n");
for(i=0; i<30; i++){
scanf("%f",&score);
sum += score;
if (score > high)
high = score;
}
average = sum / i;
printf("average=%f\t",average);
printf("High score=%f\n",high);
}
#include "stdio.h"
main()
{
float score[30]={0};
for (i=0; i<30; i++)
scanf("%f",&score[i]);
for (i=0; i<30; i++){
sum += score[i];
if (score[i] > high)
high = score[i];
}
average = sum / i;
printf("average=%f\t",average);
printf("High score=%f\n",high);
}
电子科技大学通信与信息工程学院一维数组程序举例
例( P124例 7.3)冒泡法排序
9
8
4
5
2
0 9
8
4
5
2
0
9
8
4
5
2
09
8
4
5
2
09
第一趟
9
8
4
5
2
0
第二趟 第三趟 第四趟 第五趟
第一趟(共比较 5次),大数 9“沉底”,小数“浮起”;
第二趟(共比较 4次),次大数 8“沉底”(倒数第二位),
小数“浮起”;
如此循环,可以推之 6个数需要进行 5趟冒泡;那么 N个数,
需要进行 N- 1趟冒泡,并且,第 i趟冒泡,需要两两比较 N
- i次
8
4
5
2
0
09
8
电子科技大学通信与信息工程学院冒泡法排序
要排序的数可以放在数组中(设有 N个数)
用二重循环控制排序过程:
外循环 i控制冒泡的趟数( N- 1)
内循环 j控制每趟冒泡需要比较的次数( N- i)
输入 n个数到 s[1]~s[n]
外循环,i从 1~n-1趟内循环,j从 1到 n-i次
s[j]>s[j+1]
Y N
交换 s[j]和
s[j+1]的值输出 n个数,s[1]~s[n]
#define NUM 6
main(){
int s[NUM+1] = {0,9,8,4,5,2,0};
int i,j,k,tmp;
for (i = 1; i <= NUM-1; i++){
for (j = 1; j <= NUM-i; j++)
if (s[j] > s[j+1]){
tmp = s[j];
s[j] = s[j+1];
s[j+1] = tmp;
}
for (k = 1; k <= NUM; k++)
printf("%10d",s[k]);
printf("\n");
}
}
电子科技大学通信与信息工程学院二维数组
理解二维数组:
数组的元素又是一个数组,所以可以将二维数组理解为“数组的数组”
照次理解,还可以构造出三维数组,四维数组,
等多维数组
a00 a01 a02
a10 a11 a12
a20 a21 a22
int a[0][3],a[0][0]; a[0][1]; a[0][2]
int a[1][3],a[1][0]; a[1][1]; a[1][2]
int a[2][3],a[2][0]; a[2][1]; a[2][2]
int a[3][] int a[3][3]
电子科技大学通信与信息工程学院
二维数组定义:
类型说明符 数组名 [常量表达式 1][常量表达式 2]
常量表达式 1:表示第一维下标的长度
常量表达式 2,表示第二维下标的长度
例,int a[3][4];
理解 1:定义了一个 3行 4列的数组,数组名为 a,该数组的下标变量共有 3× 4个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
理解 2:定义了一个一维数组 a,有三个元素,a[0]、
a[1],a[2],而每一个元素又是一个包含 4个整型元素的一维数组二维数组的定义
int a[][]
int a[0][4],a[0][0] a[0][1] a[0][2] a[0][3]
int a[1][4],a[1][0] a[1][1] a[1][2] a[1][3]
int a[2][4],a[2][0] a[2][1] a[2][2] a[2][3]
电子科技大学通信与信息工程学院二维数组的存储
二维数组在概念上可以理解成行 × 列矩阵,
但在存储器是一维的,所以二维数组在内存中是按照一定规则存储:
按 行 存放
char c[2][3]
c[0][0]
c[0][1]
c[0][2]
c[1][0]
c[1][1]
c[1][2]
2000
2001
2002
2003
2004
2005
地址电子科技大学通信与信息工程学院二维数组元素的引用
二维数组的 元素 也称为双下标 变量,引用形式:
数组名 [下标 ][下标 ]
下标应为整型常量或整型表达式
例,int a[3][4],b[4][2] /*定义数组 */
a[2][1+2] = b[i-1][1]; /*对二维数组的引用 */
注意:
下标的取值范围
区别数组的定义与引用:
数组定义:方括号中给出的是该数组某一维的长度,即可取下标的最大值,长度只能是整型常量
数组引用:引用数组中的一个 变量,该变量在 数组中的位置 由下标说明,下标可以是常量,变量或表达式电子科技大学通信与信息工程学院二维数组的初始化
按存放顺序赋初值
例,int x[2][3] = {1,2,3,4,5,6};
等价,x[0][0]=1; x[0][1]=2; x[0][2]=3; x[1][0]=4; x[1][1]=5;
x[1][2]=5;
按行赋初值
例,int x[2][3] = {{1,2,3},{4,5,6}};
部分赋初值,未赋初值 的元素自动取 0值
1,int x[2][3] = {1,2,3,4}; 等价,
x[0][0]=1; x[0][1]=2; x[0][2]=3; x[1][0]=4; x[1][1]=0;
x[1][2]=0;
2,int x[2][3] = {{1,2,},{4}}; 等价,
x[0][0]=1; x[0][1]=2; x[0][2]=0;
x[1][0]=4; x[1][1]=0; x[1][2]=0;
电子科技大学通信与信息工程学院二维数组的初始化
如对全部元素赋初值,则第一维的长度可以省略
例,int a[ ][3]={1,2,3,4,5,6,7,8,9};
等价,int a[3][3]={1,2,3,4,5,6,7,8,9};
注意:不能省略二维长度电子科技大学通信与信息工程学院二维数组举例
一般二维数组的处理用二重循环来实现,
用循环变量的值控制数组元素的下标
例:读程序
#include "stdio.h"
main()
{
int i,j,a[3][3];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
scanf("%d",&a[i][j]);
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");
}
}
按行输入按行输出电子科技大学通信与信息工程学院二维数组举例
例:读程序
#include "stdio.h"
main()
{
int i,j,a[3][3];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
scanf("%d",&a[j][i]);
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");
}
}
按列输入按行输出电子科技大学通信与信息工程学院二维数组举例
一般二维数组的处理用二重循环来实现,
用循环变量的值控制数组元素的下标
例:一个学习小组有 5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
张 王 李 赵 周
Math 80 61 59 85 76
c 75 65 63 87 77
English 92 71 70 90 85
电子科技大学通信与信息工程学院
#include "stdio.h"
main()
{
int i,j,sum=0,a[5][3];
float sub_ave[3],total_ave;
for(i=0;i<3;i++){
switch (i){
case 0,printf("input Math score\n");break;
case 1,printf("input C score\n");break;
case 2,printf("input Eglish score\n");break;
}
for(sum=0,j=0;j<5;j++){
scanf("%d",&a[j][i]);
sum += a[j][i];
}
sub_ave[i] = sum / 5.0;
}
total_ave=(sub_ave[0]+sub_ave[1]+sub_ave[2])/3.0;
printf("math_ave:%f\t c_ave:%f\t Eng_ave:%f\n",
sub_ave[0],sub_ave[1],sub_ave[2]);
printf("total_average,%f\n",total_ave);
}
电子科技大学通信与信息工程学院字符数组(字符串)
C语言中用一维数组来存放字符串变量
字符数组的定义、初始化、引用与一维数组类似,不过对于字符数组的引用部分还有一些独特的方法
字符数组定义形式:
一维,char 数组名 [长度 ];
二维,char 数组名 [长度 1] [长度 2];
例,char c[5];
电子科技大学通信与信息工程学院字符数组初始化
按元素赋初值
例,char s[5] = {'a','b','c','d','e'};
例,char s[10] = {'x','y','z'};
注意:
当初值个数不足时,系统会自动地用 \0(空字符,ASCII
值= 0)来填充
字符串长度与数组长度不一定相同 ——如何来判断字符串的实际长度?
a b c d e
s[0] s[1] s[2] s[3] s[4]
x y z \0 \0 \0 \0 \0 \0 \0
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
电子科技大学通信与信息工程学院字符数组初始化
使用字符串常量赋初值
例,char s[6] = "china";
等价 char s[6] = {"china"};
等价 char s[] ="china";
注意:
以字符串常量赋初值时,系统会自动地在字符串后面添加结束标志,\0”——原因?
数组的长度 >=字符串长度 +1
c h i n a \0
s[0] s[1] s[2] s[3] s[4] s[5]
电子科技大学通信与信息工程学院字符数组初始化
总结:
为了测定字符串的实际长度,C规定了 字符串结束标志,\0(ASCII值为 0),即遇到 \0表示该字符串结束
按元素赋初值时,字符数组可以不包含 \0,但为了能测定字符串的实际长度,一般人为地给字符数组赋上一个 \0作为结束
例,char s[] = "china";
等价 char s[6] = {?c?,‘ h?,'i','n','a','\0'};
电子科技大学通信与信息工程学院字符数组初始化
例:读程序
#include "stdio.h"
main()
{
char a[10] = "china";
char b[] = "china";
char c[5] = {'c','h','i','n','a'};
int i;
for (i=0; i<10; i++){
printf("a[%d]=%-8d",i,a[i]);
if (!((i+1)%5)) printf("\n");
}
for (i=0; i<10; i++){
printf("b[%d]=%-8d",i,b[i]);
if (!((i+1)%5)) printf("\n");
}
printf("\n");
for (i=0; i<5; i++)
printf("c[%d]=%-8d",i,c[i]);
}
电子科技大学通信与信息工程学院字符数组的引用与输入输出( IO)
对于字符数组引用:
可以 逐个引用 字符串中的 单个 字符变量
也可以 一次引用整个 字符数组(字符串)
字符串的 IO
逐个引用 ——用 %c格式描述符
例,(Input)
char s[4];
scanf("%c%c%c%c",&s[0],&s[1],&s[2],&s[3]);
例,(Output)
char s[]="abc";
printf("%c,%c,%c",s[0],s[1],s[2]);
电子科技大学通信与信息工程学院字符数组的引用与输入输出( IO)
一次引用 ——用 %s格式描述符
例,(Output) char s[]="abc";
printf{"%s",s};
例,(Iutput) char s[10];
scanf("%s",s);
注意:
1,用 %s输出字符串时,遇到第一个 \0就停止输出 —
—\0字符串结束标志
2,用 %s输出字符串时,要求提供字符串首地址,对于一维数组,就是数组名数组名=该数组的首地址数组名=该数组的首地址电子科技大学通信与信息工程学院
%s格式描述符
例:读程序
char s[2][3]={'a','b','c','d','e','\0'};
printf ("%s\n",s);
例:读程序
char s[2][3]={{"ab"},{"cd"}};
printf ("%s\n",s);
例:读程序
char a[3][4]={{"*"},{"**"},{"***"}};
printf("%s\n",a);
printf("%s\n%s\n%s\n",a[0],a[1],a[2]);
第 2行首地址
(数组名+第 1维下标 )
电子科技大学通信与信息工程学院
%s格式描述符
例:读程序
char str[3][5];
scanf("%s%s%s",str[1],str[2],str[3]);
输入,how are you?
注意:
sancf用 %s输入 多个字符串(区别 %c) 时,遇 空格 或回车 便认为是一个字符串结束
h o w \0 \0
a r e \0 \0
y o u? \0
内存 Str1[5]
Str2[5]
Str3[5]
电子科技大学通信与信息工程学院字符串处理函数
C语言提供了丰富的字符串处理函数,可分为字符串的输入、输出、合并、修改、比较、
转换、复制、搜索几类。
使用字符串函数的声明放在头文件 "string.h"
电子科技大学通信与信息工程学院字符串输入函数 gets
调用格式,gets (字符数组名 )
功能:从标准输入设备输入一个字符串放到指定数组中;函数返回值为该字符数组的首地址
注意:
使用 gets( )时,以回车为结束,而将空格视为普通字符(区别 scanf)
例,#include"stdio.h"#include"string.h"
main()
{char str[15];
printf("input string:\n");
gets(str);
printf("%s",str);
}
电子科技大学通信与信息工程学院字符串输出函数 puts
调用格式,puts (字符数组名 )
功能:把字符数组中的字符串(以 \0结束)
输出到标准输出。
注意:
puts()输出字符串后会自动换行
puts(str); 等价于 printf("%s\n",str);
puts(gets(str));
电子科技大学通信与信息工程学院字符串拷贝函数 strcpy
调用格式:
strcpy (目的字符数组名,源字符数组名 )
功能:把源字符数组中的字符串拷贝到目的字符数组中。字符串结束标志,\0”也一同拷贝。
注意:
源字符数可以是一个字符串常量
目的字符数组 1的长度 >=源字符数组的长度
不能 把字符串或字符数组 直接赋值 给一个字符数组,
而应使用 strcp()完成此功能
例,char str1[10],str2[10];
str1 = "china";X
str2 = str1X
strcpy(str1,"china");
strcpy(str2,str1);
电子科技大学通信与信息工程学院字符串连接函数 strcat
调用格式:
strcat (字符数组名 1,字符数组名 2)
功能:把字符数组 2中的字符串连接到字符数组 1 中字符串的后面,并删去字符串 1后的串标志,\0”。函数返回值是字符数组 1的首地址。
例:
#include"stdio.h"
#include"string.h"
main()
{
char str1[30]="My name is ";
char str2[10];
printf("input your name:\n");
gets(str2);
strcat(str1,str2);
puts(st1);
}
电子科技大学通信与信息工程学院字符串连接函数 strcat
注意:
字符数组 1应定义足够的长度,否则不能全部装入被连接的字符串
字符串的连接应该使用 strcat( )函数,而不能使用+号例
char c[10];
c = "abc"+"de"X
strcpy(c,"abc");
strcat(c,"de");
电子科技大学通信与信息工程学院字符串比较函数 strcmp
调用格式:
strcmp(字符数组名 1,字符数组名 2)
功能:按照 ASCII码顺序 逐个 比较两个数组中的字符串,并由函数返回值返回比较结果。
比较结果
相等,strcmp( "AB","AB"),返回值 =0;
大于,strcmp( "ab","AB"),返回值 >0;
小于,strcmp( "AB","aB"),返回值 <0;
电子科技大学通信与信息工程学院测字符串长度函数 strlen
格式,strlen(字符数组名 )
功能:测字符串的实际长度 (不含字符串结束标志‘ \0?) 并作为函数返回值。
电子科技大学通信与信息工程学院
strlwr() & strupr()
strlwr()函数
格式,strlwr(字符串 );
功能:将字符串中大写字母转换为小写字母
strupr()函数
格式,strupr(字符串 );
功能:将字符串中小写字母转换为大写字母电子科技大学通信与信息工程学院程序举例
例:读程序
#include"stdio.h"
#include"string.h"
main()
{
char str[40];
int i;
printf("input a string:\n");
gets(str);
i = strlen(str);
for (; i>=0; i--)
putchar(str[i]);
puts("");
}
电子科技大学通信与信息工程学院例:输入一行字符串,统计单词数
( P138 例 7.8)
思路:
输入字符串 ——puts()还是 scanf()?
单词之间应有空格相隔,所以统计单词数可以通过计算空格数来实现
单词间若有多个空格,视为 1个空格
行首的空格不应计数
如何寻找空格(即跳过单词)?