轻松学习C语言 第六章

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  二维数组的定义和引用(多维数组)

定义的一般形式

类型说明符  数组名[常量表达式][常量表达

数组元素的存放顺序

  1. 原因:内存是一维的
  2. 二维数组:按行序优先
  3. 多维数组:最右下标变化最快

二维数组理解

二维数组的引用

形式: 数组名[下标][下标]

  • 下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量)
  • 如: 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  字符数组

字符数组:存放字符数据的数组。

一维字符数组:存放一个字符串(每个数组元素存放一个字符)

二维字符数组:存放多个字符串(行数是字符串的个数)

字符数组的定义 形式:

  1. char  数组名[常量表达式]
  2. char  数组名[常量表达式][常量表达式]
  3. 常量表达式:整数、字符、符号常量

可以用整型数组存放字符型数据,但浪费存储空间。

字符数组的输入输出 逐个字符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

  1. 格式:gets (字符数组)
  2. 功能:从键盘输入一个以回车结束的字符串放入字符数组中,并自动加‘\0’。
  3. 说明:输入串长度应小于字符数组维数
例: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

  1. 格式:strcat (字符数组1,字符数组2)
  2. 功能:把字符数组2连到字符数组1后面
  3. 返值:返回字符数组1的首地址
  4. 说明:字符数组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

  1. 格式:strcmp(字符串1,字符串2)
  2. 功能:比较两个字符串
  3. 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止
  4. 返回值:返回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

  1. 格式:strlen(字符数组)
  2. 功能:计算字符串长度
  3. 返值:返回字符串实际长度,不包括‘\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,我是热爱学习的呵呵哒!

如果您觉得写得不错,点个赞呀~

猜你喜欢

转载自blog.csdn.net/weixin_41987016/article/details/105840375