第四章 数组
Download
1 / 44

第四章 数组 - PowerPoint PPT Presentation


  • 82 Views
  • Uploaded on

第四章 数组. 4.1 概述 4.2 一维数组 4.3 二维数组 4.4 字符数组. 4.1 概述. 数组是有序数据的集合。数组中的每一个元素都属于 同一个数据类型 。用一个 统一的数组名 和 下标 来唯一地确定数组中的元素。. 什么是数组呢 ?. 当要对一组数据进行排序、在一组数中查找某个数据,矩阵计算等,通常都要用数组来实现。. a[0]. 0. a[1]. 1. 2. a[2]. 3. a[3]. 4. a[4]. 5. a[5]. 内存. a. [ ] 数组运算符 单目运算符 优先级 ( 1 ) 左结合

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第四章 数组' - rigel-burris


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

第四章 数组

4.1 概述

4.2 一维数组

4.3 二维数组

4.4 字符数组


4.1 概述

  • 数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。

什么是数组呢?

当要对一组数据进行排序、在一组数中查找某个数据,矩阵计算等,通常都要用数组来实现。


a[0]

0

a[1]

1

2

a[2]

3

a[3]

4

a[4]

5

a[5]

内存

a

[ ] 数组运算符

单目运算符

优先级(1)

左结合

不能用( )

4.2 一维数组

4.2.1一维数组的定义和初始化

1.定义:类型说明符 数组名[常量表达式];

合法标识符

表示元素个数下标从 0开始

2.在内存分配若干连续空间给数组.

  • 例 int a[6];

编译时分配连续内存

内存字节数=数组长度*

sizeof(元素数据类型)

数组名表示内存首地址,

是地址常量


int i = 15;

int data[i]; (不能用变量定义数组长度)

例 int data[5];

data[5] = 10;// C语言对数组不作越界检查,使用时要注意


3. 一维数组的初始化

  • 初始化方式  

int a[5]={1,2,3,4,5};

等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;

在定义数组时,为数组元素赋初值

(在编译阶段使之得到初值)

  • 说明:

    • 数组不初始化,其元素值为随机数

  • 只给部分数组元素赋初值

  • 在对全部数组元素赋初值时,可不指定数组长度

如 int a[5] = {6,2,3};// 未指定的用 0填充

等价于:a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;

如 int a[3] = {6,2,3,5,1}; ()

  • 如果想使一个数组中全部元素值为0,可以写成:

int a[ ] = {1,2,3,4,5,6};

编译系统根据初值个数确定数组长度

int a[5] = {0,0,0,0,0}; 或int a[5] = {0};


4.2.2 一维数组元素的引用

整型常量

整型常量表达式

  • 1.数组同变量一样,必须先定义后引用

  • 2.引用数组元素的方法是:数组名[下标]

3.只能逐个引用数组元素,不能一次引用整个数组

例如:有定义 int a[10]; 可以引用元素的从a[0]到a[9]

a[3+5] a[10-10] a[5]=6; a[7]=a[5]++;

int a[10];

必须for(j = 0;j < 10;j++)

printf(“%d\t”,a[j]);()

printf(“%d”,a);()

循环变量 j的作用:

1、控制循环次数

2、用作数组下标


4-1 把数组a的元素依次赋0,10,20,…,90,再把a的元素值按逆序输出

#include <stdio.h>

void main()

{int i,a[10];

printf("input 10 numbers:\n");

for(i=0;i<10;i++)

a[i]=i*10;

for(i=9;i>=0;i--)

printf("%d ",a[i]);

}

程序运行结果:

90 80 70 60 50 40 30 20 10 0


定义数组

输入/赋值

基本方法

运算

输出


#include "stdio.h“

void main()

{ int fib[20]={1,1}

int i;

for(i=2;i<20;i++)

fib[i]=fib[i-1]+fib[i-2];

for(i=0;i<20;i++)

{ if(i%4==0)

printf(“\n”);

printf("%12d ",fib[i]);

}

}

  • 例4-2利用数组,求斐波拉契数列的前20项。

