目录
一维数组
定义和引用及初始化
举个栗子
二维数组
定义引用和初始化
举个栗子
字符数组
输入输出
应用:输入一串字符串,统计其中有多少个单词
一维数组
定义和引用及初始化
#include
#define N 3
int main()
{
int a = 0,b = 0,c = 0;
int grp1[N]; //数组的个数只能是常量,也就是说不能直接用int,float类型的变量来定义个数,当然也可以直接写正整数;
int grp2[3];
int grp3[3] = {1,2,3}; //数组内可以初始化<=数组个数的数据,数据个数不足数组元素最大个数时,系统自动补0
int grp4[3] = {1,2}; //等价于grp4 = {1,2,0};
//grp1,grp2初始化
grp1[N] = {1,2,3};
grp2[0] = 1;
grp2[1] = 2;
grp2[2] = 3;
//一维数组的引用
a = grp4[0];b = grp4[1];c = grp4[2]; //分别引用数组grp4中的第1,2,3个元素
//同时,数组中的元素存放的地址连续,grp4[0]是数组中的第一个元素,同时,该元素的地址也是该数组的地址
printf("grp4[0] = %dn*grp4 = %dn" , grp4[0] , *grp4);
printf("grp4[1] = %dn*(grp4+1) = %dn" , grp4[1] , *(grp4+1));
//以上两个输出内容一致
//新学习的同学特别注意数组的第一个元素是从下标0开始
return 0;
}
举个栗子
第一个例子是冒泡法排序,我使用了指针做函数参数来进行求解,因为昨天复习了一下指针,所以顺便拿来练练手
冒泡法虽然时间复杂度是O(n^2),但是这玩意挺多地方要用到的,也是容易理解的一个排序方法,所以初学的同学可以多看看课本里引用的例题,课本上好懂一点
#include
void sort(int* ,int);
void sort(int *p , int num)
{
//小->大
int i = 0 ,j = 0, temp = 0;
for(;i < (num - 1);i++)
{
for(j = 0;j < num - 1 - i;j++)
{
if(*(p+j+1) < *(p+j))
{
temp = *(p+j+1);
*(p+j+1) = *(p+j);
*(p+j) = temp;
}
}
}
}
int main()
{
//冒泡法排序
int arr[10] ,i;
printf("Please Enter 10 Numbers:n");
for(i = 0;i < 10 ;i++)
{
scanf("%d",arr+i);
}
sort(arr , 10);
for(i = 0;i < 10;i++)
{
printf("%d " , arr[i]);
}
return 0;
}
#include#define N 3 int main() { int a = 0,b = 0,c = 0; int grp1[N]; //数组的个数只能是常量,也就是说不能直接用int,float类型的变量来定义个数,当然也可以直接写正整数; int grp2[3]; int grp3[3] = {1,2,3}; //数组内可以初始化<=数组个数的数据,数据个数不足数组元素最大个数时,系统自动补0 int grp4[3] = {1,2}; //等价于grp4 = {1,2,0}; //grp1,grp2初始化 grp1[N] = {1,2,3}; grp2[0] = 1; grp2[1] = 2; grp2[2] = 3; //一维数组的引用 a = grp4[0];b = grp4[1];c = grp4[2]; //分别引用数组grp4中的第1,2,3个元素 //同时,数组中的元素存放的地址连续,grp4[0]是数组中的第一个元素,同时,该元素的地址也是该数组的地址 printf("grp4[0] = %dn*grp4 = %dn" , grp4[0] , *grp4); printf("grp4[1] = %dn*(grp4+1) = %dn" , grp4[1] , *(grp4+1)); //以上两个输出内容一致 //新学习的同学特别注意数组的第一个元素是从下标0开始 return 0; }
举个栗子
第一个例子是冒泡法排序,我使用了指针做函数参数来进行求解,因为昨天复习了一下指针,所以顺便拿来练练手
冒泡法虽然时间复杂度是O(n^2),但是这玩意挺多地方要用到的,也是容易理解的一个排序方法,所以初学的同学可以多看看课本里引用的例题,课本上好懂一点
#include
void sort(int* ,int);
void sort(int *p , int num)
{
//小->大
int i = 0 ,j = 0, temp = 0;
for(;i < (num - 1);i++)
{
for(j = 0;j < num - 1 - i;j++)
{
if(*(p+j+1) < *(p+j))
{
temp = *(p+j+1);
*(p+j+1) = *(p+j);
*(p+j) = temp;
}
}
}
}
int main()
{
//冒泡法排序
int arr[10] ,i;
printf("Please Enter 10 Numbers:n");
for(i = 0;i < 10 ;i++)
{
scanf("%d",arr+i);
}
sort(arr , 10);
for(i = 0;i < 10;i++)
{
printf("%d " , arr[i]);
}
return 0;
}
第一个例子是冒泡法排序,我使用了指针做函数参数来进行求解,因为昨天复习了一下指针,所以顺便拿来练练手
冒泡法虽然时间复杂度是O(n^2),但是这玩意挺多地方要用到的,也是容易理解的一个排序方法,所以初学的同学可以多看看课本里引用的例题,课本上好懂一点
这是运行结果
二维数组
定义引用和初始化
#include
int main()
{
//二维数组
int arr1[3][4]; //可以认为这是定义了一个3*4的矩阵,也可以看成是由3个数组大小为4的数组构成的一个新的数组
//同一维数组,二维数组的元素内存也是连续的
//arr1[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 这样定义是有问题的,因为此时编译器认为你要做的是给第四行第五列这个元素赋值,然而这个范围已经越界(3*4)了
int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//当要一次性初始化全部元素时,可以写成 int arr2[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
return 0;
}
举个栗子
#include举个栗子int main() { //二维数组 int arr1[3][4]; //可以认为这是定义了一个3*4的矩阵,也可以看成是由3个数组大小为4的数组构成的一个新的数组 //同一维数组,二维数组的元素内存也是连续的 //arr1[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 这样定义是有问题的,因为此时编译器认为你要做的是给第四行第五列这个元素赋值,然而这个范围已经越界(3*4)了 int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //当要一次性初始化全部元素时,可以写成 int arr2[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; return 0; }
将二维数组以矩阵形式打印(直观,打印图形的话也美观点)
#includeint main() { int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}}; int i = 0,j = 0; for(i = 0;i < 3;i++) { for(j = 0;j < 4;j++) { printf("%dt",arr[i][j]); } printf("n"); } return 0; }
打擂台算法求最大值
数组里的哪个数最大就是大Boss
#includeint main() { int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}}; int h = 0,l = 0, max = 0; int i = 0,j = 0; max = arr[0][0]; for(i = 0;i < 3;i++) { for(j = 0;j < 4;j++) { if(arr[i][j] > max) { max = arr[i][j]; h = i; l = j; } } } printf("max = %dnhang = %dnlie = %d" ,max,h+1,l+1); return 0; }
字符数组
C语言里面没有字符串类型的数据,所以字符串一般存放在字符数组中
//因为这个例子比较难敲,我就不敲定义引用和初始化了,书上讲的很详细
要注意的点就是' '
当定义的字符数用双引号定义时,系统自动在最后一个位置加字符串结束标志' '
比如char chr1[] = {"I am handsome!"};共有14个字符,实际上这个数组的大小为15
相比较char chr2 = {'I',' ','a','m',' ','h','a','n','d','s','o','m','e','!'};chr2数组大小为14
C语言里面没有字符串类型的数据,所以字符串一般存放在字符数组中
//因为这个例子比较难敲,我就不敲定义引用和初始化了,书上讲的很详细
要注意的点就是' '
当定义的字符数用双引号定义时,系统自动在最后一个位置加字符串结束标志' '
比如char chr1[] = {"I am handsome!"};共有14个字符,实际上这个数组的大小为15
相比较char chr2 = {'I',' ','a','m',' ','h','a','n','d','s','o','m','e','!'};chr2数组大小为14
输入输出
scanf("%s",str); //注意这里是数组名,不用取址符号&(其实str本身就是一个地址,数组第一个元素的地址)
//吐槽一下当时学数组时老师讲到指针我以为是钟表上面转的指针(好sb啊当时)
printf("%s",str); //注意·这里也是使用的数组名,而不是引用的单个数组元素
//printf() 输出直到遇见' 结束'
引用string.h头文件输入输出字符数组以及字符串处理
puts(str);
gets(str);
strcat(str1,str2); //将两个字符串连接
strlen(str); //计算字符串个数,不包含' '
strcmp(str1,str2); //判断两个字符串是否相等,相等的话返回值为0
//如果不相等,则根据第一个不同的字符的ASCII码值大小选择输出是正数或是负数(str1 - str2)
应用:输入一串字符串,统计其中有多少个单词
这个题目不能想当然,我没有加入word这个变量,而是直接利用空格来判断字符,其实当连续输入两个空格时,并没有两个单词,所以需要word这个变量来判断是否有无单词
#include
int main()
{
char str[50] = {0};
int i , num = 0 , word = 0;
printf("Please Enter A string:");
gets(str);
for(i = 0;str[i] != ' ';i++)
{
if(str[i] == ' ')
word = 0;
else if(word == 0)
{
num++;
word = 1;
}
}
printf("%d wordsn" , num);
return 0;
}
scanf("%s",str); //注意这里是数组名,不用取址符号&(其实str本身就是一个地址,数组第一个元素的地址)
//吐槽一下当时学数组时老师讲到指针我以为是钟表上面转的指针(好sb啊当时)
printf("%s",str); //注意·这里也是使用的数组名,而不是引用的单个数组元素
//printf() 输出直到遇见' 结束'
引用string.h头文件输入输出字符数组以及字符串处理
puts(str);
gets(str);
strcat(str1,str2); //将两个字符串连接
strlen(str); //计算字符串个数,不包含' '
strcmp(str1,str2); //判断两个字符串是否相等,相等的话返回值为0
//如果不相等,则根据第一个不同的字符的ASCII码值大小选择输出是正数或是负数(str1 - str2)
这个题目不能想当然,我没有加入word这个变量,而是直接利用空格来判断字符,其实当连续输入两个空格时,并没有两个单词,所以需要word这个变量来判断是否有无单词
#includeint main() { char str[50] = {0}; int i , num = 0 , word = 0; printf("Please Enter A string:"); gets(str); for(i = 0;str[i] != ' ';i++) { if(str[i] == ' ') word = 0; else if(word == 0) { num++; word = 1; } } printf("%d wordsn" , num); return 0; }
运行结果



