c语言学习笔记以及例程·——数组篇

 
  
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式存放起来,这些按照有序排列的同类数据元素的集合称为数组,有序指的是在内存中的存储位置有序,数组中的每一个数据称为数组元素,下标变量为数组元素得标示符。
1.一维数组

  一维数组的定义方式(先定义后使用)

    注意:

   1) 类型说明符是任意一种基本数据类型或者是构造类型,对于同一数组,对所有元素的类型
  都是相同的;
    2) 数组名是用户定义的数组标识符,书写规则满足标识符的规定;
    3) 方括号里面的常量表达式表示数据元素的个数,也称为数组长度;
    4) 允许在同一个类型说明符中,说明多个数组和多个变量
int a,b[10], c[10],d,e,f[30];
    5) int a[10] 表示a数组有10个元素,下标从0开始,到9结束,没有a[10] 这个变量;
    6) 除了初始化以外,不能对一个数组进行整体的输入和输出;
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //正确
int b[10];
b[10] = {1,2,3,4,5,6,7,8,9,10}; //错误
for(i = 1;i <= 10;i++)
a[i-1] = i;
一维数组的引用
数组名[常量或者常量表达式]
a[0] a[1] a[2]
一维数组的初始化
定义数组时对数组进行初始化
int a[10] = {1,2,3,4,5,6,7,8,9,10};
可以只对一部分元素赋初值,后面的元素自动填充为0;
int a[10] = {1,2,3,4,5};// a[5] - a[9] 的值都是0;
如果想将一个数组的全部元素都给0;
1) int a[10] = {0};
2) memset 
  #include

函数原型:void *memset(void *s, int c, size_t n);(向数组s写入个大小为size_t字节的数据c)

memset(a,0,100*sizeof(int))
3) NAME
  bzero - 向字符串写入零
  #include
函数原型:   void bzero(void *s, size_t n);(把 字符串 s 的 前 n 个 字节 置成 零.)
描述 (DESCRIPTION)
  bzero() 函数 把 字符串 s 的 前 n 个 字节 置成 零.
int b[50];
bzero(b,50*sizeof(int));
例程:
int main(int argc,char *argv[])
{
//int a[10] = {0};
int a[10];
//memset(a,0,sizeof(int)*10);
bzero(a,40);
int i;
for(i = 0;i <= 9;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
对全部元素赋初值时,可以不指定数组长度:int a[] = {1,2,3,4,5};
初始化赋初值的一般形式为:类型说明符 数组名[常量表达式] = {值1,值2,值3,……}--->int a[10] = {1,3,5,7,9};
eg1:输出一个数组中最大的值
例程:
int main(int argc,char *argv[])
{
int a[10];
int i;
for(i = 0;i <= 9;i++)
scanf("%d",&a[i]);
int max = a[0];
for(i = 1;i < 10;i++)
{
if(a[i] > max)
max = a[i];
}
printf("max = %d\n",max);
return 0;
}
数组越界的问题 !!!(出现 段错误的其中一种原因)
我们通过数组的下标来得到数组内指定索引的元素,这称为对数组的访问。如果一个数组定义为n个元素,那么,对这 n个元素(下标为0-n-1的元素) 的访问都是合法的,如果对这n个元素之外的访问就是非法的,称为为数组越界。这可能造成 段错误(C语言中难以查找错误的一中情况,所以一定记住段错误的几个原因依次去排查,否则很难找出问题)
冒泡排序(起泡法) 对10个数,进行从小到大排序
1) 比较相邻的前后两个数据,如果前面的数据大于后面的数据,就将将两个数据交换;
2) 这样对数组的第一个元素到第n个元素进行一次遍历后,最大的一个就沉底了;