定义数组

计算

输出


行数

列数

4.3 二维数组

4.3.1 二维数组的定义和初始化

  • 1.定义方式:

  • 类型说明符 数组名[表达式1][表达式2];

例:float a[3][4],b[5][10];


2.说明:

  • 二维数组可看作特殊的一维数组;

  • 元素在内存排列顺序为按行存放;

  • 多维数组定义亦类似于二维数组,如: float a[2][3][4];

a[0][0]

a[0][1]

a[0][2]

a[1][0]

a[1][1]

a[1][2]

例: int a[2][3];

它在内存情况:


0 1 0 0

0 6 0 0

0 0 11 0

  • 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},{0,6},{0,0,11}};


(4)如果对全部元素都赋初值,则定义数组时可以不指定第一维的长度,

int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

若对部分元素赋初值而省略第一维的长度,必须用分行赋值来实现。

int a[][5]={{1,0,3},{0,15}}


4.3.2 二维数组元素的引用

  • 数组名[行下标] [列下标];

  • 例:int a[3][5];

  • 则可以有如下引用:a[1+1][2*2-1]等

  • 注意:下标值应该在已定义的数组大小范围内。


4-4 编程将下列矩阵中的元素向右移动一列,最右列移至第一列。

#include <stdio.h>

void main()

{ int a[2][3]={{2,5,6}, {9,7,8}};

int i,j,temp;

for(i=0;i<2;i++)

{ temp=a[i][3-i];

for(j=3-i;j>=0;j--)

a[i][j+1]=a[i][j];

a[i][0]=temp;

}

for(i=0;i<2;i++)

{ for(j=0;j<3;j++)

printf(“%6d ”,a[i][j]);

printf(“\n”);

}

}

  • 2 5 6

  • 9 7 8


4 5 6
4-5 输出杨辉三角的前6行数据。

#include <stdio.h>

void main()

{ int i,j,a[6][6];

for(i=0;i<6;i++)

{ a[i][0]=1; a[i][i]=1;}

for(i=2;i<6;i++)

for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i<6;i++)

{ for(j=0;j<=i;j++)

printf(“%4d ”,a[i][j]);

printf(“\n”);

}

}

  • 1

  • 1

  • 1 2 1

  • 3 3 1

  • 1 4 6 4 1

  • 1 5 10 10 5 1


4.4 字符数组

4.4.1 字符串与一维字符数组

  • 字符串:由若干有效字符构成且以字符‘\0‘作为结束符

  • 号的一个字符序列

  • 字符串常量:用一对双引号括起来的一串字符。

  • 定义方法与数值型数组类似:char 数组名[常量表达式];如: char a[5];

  • 元素为:a[0],a[1],…….,a[4],每一个元素的值为一个字符。


a[0]

a[1]

a[2]

a[3]

a[4]

A

B

o

y

1. 字符数组的存储结构

同数值型数组一样,系统在内存为字符数组分配若干(和数组元素个数相同)连续的存储单元,每个存储单元为一个字节。

例如:char a[5];

假设a[0]='A';a[1]=' '; a[2]='B';a[3]='o'; a[4]='y';

则数组a在内存存储示意图如下图


2.字符数组的初始化

(1) 逐个元素初始化,如:char c[10]={’h’,’a’,’p’,’p’,’y’};

说明:

  • 如果初值个数>数组长度,则作语法错误处理;

  • 如果初值个数<数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(’\0’);

  • 如果初值个数=数组长度,则在定义时可省略数组长度。


I

a

m

a

b

o

y

\0

(2) 用字符串来初始化字符数组

例如:char a[11] = {”I am a boy”};

char ch[6] = {“Hello”};

char ch[6] = “Hello”;

char ch[ ] = “Hello”;


