数组定义:具有一定顺序关系的若干变量的集合,变量的数据类型必须相同
数组分类:1.数值数组,字符数组,指针数组,结构体数组。
一维数组
1.下标只有一个的数组 :<数据类型><数组名>【<常量表达式>】
2.数组名要符合标识符的命名规定
3.数组名不能和其他变量重名
4.方括号中常量表示数组元素个数
5.数组名表示内存首地址,是地址常量
6.编译时给数组分配连续内存。
一维数组的引用
1.数组必须逐个元素引用,而不能整体引用
2.注意下标从0开始,范围为0-n-1。
一维数组初始化
1.对于普通局部数组不初始化,数组中的元素的值是不确定的。
2.对于static修饰的数组,没有初始化,元素默认为0。
3.全局数组不初始化,数组元素默认为0;
4.全部初始化,int a[]={1,2,3,4,5};注意只能写成一行不能换行写。
5.部分初始化,其余的自动赋0;
6.数组的元素不能整体赋值,只能单个赋值。
多维数组
1.定义:具有两个或以上的下标,称为多维数组 例:a[10][10]
2.<数据类型><数组名>[常量表达式1][常量表达式2]
常量表达式1为行数,表达式2为列数,行数可以省略,但第二维列数不能省略。
3.初始化:
按行初始化,每一行的初始值用{}括起来 int a[2][3]={{1,2,3},{4,5,6}};
按元素排列顺序初始化 int a[2][3]={1,2,3,4,5,6};
4.内存分配:类似一维数组,按行优先存,内存任然是连续的。
字符数组和字符串
1.定义:字符数组是元素的数据类型为字符类型的数组。char c[] char c[][10];
2.初始化
逐个字符赋值
使用字符串常量来赋值,注意字符串结尾有\0,所以实际内存要多占一个字节,注意越界问题。
3.字符串的定义:指以‘\0’作为结束字符的一组字符,当把一个字符串存入一个数组,也把专门的结束符'\0'存入,作为此字符串结束标志。
4.字符串的输入输出
printf("%s")输出字符数组内容时会一直输出直到达到'\0'字符
scanf("%s")输入时,遇空格或回车结束。
字符串处理函数
1.字符串拷贝函数strcpy /strncpy
格式:strcpy(字符数组1,字符数组2) / strncpy(字符数组1,字符数组2,number)
功能:将字符串2拷贝到字符数组1中/将字符数组2的前n个拷贝到字符数组1
返回值:返回字符数组1的首地址
注意:字符数组1必须足够大,拷贝时连'\0'一起拷贝
2.字符串连接函数strcat / strncat
格式:strcat(字符数组1,字符数组2)/strnact(字符数组1,字符数组2,number)
功能:将字符数组2连接到字符数组1后/将字符数组2前n个连接到字符数组1
返回值:字符数组1的首地址
注意:字符数组1要足够大,数组1的\0删除,在新的字符数组后加\0
3.字符串比较函数strcmp / strncmp
格式:strcmp(字符串1,字符串2)/strncmp(字符串1,字符串2,number)
功能:从左到右比较字符串1和字符串2(ASCII值)大小,直到遇到不同字符/从左到右比较前n个字符大小
返回值:= 返回为0 < 返回为负数 >返回为正整数
4.字符串长度函数strlen
格式 strlen(字符数组名)
功能:计算字符串有效长度
返回值:返回字符串实际长度,不包括\0
转义时\不算在内 \xhh表示16进制数,\ddd表示八进制数
实际例子
1.#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char ch1[100]="hello";
char ch2[]="hewlo";
char ch3[]="\x69\144\n";
int a,b;
strcat(ch1,ch2);//字符串连接函数
puts(ch1);
putchar('\n');
//strcpy(ch1,ch2);//字符串拷贝函数
//puts(ch1);
// putchar('\n');
a=strcmp(ch1,ch2);//字符串比较函数
printf("%d\n",a);
b= strlen(ch3);//字符串有效长度函数
printf("%d\n",b);
return 0;
}
2.#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char arr1[100]={};
char arr2[]="hello brother";
strncpy(arr1,arr2,5);
puts(arr1);
putchar('\n');
return 0;
}
3.
//计算斐波那契数列前十项并逆序输出结果
//斐波那契数列,后一个元素为前两个元素的和
#include <stdio.h>
int main(int argc, char *argv[])
{
int disc[10];
disc[0]=disc[1]=1;
int i;
for(i=2;i<10;i++)
{
disc[i]=disc[i-1]+disc[i-2];
}
for(i=9;i>=0;i--)
{
printf("%d ",disc[i]);
}
return 0;
}
4.冒泡排序法
#include <stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int i,j,t;
int a[N];
printf("please input %d numbers\n",N);
for(i=0;i<N;i++)//循环输入元素
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)//第一层循环一共循环排序N-1次
for(j=0;j<N-1-i;j++)//第二层循环,比较大小并交换元素,每比较一次下一次循环次数都会少一次
{
if(a[j]>a[j+1])//如果当前元素大于下一个则交换元素
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<N;i++)//循环输出数组元素
printf("%5d",a[i]);
printf("\n");
return 0;
}
5.选择排序法
#include <stdio.h>
#define N 10
int main(int argc, char *argv[])
{
int a[N],i,j,r,t;
printf("please input %d numbers\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)//通過N-2次比較
{
r=i;
for(j=i+1;j<N;j++)//如果後一位小於前一位,則將R和J交換,然後循環和下一位進行比較
{
if(a[j]<a[r])
r=j;
}
if(r!=i)//判斷結束後如果R不等於I則說明最小的是目前的第R位,則將他與I位交換
{
t=a[r];
a[r]=a[i];
a[i]=t;
}
}
printf("从小达到输出为:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);//循環輸出
printf("\n");
return 0;
}
6.打印杨辉三角前十行
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10][10]={{0}};
int i,j;
for(i=0;i<10;i++)
{
a[i][0]=1;//循环将第一列全部赋1
for(j=1;j<=i;j++)//控制打印的数字为三角形
a[i][j]=a[i-1][j-1]+a[i-1][j];//找规律得出表达式
}
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%-8d",a[i][j]);//-会使数字后加空格
printf("\n");
}
return 0;
}
7.输入一个字符串,然后将其逆序输出
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
/* char arr[100]={0};//如果不初始化,后面会赋随机值,导致输出乱码
int i,n;
printf("please input word\n");
gets(arr);
n=sizeof(arr)/sizeof(char);
// n=strlen(arr);
for(i=n-1;i>=0;i--)//改变输出顺序来实现逆序输出
putchar(arr[i]);
putchar('\n');
return 0;*/
char arr[100]={0},ch;//交换位置来实现逆序输出
int i,j,n;
printf("please input a string:");
gets(arr);
i=0;
n=strlen(arr);
j=n-1;
while(i<j)
{
ch=arr[i];
arr[i]=arr[j];
arr[j]=ch;
i++;
j--;
}
puts(arr);
return 0;
}
8.把输入的字符串中的大写变小写,小写变大写
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char arr[10]={0};
int n,i;
fgets(arr,sizeof(arr),stdin);//空间足够会把回车键存进去
n=strlen(arr);
for(i=0;i<n;i++)
{
if(arr[i]>='A'&&arr[i]<='Z')
arr[i]=arr[i]+32;
else if(arr[i]>='a'&&arr[i]<='z')
arr[i]=arr[i]-32;
}
puts(arr);
return 0;
}
9.求数组中的最大数
#include <stdio.h>
int main(int argc, char *argv[])
{
int max,i;
int a[10]={0};
printf("please input 10 number\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
max=a[0];
for(i=1;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
printf("max=%d\n",max);
return 0;
}
10.输入10个整数存入一维数组,统计输出其中的正数,负数和零的个数
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10],i;
int j=0;
int k=0;
int m=0;
printf("please input 10 number\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
{
if(a[i]==0)
{
j++;
}
else if(a[i]>0)
{
k++;
}
else
{
m++;
}
}
printf("正数个数为%d\n负数个数为%d\n零的个数为%d\n",k,m,j);
return 0;
}
11.输入10个整数存入一维数组,再逆序存放后输出
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10],i,t;
printf("please input 10 number\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<5;i++)
{
t=a[i];
a[i]=a[9-i];
a[9-i]=t;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}