改进:
1) 每一趟排序以后都有一个数字的位置已经确定了,那么下一趟比较的时候就不用再比较这个位置的
数字了。比如第一趟做完以后,最大的数字已经在最后一个位置上了,第二趟比较的时候肯定不会
和这个数字进行交换,所以只要比较到倒数第二个位置就可以了;
2) 如果本次循环一次交换都没有做,那么下一次循环就不需要再进行了
例程:
int main(int argc,char *argv[])
{
int a[10] = {1,0,2,9,3,8,4,7,5,6};
int i,j,tmp;
int flag;
for(i = 0;i < 9;i++)
{
flag = 1;
for(j = 0;j < 9 - i;j++)
{
if(a[j] > a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 0;
}
}
printf("%d\n",a[i]);
if(flag == 1)
break;
}
for(i = 0;i < 10;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
该例程为改进之后的程序。
二分法插入排序(是在数组本身是有序的前提下进行)
例程:
int main(int argc,char *argv[])
{
int a[10] = {1,0,2,9,3,8,4,7,5,6};
int i,j,tmp;
int flag;
for(i = 0;i < 9;i++)
{
flag = 1;
for(j = 0;j < 9 - i;j++)
{
if(a[j] > a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 0;
}
}
if(flag == 1)
break;
}
int left = 0;
int right = 9;
int mid,x;
scanf("%d",&x);
while(left <= right)
{
mid = (left + right) / 2;
if(x > a[mid])
left = mid + 1;
else if(x < a[mid])
right = mid - 1;
else
break;
}
return 0;

}

改例程是先使用冒泡法排序后再进行二分法插入排序。

----------------------------------------------
2.二维数组
二维数组的定义和引用
类型说明符 数组名[常量表达式][常量表达式]:int a[3][4];
下标变化范围为 a[0][0] - a[2][3];
二维数组的初始化
1) 分行给二维数组赋初值: int a[2][3] = {{1,2,3},{3,4,5}};
2) 将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值:  int a[2][3] = {1,2,3,3,4,5};
3) 对部分元素赋初值:
int a[3][4] = {1,2,3,4,5,6};
int a[3][4] = {{1,2},{3,4}};
4) 如果对全部元素赋初值,则定义数组对第一维的长度可以不指定,但是第二维不能省略;
int a[][4] = {1,2,3,4,5};
----------------------------------------------

3.字符数组

        char 数组名[常量表达式]:char a[20];

对字符数组进行初始化,可逐个字符进行赋值:char string[5] = {'h','e','l','l','o'};

如果初值个数小于数组长度,则只将这些字符赋给前面的n个字符,后面的元素自动填充为'\0';

char string[30] = {'h','e','l','l','o'};

如果提供的初值个数和预定的数组长度相等,那么定义时可以省略数组长度,系统会自动根据初值个数进行确定 char string[] = {'h','e','l','l','o'}; char string[] = "hello"; 如果是输入输出字符 %c 如果输入输出字符串 %s(遇到'\0'就停止输出)
---------------------------------------------
4.字符串的基本操作(字符串函数的简单操作,不作例程)
gets //字符串的输入
puts //字符串的输出
字符串连接:
       #include 包含的头文件;
       char *strcat(char *dest, const char *src);
将src的内容连接到dest后面去,同时返回dest的地址
       char *strncat(char *dest, const char *src, size_t n);
将src的前n个字节的内容连接到dest后面去,同时返回dest的地址
字符串复制:
       char *strcpy(char *dest, const char *src);
将src的内容复制到dest去
       char *strncpy(char *dest, const char *src, size_t n);
将src的前n个字节的内容复制到dest去
要求:用来接受字符串内容的数组必须保证能存放的下!!!
计算字符串长度函数:
       #include
       size_t strlen(const char *s);
求字符串s里面从第一元素开始到第一个'\0'之间有多少个字符(strlen的使用)
比较字符串:
       #include
       int strcmp(const char *s1, const char *s2);
s1 > s2  返回结果为大于0的正数
s1 < s2  返回结果为小于0的负数
s1 == s2 返回结果为0
       int strncmp(const char *s1, const char *s2, size_t n);
只比较两个字符串的前n个字符

你可能感兴趣的:(C语言基础)