4 4 2
4.4.2 二维字符数组

  • 一维字符数组存放一个字符串,二维字符数组可

  • 存放多个字符串。

  • char weekday[7][10]={ “sunday”,”monday”,”tuesday”,”wendnesday”,”thursday”,”friday”,”saturday”};

第二维长度不能省略,应按最长的字符串长度设定


4-7 输出如下图所示的钻石图形

#include <stdio.h>

void 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”); }

}

*

* *

* *

* *

*

  • *

  • * *

  • * *

  • * *

  • *


4.4.3 字符串的输入与输出

  • 假设有定义char a[10];

1.用格式符“%c”逐个字符输入输出:

scanf(“%c”,&a[0]);

printf(“%c”, a[0]);/*每次输入输出一个字符*/


2. 用格式符“%s”整个字符串输入输出:

用字符数组名,不要加&

输入串长度 < 数组长度

遇空格或回车结束

自动加 ‘\0’

例 用%s

main()

{ char str[5];

scanf(“%s”, str);

printf(“%s”, str);

}

用字符数组名,

遇‘\0’结束


0

1

2

3

4

h e l l o

例 main( )

{ char a[5]={‘H’,’e’,’l’,’l’,’o’};

printf(“%s”,a);

}

用“%s”输出时,遇‘\0’结束

结果:Hello#-=*……(直到偶然遇到 ‘\0’)

例 main( )

{ char a[ ] = “Hello”;

printf(“%s”,a);

}

“ ”双引号定义的字符串,末尾自动添加结尾符 ‘ \0’

结果:Hello


h e l \0 l o \0

main()

{

char a[] = {'h', 'e', 'l', '\0', 'l', 'o', '\0'};

printf("%s",a);

}

输出:hel

数组中有多个‘\0’时,

遇第一个结束


“%s”输入时,遇空格或回车键结束

C \0

P r o g \0

例如:

char s1[5],s2[5];

scanf("%s%s",s1,s2);

若输入数据:

C Prog↙

则字符数组s1和s2的存储情况如右图所示


4.4.4 字符串处理函数

字符串输入输出函数的函数原型在头文件“stdio.h”中被说明,调用该函数时,应在程序中加入文件包含命令: #include"stdio.h"

1.用字符串输入函数gets实现输入 :

  • 函数功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’

  • 调用形式:gets(字符数组);

  • 举例:char a[10];

    gets(a);

    printf(" %s" ,a);


  • 函数功能:向显示器输出字符串(输出完,换行)

  • 调用形式:puts(字符串/字符数组);

  • 应用举例: char a[10];

    gets(a);

    puts(a);

  • 2.用字符串输出函数puts实现输出


例】将字符串s1从第m个字符开始剩余的所有字符,送入字符数组s2中。

#include "stdio.h"

void main()

{int i,j,m;

char s1[80],s2[80];

printf("input a string:\n");

gets(s1);

printf("input start point:\n");

scanf("%d",&m);

i=m-1; j=0;

while(s1[i]!='\0')

{s2[j]=s1[i]; i++;j++; }

s2[j]='\0';

puts(s2);

}



3.计算字符串长度的函数strlen(字符数组)

函数功能:求出字符串或字符数组中实际字符个数

(不包括'\0')。

#include "stdio.h"

#include "string.h"

void main()

{ static char st[20]={"hello\0abce\0abc\0"};

printf("%d\n",strlen(st));

}


4 strupr
4. strupr(字符数组)

  • 函数功能:将字符串中的小写字母转换为大写字母。

5. strlwr(字符数组)

  • 函数功能:将字符串中的大写字母转换为小写字母。


6. 字符串比较函数strcmp(字符串1,字符串2)

  • 函数功能:

    从左到右逐个比较两个字符串s1、s2中各个字符(用字符的ASCII码比较),直到出现不同字符或遇到结束标记为止。


