第八章 数组

1. 数组定义与引用
#include <stdio.h>
#include <stdlib.h>
#define studentsnumber 5 //定义宏不需要添加分号,但是如果调用return语句,则需要加分号
// define hong return(2.0*3)
//*******************************************************************************************************************************
    //1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
    //2) 数组名的书写规则应符合标识符的书写规定。
    //3) 数组名不能与其它变量名相同。 
    //4)方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
    //5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
    //#define fd 5
    //int a[3+2],b[7+fd]; 是合法的。但是下述说明方式是错误的。
    //int n=5;
    //int a[n];
    //6)允许在同一个类型说明中,说明多个数组和多个变量。例如:int a,b,k[10] 
    //7)数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量: 
    //8)类型说明符 数组名[常量表达式] = { 值, 值……值 };
    //int main()
    //{  
    //  int i;
    //  int student_age[studentsnumber];
    //  for ( i = 0; i < studentsnumber; i++)
    //  {
    //      printf("输入年龄%d", i);
    //      scanf("%d",&student_age[i]);
    //  }
    //  for ( i = 0; i < studentsnumber; i++)
    //  {
    //      printf("%d\t",student_age[i]);
    //  }
    //  system("pause");
    //  return 0;
    //}
 
    //#include <stdio.h>
    ////int a[5]={1,2,3,4,5}, 一维数组的静态赋值
    //int main(void)
    //{   
    //  int i,max,a[3];     
    //  printf("input 3 numbers:\n");   
    //  for(i=0;i<3;i++)       
    //      scanf("%d",&a[i]);   //一维数组的动态赋值
    //  max=a[0];    
    //  for(i=1;i<3;i++)      
    //      if(a[i]>max) 
    //          max=a[i];  
    //  printf("maxmum=%d\n",max);   
    //
    //  system("pause");
    //  return 0;
    //}
 
    ////输入10个数从大到小排列
    //int main(void)
    //{   
    //  int i,j,s,a[10];   
    //printf("\n input 10 numbers:\n");   
    ////输入10个元素的初值
    //for(i=0;i<10;i++)      
    //  scanf("%d",&a[i]);   
    ////用于排序
    //for(i=0;i<10;i++)
    //{     
    //     
    //for(j=i+1;j<10;j++)          
    //  if(a[i]<a[j])
    //  {                
    //      s=a[i];
    //      a[i]=a[j]; 
    //      a[j]=s;
    //    }    
    //  printf("%d\t",a[i]);    
    //}  
    //  system("pause");
    //  return 0;
    //}
 
    //*********************************************************************************************************************************
    //二维数组定义的一般形式是:类型说明符 数组名[常量表达式1][常量表达式2]
    //在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。
    //每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。
    //int main(void)
    //{    
    //  int i,j,s=0,a[3][5]; 
    //  double v[3],average;
    //  printf("input score\n"); 
    //  for(i=0;i<3;i++) //三科
    //  {      
    //      for(j=0;j<5;j++) //五名同学
    //      {          
    //          scanf("%d",&a[i][j]);        
    //          s=s+a[i][j];     
    //      }      
    //      v[i]=s/5;   
    //      s=0;   
    //  }  
    //  average =(v[0]+v[1]+v[2])/3;  
    //  printf("math:%.2f\nc languag:%.2f\ndbase:%.2f\n",v[0],v[1],v[2]);   
    //  printf("total:%.2f\n", average );  
    //  system("pause");
    //  return 0;
    //}
 
 
    //例如对数组a[5][3]: 
    //按行分段赋值可写为: 
    //int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };按行连续赋值可写为: 
    //int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};这两种赋初值的结果是完全相同的。
    //1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:
    //2) 如对全部元素赋初值,则第一维的长度可以不给出。int a[][3]={1,2,3,4,5,6,7,8,9};
 
    //**********************************************************************************************************************************************************
    //字符数组的定义,形式与前面介绍的数值数组相同。例如:  char c[10];由于字符型和整型通用,也可以定义为int c[10],但这时每个数组元素占2个字节的内存单元。
    //其中c[9]未赋值,由的值为‘p’系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如:
    //    char c[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };
    //int main(void)
    //{  
    //  int i,j;  
    //  char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};  
    //  for(i=0;i<=1;i++)
    //  {        
    //      for(j=0;j<=4;j++)        
    //  printf("%c",a[i][j]);      
    //      printf("\n");   
    //  }   
    //  system("pause");
    //  return 0;
    //}
    //char c[]="C program";
 
    //用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:
    //C语言允许用字符串的方式对数组作初始化赋值。例如:
    //    char c[]={'c', ' ','p','r','o','g','r','a','m'};
    //可写为:
    //    char c[]={"C program"};
    //或去掉{}写为:
    //    char c[]="C program";
 
    //‘\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
    //在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
 
    //int main(void)
    //{    
    //  char c[]="BASIC\ndBASE";   
    //  printf("%s\n",c);   
    //  system("pause");
    //  return 0;
    //}
    //注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf("%s",c[]);
    //应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
