6.1 一维数组的定义和引用
一维数组的定义
定义方式: 数据类型 数组名[常量表达式];
例:int a[6];
注意:[]:数组运算符是单目运算符
一维数组元素的引用
①数组必须先定义,后使用
②只能逐个引用数组元素,不能一次引用整个数组。
③数组元素表示形式: 数组名[下标]
④其中:下标可以是常量或整型表达式
#include <stdio.h>
void 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");
}
一维数组的初始化
实现的方法: 在定义数组时对数组元素赋初值。
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};
等价于: 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[5]={0,0,0,0,0}; 或int a[5]={0};
对整个数组元素赋初值时,可以不指定长度。
int a[]={1,2,3,4,5,6};
编译系统根据初值个数确定数组大小
一维数组程序举例
例 读10个整数存入数组,找出其中最大值和最小值
#include <stdio.h>
#define SIZE 10
void main()
{
int x[SIZE],i,max,min;
printf("Enter 10 integers:\n");
for(i=0;i<SIZE;i++)
{
printf("%d:",i+1);
scanf("%d",&x[i]);
}
max=min=x[0];
for(i=1;i<SIZE;i++)
{
if(max<x[i]) max=x[i];
if(min>x[i]) min=x[i];
}
printf("Maximum value is %d\n",max);
printf("Minimum value is %d\n",min);
}
例 用数组来处理求Fibonacci数列问题
#include <stdio.h>
void 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]);
}
}
例 用起泡法对5个数排序(由小到大)
排序过程:
(1)比较第一个数与第二个数,若a[0]>a[1],则交换;然后比较第二 个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止 ——第一趟起泡排序,结果最大的数被安置在最后一个元素位置上
(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
//由小到大
#include <stdio.h>
void main(){
int i,j;
int a[5]={1,2,6,4,5};
int t;
for(j=0;j<4;j++)
for(i=0;i<4-j;i++){
if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
for(i=0;i<5;i++)
printf("%d ",a[i]);
printf("\n");
}
例 用简单选择法对5个数排序
排序过程:
(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换—第一趟选择排序,结果最小的数被安置
在第一个元素 位置上
(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序
(3)重复上述过程,共经过n-1趟排序后,排序结束
例 用简单选择法对5个数排序
#include <stdio.h>
void main(){
int i,j,t,k;
int a[5]={4,5,3,2,6};
for(i=0;i<4;i++){
k=i;
for(j=i+1;j<=4;j++){
if(a[k]>a[j]){
k=j;
}
}
if(i!=k){
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
for(i=0;i<5;i++)
printf("%d ",a[i]);
printf("\n");
}
//a[0] 假如第一个是在同一个数组的所有元素中最小的值,那么k=i,那么a[0]放在第一个地方
//但是 假如第一个数与剩下的数组元素相比,大于剩下的某个数,那么k=j,j为当前与第一个数相比较大的数的索引值,
//那么此时这个当前较大的指应该继续和除了a[0]外的剩余的元素继续比较大小,若还出现当前的值相对其他数较大的情况
//继续改变k的值为当前较小的值的索引j,以此类推,求出第一轮i=1的时候,元素的最小值
//如果出现k=i,则元素不进行调换,否则就调换
6.2 二维数组的定义和引用(多维数组)
定义的一般形式
类型说明符 数组名[常量表达式][常量表达
数组元素的存放顺序
- 原因:内存是一维的
- 二维数组:按行序优先
- 多维数组:最右下标变化最快
二维数组理解
二维数组的引用
形式: 数组名[下标][下标]
- 下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量)
- 如: a[1][2] a[i][j]
- 数组元素可出现在表达式中,如:
- a[1][2]=a[2][2]/2 使用数组元素时,应注意不要超出其定义的范围;
- 如: int a[2][3]; a[2][3]=5;
思考:将二维数组行列元素 换,存到另一个数组中
#include <stdio.h>
void main()
{
int a[2][3]={
{1,2,3},{4,5,6}};
int b[3][2],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");
}
}
求二维数组中最大元素值及其行列号
#include <stdio.h>
void main()
{
int a[3][4]={
{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
int i,j,row=0,colum=0,max;
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,row=%d,colum=%d\n",max,row,colum);
}
6.3 字符数组
字符数组:存放字符数据的数组。
一维字符数组:存放一个字符串(每个数组元素存放一个字符)
二维字符数组:存放多个字符串(行数是字符串的个数)
字符数组的定义 形式:
- char 数组名[常量表达式]
- char 数组名[常量表达式][常量表达式]
- 常量表达式:整数、字符、符号常量
可以用整型数组存放字符型数据,但浪费存储空间。
字符数组的输入输出 逐个字符I/O:
%c 整个字符串I/O: %s
用字符数组名,不要加& 输入串长度<数组维数 遇空格或回车结束 自动加‘\0’
例 用%c
void main()
{
char str[5];
int i;
for(i=0;i<5;i++)
scanf("%c", &str[i]);
for(i=0;i<5;i++)
printf("%c", str[i]);
}
#include <stdio.h>
void main()
{
char a[ ]={'h','e','l','\0','l','o','\0'};
printf("%s",a);
}
//输出hel
#include <stdio.h>
void main()
{
char a[15],b[5],c[5];
scanf("%s%s%s",a,b,c);
printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);
printf("a=%s\n",a);
}
运行情况:
输入:How are you?
输出:a=How
b=are
c=you?
输入:How are you?
输出:a=How
scanf中%s输入时,遇空格或回车结束
字符串处理函数
包含在头文件 string.h 中 字符串
输出函数 puts
- 格式: puts(字符数组)
- 功能:向显示器输出一个字符串(输出完,换行)
- 说明:字符数组必须以‘\0’结束。可以包含转义字符。输出时‘\0’转换成‘\n’,即输出字符后换行。
例:
#include <stdio.h>
void main( )
{
char a1[ ]=“china\ nbeijing” ;
char a2[ ]=“china\ 0beijing” ;
puts(a1);
puts(a2);
}
运行结果:
china
beijing
china
字符串输入函数gets
- 格式:gets (字符数组)
- 功能:从键盘输入一个以回车结束的字符串放入字符数组中,并自动加‘\0’。
- 说明:输入串长度应小于字符数组维数
例:gets和scanf输入比较
#include <stdio.h>
void main( )
{
char a1[15], a2[15] ;
gets(a1);
scanf("%s",a2);
printf ("a1=%s\ n",a1);
printf ("a2=%s\ n",a2);
}
输入:china beijing
china beijing
输出:a1=china beijing
a2=china
注意:puts和gets函数只能输入输出一个字符串。
错误写法: puts(str1,str2) gets(str1,str2)
字符串连接函数strcat
- 格式:strcat (字符数组1,字符数组2)
- 功能:把字符数组2连到字符数组1后面
- 返值:返回字符数组1的首地址
- 说明:字符数组1必须足够大;连接前,两串均以‘\0’结束;连接后,串1的‘\0’取
#include <stdio.h>
void main( )
{
char str1[30]={“People’s Republic of “};
char str2[]={China”};
printf ("%s\n",strcat(str1,str2));
}
str1: People’s Republic of \0
str2: china\0
str1: People’s Republic of china\0
字符串拷贝函数strcpy
- 格式:strcpy(字符数组1,字符串2)
- 功能:将字符串2,拷贝到字符数组1中去
- 返值:返回字符数组1的首地址
- 说明:①字符数组1必须足够大,>字符串2
- ②字符数组1必须是数组名形式(str1), 字符串 2可以是字符数组名或字符串常量。
- ③拷贝时‘\0’一同拷贝
- ④不能使用赋值语句为一个字符数组赋值
- ⑤可以只复制字符串2中的前几个字符,来取 代字符数组1的前几个字符。strncpy(str1,str2,2) —— 复制前2个。
#include <stdio.h>
#include <string.h>
void main(){
char str1[10],str2[10]="he\0llo";
strncpy(str1,str2,3);
printf("%s \n",str1);
}
字符串比较函数strcmp
- 格式:strcmp(字符串1,字符串2)
- 功能:比较两个字符串
- 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止。
- 返回值:返回int型整数。其值是ASCII码的差值
a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零 说明:字符串比较不能用“==”,必须用strcmp,虽然编译无错,但结果不对
例:字符比较
#include <stdio.h>
void main( )
{
int i,j,k;
char a1[ ]="wuhan", a2[ ]="beijing" ;
i=strcmp(a1,a2);
j=strcmp("china", "korea");
k=strcmp(a2, "beijing" );
printf("i=%d\ nj=%d\ nk=%d\ n",i,j,k);
}
运行结果:
i=21 i=w-b=119-98=21
j=-8 j=c-k=99-107=-8
k=0 k=b-b=98-98=0
字符串长度函数strlen
- 格式:strlen(字符数组)
- 功能:计算字符串长度
- 返值:返回字符串实际长度,不包括‘\0’在内
例:测试字符串长度
#include <stdio.h>
void main( )
{
char a1[10]="china" ;
printf ("%d\ n",strlen(a1)); //5
printf ("%d\ n", strlen("beijing\ 0wuhan")); //7
}
- 大写字母转换成小写字母函数strlwr
- 格式:strlwr(字符串)
- 小写字母转换成大写字母函数strupr
- 格式:strupr(字符串)
例:字符转换
#include <stdio.h>
void main( )
{
char a1[6]="CHinA", a2[ ]="wuHAn" ;
printf ("%s\ n",strlwr(a1)); printf ("%s\ n",strupr(a2));
}
运行结果:china
WUHAN
例 有3个字符串,要求找出其中最大者。
#include <stdio.h>
#include <string.h>
void main()
{
char string[20],str[3][20];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nThe largest string is:\n%s\n",string);
}
例 输入一行字符,统计其中的单词个数,单词间空格分开。
#include <stdio.h>
void 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 the line\n",num);
}
精选练习题:
1.函数strcpy(str1,str2)是将字符串 str2 连接到字符串 str1之后。
A.对 B.错
2.数组在定义时可以不指定数组的长度,可根据程序中实际使用的元素个数决定。
A.对 B.错
3.在 C 语言中引用数组元素时,其数组的下标可以是任何类型的表达式。
A.对 B.错
4.若有说明:int a[3][4]={0};,则只有元素a[0][0]可得到初值0。
A.对 B.错
5.若一维数组在定义时进行了初始化,则可以省略数组长度,系统会根据初始值个数确定该数组长度。
A.对 B.错
6.可以对字符型数组进行整体输入、输出。
A.对 B.错
7.可以对实型数组进行整体输入、输出。
A.对 B.错
8.设有定义:char s[]={"E_mail"};,则执行printf("%d\n",strlen(s));后输出的值是6。
A.对 B.错
9.用 scanf 函数输入一个字符串到数组 str 中,下面正确的语句是______。
A.scanf("%s",&str); B.scanf("%c",&str[10]);
C.scanf("%s",str[10]); D.scanf("%s",str) ;
10.有字符数组 a[80]和 b[80],则正确的输出语句是______。
A.puts(a,b); B.puts(a);puts(b);
C.printf("%s,%s",a[],b[]); D.putchar(a,b);
11.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
int a[5],i;
for(i=0;i<5;i++) //0 1 2 3 4
{
a[i]=9*(i-2+4*(i>3))%5;
printf("%2d",a[i]);
}
}
//a[0]=9*(0-2+4*(0>3))%5=-3
//a[1]=9*(1-2+4*(1>3))%5=9*(1-2+4*0)%5=9*(1-2+0)%5=-9%5=-4
//a[2]=9*(2-2+4*(2>3))%5=9*(2-2+4*0)%5=9*(0+0)%5=0%5=0
//a[3]=9*(3-2+4*(3>3))%5=9*(3-2+4*0)%5=9*(3-2)%5=4
//a[4]=9*(4-2+4*(4>3))%5=9*(4-2+4*1)%5=9*(2+4)%5=54%5=4
A.-3-4 0 4 4 B.-3-4 0 4 3 C.-3-4 0 4 2 D.-3-4 0 4 0
12.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
int a[3],i,j,k;
for(i=0;i<3;i++) //0 1 2
a[i]=0; //a[3]={0,0,0};
k=2;
for(i=0;i<k;i++) //0 1
for(j=0;j<k;j++) //0 1
a[j]=a[i]+1;
printf("%d\n",a[0]);
printf("%d\n",a[1]);
printf("%d\n",a[2]);
}
//a[0]=a[0]+1=1 a[1]=a[0]+1=2
//a[0]=a[1]+1=3 a[1]=a[1]+1=3
A.0 B.1 C.2 D.3
13.下面程序的运行结果是______。
#include <stdio.h>
main()
{ char c[5]={'a','b','\0','c','\0'};
printf("%s",c); }
A.'a' 'b' B.ab C.ab c D.ab\0c\0
14.下面程序的运行结果是______。
#include <stdio.h>
main()
{ char s[12]= "a book!";
printf("%d",strlen(s)); }
A.6 B.7 C.10 D.12
15.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式是______。(假设a[0][0]位于数组的第一个位置上。)
A.i*m+j B.j*m+i C.i*m+j-1 D.i*m+j+1
16.下面程序的运行结果是______。
#include <stdio.h>
#include <string.h>
main()
{ char a[7]="abcdef",b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]); }
A.空格 B.\0 C.f D.不确定
17.下面程序的运行结果是______。
#include <stdio.h>
#include <string.h>
void main()
{
char a[30];
strcpy(&a[0],"ch");
printf("%s \n",a);
strcpy(&a[1],"def");
printf("%s \n",a);
strcpy(&a[2],"abc");
printf("%s\n",a);
//system("pause");
}
//ch
//cdef
//cdabc
A.chdefabc B.cda C.cdabc D.abcdef
18.设有定义:char a[80];int i=0;,以下不能将一行带有空格的字符串(不超过80个字符)正确读入的是______。
A.gets(a);
B.while(( a[i++]=getchar())!='\n'); a[i]='\0';
C.scanf("%s",a);
D.do{scanf("%c",&a[i]); }while(a[i++]!='\n'); a[i]='\0';
19.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
char str[]="SSSWLIA",c;
int k;
for(k=2;(c=str[k])!='\0';k++)
{
switch(c)
{
case 'I':++k;break;
case 'L':continue;
default:putchar(c);continue;
}
putchar('*');
}
printf("%d \n",k);
}
//k=2 c=str[2]!='\0' c='S' putchar:S
//k=3 c=str[3]!='\0' c='W' putchar:W
//k=4 c=str[4]!='\0' c='L'
//k=5 c=str[5]!='\0' c='I' k=6 putchar:*
//k=7 c=str[7]=='\0' 退出循环
A.SSW* B.SW* C.SW*A D.SWA*
20.设char s[10]= "abcd",t[]="12345";,则s和t在内存中分配的字节数分别是______。
A. 6和5 B. 6和6 C. 10和5 D. 10和6
21.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
char a[]="Hello World";
int i,j;
for(i=j=0; a[i]!='\0';i++)
if(a[i]!='l')// H e
a[j++]=a[i];//a[0]=a[0]=H a[1]=a[1]=e ...Heo Word
a[j]='\0';
puts(a);
}
A.Hello World B.Heo World
C.Heo Word D.没有任何输出内容
22.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
char str1[]="abcd",str2[]="abcef";
int i,s;
i=0;
while((str1[i]==str2[i])&&(str1[i]!='\0')) //a b c
i++;//i=4
s=str1[i]-str2[i];//'e'-'d'=-1
printf("%d\n",s);
}
A.-1 B.0 C.1 D.不确定
23.下面程序的运行结果是______。
#include
main()
{ char s[]="012xy";
int i,n=0;
for(i=0;s[i]!=0;i++)
if(s[i]>= 'a'&&s[i]<= 'z') n++;
printf("%d\n",n); }
A.0 B.2 C.3 D.5
#include <stdio.h>
void main()
{
char s[]="012xy";
int i,n=0;
for(i=0;s[i]!=0;i++)//s[i]!=0,这里的不等于0,是不等于数字0
if(s[i]>='a'&&s[i]<='z')
n++;
printf("%d\n",n);
}
#include <stdio.h>
void main()
{
char s[]="012xy";
int i,n=0;
for(i=0;s[i]!='0';i++)//s[i]!=0,这里的不等于0,是不等于字符0
if(s[i]>='a'&&s[i]<='z')
n++;
printf("%d\n",n);
}
24.下面程序的运行结果是______。
#include <stdio.h>
void main()
{
int a[]={2,3,5,4},i;
for(i=0;i<4;i++) //0 1 2 3
switch(i%2)//0 1 0 1 当i%2==1的时候 i=1,3 当i%2==0的时候 i=0,2
{
case 0:
switch(a[i]%2)//a[0]%2=2%2=0,a[2]%2=5%2=1
{
case 0:a[i]++;break;//a[0]=3
case 1:a[i]--;//a[2]=4
}
break;
}
for(i=0;i<4;i++)
printf("%2d",a[i]); //3 3 4 4
printf("\n");
}
A.3 3 4 4 B.2 0 5 0 C.3 0 4 0 D.0 3 0 4
25.下面程序的运行结果是______。
#include <stdio.h>
#include <string.h>
void main()
{
char a[10]="abcd";
printf("%d,%d\n",strlen(a),sizeof(a)); //4,10
}
A.7,4 B.4,10 C.8,8 D.10,10
26.下面程序的运行结果是______。
#include <stdio.h>
#define MAX 10
void main()
{
int i,sum,a[]={1,2,3,4,5,6,7,8,9,10};
sum=1;
for(i=0;i<MAX;i++)
sum-=a[i];
printf("%d",sum);
}
//sum=1-10(1+10)/2=1-55=-54
A.55 B.-54 C.-55 D.54
本文笔记来自C程序设计谭浩强PPT,我是热爱学习的呵呵哒!
如果您觉得写得不错,点个赞呀~