0 当串1=串2

  • 例如: strcmp(" d ", " abc ") 结果为正整数。

  • strcmp(" dog ", " door ") 结果为负整数。

负整数 当串1<串2

函数值=

正整数 当串1>串2

  • 函数应用举例:

说明:字符串比较不能用“==”,必须用strcmp


7.字符串连接函数strcat(字符数组1,字符数组2)

  • 函数功能:

    删去字符串字符数组1的结束标志'\0',将字符串或字符数组2连同末尾的结束标记一起连接到字符数组1尾部,返回连接以后的字符串。


  • 应用举例

    char a[20]="My name is ",b[10]="Li ming";

    strcat(a,b);

执行 strcat(a,b) 后a数组如下:


8. 字符串拷贝函数strcpy(字符数组1,字符数组2)

  • 函数功能:用是将字符数组2复制到字符数组1中去。返回被复制的字符串。

  • 函数说明:

  • 字符数组1长度应≥字符串或字符数组2的长度;

  • 字符数组1应写成数组名的形式;

  • 复制时连同通字符串后面的‘\0’一起复制过去。

例 char str1[20],str2[20];

str1 = {“Hello!”}; (×)

str2 = str1; (×)

strcpy( str2, str1 ); (√)

不能使用赋值语句为一个字符数组赋值


a b c d e f

h a p p y \0

h a p p y \0

g h i \0

g h i \0

  • 函数应用举例:

  • 例如: char a[10]="abcdefghi",b[]="happy";

  • strcpy(a,b);

a数组内存原始情况:

函数调用后a、b数组内存情况:


例】分析下面程序的运行结果。

#include "conio.h"

#include "string.h"

#include "stdio.h"

void main()

{ char c1[10]="abcdefghi",c2[]="china";

strcpy(c1,c2);

puts(c1);

printf("%c",c1[7]);

}


9 strcpy 1 2 n
9. strcpy(字符数组1,字符数组2,n)

  • 函数功能:用是将字符数组2中前n个字符赋值到字符数组1中去。

  • 应用举例:

    char str1[6]=“the”, str2[5]=“sell”;

    printf(“%s”,strncpy(str1,str2,2) );

    结果是:see


4-10 输入一行字符,统计其中英文字符、数字字符、空格及其他字符的个数。

#include <stdio.h>

#include <string.h>

#define Size 100

main()

{ char str[Size];

int len,i, letter=0,digit=0,space=0,other=0;

printf(“please input a string\n");

gets(str);

len=strlen(str);

for( i=0;i<len;i++)

{ if((str[i] >=‘a’ && str[i] <= ‘z’) ||

(str[i] >= ‘A’ && str[i] <= ‘Z’)) letter++;

else if(str[i] >= ‘0’ && str[i] <=‘9’) digit++;

else if(str[i] == ‘ ‘) space++;

else other++;

}

printf(”%d letters;\n%d digit \n %d space\n %d other\n ",

letter,digit,space,other);


4-11 从键盘上输入5门课程的名字,按字典顺序输出最前面的课程名字.

#include <stdio.h>

#include <string.h>

void main()

{ int i; char str[30],min[30];

printf(“please enter five courses names:\n”);

gets(str);

strcpy(min,str);

for(i=1;i<5;i++)

{gets(str);

if (strcmp(str,min)<0) strcpy(min,str);

}

printf(“the min is:”);

puts(min);

}


输入一字符串给 str

i=0 num=0 word=0

当((c=str[i])!=‘\0’)

c=空格

word==0

word=0

num=num+1

word=1

i=i+1

输出:num

例4-12 任意输入一行字符,统计其中有多少个单词。

#include <stdio.h>

main()

{ char string[100];

inti,num=0,word=0;

char c;

gets(str);

for(i = 0; (c=str [i])!=‘\0’ ; i++)

if( c = = ' ' )

word = 0;

else if(word = = 0)

{num++;

word = 1;}

printf("There are %d words \

in the line\n",num);

}


ad