//  int main(void)
//{    
//  char st1[6],st2[6],st3[6],st4[6];   
//  printf("input string:");   
//  scanf("%s%s%s%s",st1,st2,st3,st4); 
//  printf("your string: %s %s %s %s\n",st1,st2,st3,st4); 
//  system("pause");
//  return 0;
//}
//本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,
//scanf的各输入项必须以地址方式出现,如 &a、&b 等。但在前例中却是以数组名方式出现的,这是为什么呢?
//这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。
//设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。
//如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c) 时,按数组名c找到首地址,
//然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。 
 
//*****************************************************************************************************************************************
    //c语言常用字符串处理函数(用于输入输出的字符串函数,在使用前应包含头文件"stdio.h,使用其它字符串函数则应包含头文件"string.h"。)
    /*1. 字符串输出函数 puts
    格式:  puts(字符数组名)
    功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。*/
//#include"stdio.h"
//  main()
//{    
//  char c[]="BASIC\ndBASE";   
//  puts(c);
//}
 
//2. 字符串输入函数 gets
//格式:  gets (字符数组名)
//功能:从标准输入设备键盘上输入一个字符串。
//int main()
//{    
//  char st[15];  
//  printf("input string:\n");   
//  gets(st);    
//  puts(st);
//  system("pause");
//    return 0;
//}
//可以看出当输入的字符串中含有空格时,输出仍为全部字符串。
//说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的
 
 //3.字符串连接函数 strcat;
//格式:  strcat(字符数组名1,字符数组名2)
//功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
#include"string.h"
main()
{   
    static char st1[30]="My name is ";   
    char st2[10];   
    printf("input your name:\n");   
    gets(st2);  
    strcat(st1,st2);  
    puts(st1);
    system("pause");
}
//要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。 
 
//4. 字符串拷贝函数strcpy
//格式:  strcpy(字符数组名1,字符数组名2)
//功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,
//也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
#include"string.h"
main(){   
    char st1[15],st2[]="C Language";    
    strcpy(st1,st2);   
    puts(st1);
    printf("\n");
}
 
//5.0 字符串比较函数strcmp
//格式:  strcmp(字符数组名1,字符数组名2)
//功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
//    字符串1=字符串2,返回值=0;
//    字符串2〉字符串2,返回值〉0;
//    字符串1〈字符串2,返回值〈0。
 
//6.0 测字符串长度函数strlen
//格式:  strlen(字符数组名)
//功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。
#include"string.h"
main(){   
    int k;    
    static char st[]="C language";   
    k=strlen(st);    
    printf("The lenth of the string is %d\n",k);
}
2. 1个例子
将一个数字插入一个数组,并按照从大到小的顺序排列
#include <stdio.h>
#include <stdlib.h>
 
int main()
{  
    int i,j,k,s,n,m,a[11]={127,3,6,28,54,68,87,105,162,18}; 
    for ( i = 0; i < 10; i++)
    {
        for (j = i+1; j < 10; j++)
        {
            if (a[i]<a[j])
          {
              s=a[i];
              a[i]=a[j];  
              a[j]=s;
             }
        }
        printf("%d ",a[i]); 
    }
    printf ("input a number");
    scanf("%d",&n);
    for ( k = 0; k < 10;k++)
    {
        if (n>a[k])
        {
           for (m =9; m >= k; m--)
            {
                a[m+1]=a[m];
            }  
            a[k]=n;
            break;
        }
    }
        for ( i = 0; i < 11; i++)
        {
            printf("%d ",a[i]); 
        }
    system("pause");
    return 0;
}


 

Updated: 2014-11-28 — am11:32

Leave a Reply

  Subscribe  
Notify of