C语言学习笔记---数组
最近用到程序发现以前自己的C语言学得很不扎实,逻辑也很混乱。
于是决定从数组开始自己手把手打程序,把基础知识补一补。
纯粹记录自己的程序和注意点,不写概念。
1.1.1二维数组练习
1【示例】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int a[5][3];
int v[3];
int sum=0;
int average;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("Please input the No.%d number:",j+1);
scanf("%d",&a[i][j]);
sum+=a[i][j];
}
v[i]=sum/5;
if(i==0)
{
printf("The Math sum is: %d\n",sum);
printf("The Math average is: %d\n",sum/5);
}
if(i==1)
{
printf("The C sum is: %d\n",sum);
printf("The C average is: %d\n",sum/5);
}
if(i==2)
{
printf("The English sum is: %d\n",sum);
printf("The v average is: %d\n",sum/5);
}
sum=0;
}
average=v[0]+v[1]+v[2];
printf("The average number is: %d " ,average);
printf("Math:%d,C:%d,English:%d",v[0],v[1],v[2]);
}
二维数组可以看作是由一维数组嵌套而成的,把一维数组的每个元素看作一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。
如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]。
对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0], a[0][1], a[0][2], a[0][3]。必须强调的是,a[0], a[1], a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量
1.1.2 对无序数组进行查询
让用户输入一个数字,判断该数字是否在数组中,如果在,就打印出下标。
#include <stdio.h>
int main()
{
int num,i;
int temp=-1;
int numbers[10]={1,26,23,25,43,8,96,48,5,66};
printf("Please input a number:");
scanf("%d",&num);
for(i=0;i<10;i++)
{
if(num==numbers[i])
{
temp=i;
break;
}
}
if(temp<0)
{
printf("The number is not in the array!");
}
else
{
printf("%d is in the array, and it's subscript is %d.\n", num,temp);
}
return 0;
}
1.1.4有序数组查询
有序数组就不需要重复查询了,只要设置一定的限制就可以认为不在了。
有一个长度为10的整型数组,它所包含的元素按照从小到大的顺序(升序)排列,假设比较到第4个元素时发现它的值大于输入的数字,那么剩下的5个元素就没必要再比较了,肯定也大于输入的数字,这样就减少了循环的次数,提高了执行效率。
#include<stdio.h>
int main()
{
int array[10]={23,24,56,78,99,105,120,114,365,1024};
int i,num,temp=-1;
printf("Please input a number :");
scanf("%d",&num);
for(i=0;i<10;i++)
{
if(array[i]>=num) //如果数组array[i]>=num 才会执行
{
if (array[i]==num)
{
temp=i; //跟数组中的数值相等则直接赋值
}
break; //如果数组中的值大于这个数,那么num肯定不在这个数列中
}
}
if(temp<0)
printf("The number is not in the array!");
else
{
printf("%d is in the array, and it's subscript is %d.\n", num, temp);
}
return 0;
}
需要注意的是,用字符串给字符数组赋值时由于要添加结束符 ‘\0’,数组的长度要比字符串的长度(字符串长度不包括 ‘\0’)大1。例如:
char str[] = "C program";
1.1.5 字符串长度函数strlen
#include<stdio.h>
#include<string.h> //要对字符串进行操作要加入这个头文件
int main()
{
char str[]="C Program";//平常开发这样赋字符串比较常见
int len;
len=strlen(str);
printf("The array len is %d\n",len);
}
需要说明的是,strlen 会从字符串的第 0 个字符开始计算,直到遇到字符串结束标志 ‘\0’。
1.1.6字符串连接函数 strcat
#include<stdio.h>
#include<string.h> //要对字符串进行操作要加入这个头文件
int main()
{
char str[]="C Program";//平常开发这样赋字符串比较常见
int len;
len=strlen(str);
printf("The array len is %d\n",len);
char str1[40]="My name is : " ;
char str2[20];
printf("Please input your name :");
gets(name);
strcat(str1,str2);
puts(str1);
return 0;
}
strcat 将把 str2连接到 str1后面,并删去 str1最后的结束标志 ‘\0’。这就意味着,str1 的长度要足够,必须能够同时容纳 str1和str2,否则会越界。
1.1.7字符串复制函数strcpy
1.1.8字符串比较函数strcmp
strcmp 是 string compare 的缩写,意思是字符串比较,语法格式为:
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
#include <stdio.h>
#include <string.h>
int main(){
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b));
printf("strcmp(a, c) : %d\n", strcmp(a, c));
printf("strcmp(a, d) : %d\n", strcmp(a, d));
return 0;
}
strcmp(a, b) : 1
strcmp(a, c) : -1
strcmp(a, d) : 0
1.1.9 数组越界
数组越界
C语言数组不会自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存。如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,就会发生上限越界(Off Normal Upper)。
越界访问的数组元素都是垃圾值,没有实际的含义,因为数组之外的内存我们并不知道是什么,可能是其他变量的值,可能是附加数据,可能是一个地址,这些都是不可控的。
由于C语言的”放任“,我们访问数组时必须非常小心,要确保不会发生越界。
1.1.10 构造可变长的数组
#include<stdio.h>
int main()
{
int n;
printf("Please input a number of string length: ");
scanf("%d",&n);
fflush(stdin);//清空缓存区
char str[n];
printf("Input String : ");
gets(str);
puts(str);
return 0;
}
数组的总结
对数组的总结
1) 数组的定义格式为:
type arrayname[length];
type 为数据类型,arrayName 为数组名,length 为数组长度。
2)访问数组的格式
arrayName[index]
index 为数组下标。注意 index 的值必须大于等于零,并且小于数组长度,否则会发生数组越界,出现意想不到的错误。
3)关于排序和查找
学完了数组,有两个重要的知识点要求大家掌握,那就是排序(Sort)和查找(Search),比如:
给你 10 个打乱顺序的整数,要能够按照从小到大或者从大到小的顺序输出;
给定一个字符串 str1,以及一个子串 str2,要能够判断 str2 是否在 str1 中。
排序和查找的方法有很多种,我们把它们设置成了单独的一章进行讲解.