数组:
1、一维数组的定以和使用
定以和声明:
变量定以:在定以变量的时候会被分配空间大小
变量声明:只是告诉编译器存在此变量
1)数组是什么
相同数据类型的集合
2)数组有什么用
批量保存数据和处理数据
3)特点
空间连续,数组名即为数组的首地址
数组的定义:
格式:
数据类型 数组名[len];
数据类型:基本数据类型+构造数据类型
数组名:合法标识符
int num[5];
变量名:num
变量的类型:int []
初始化数组:
1)不初始化
格式:
数据类型 数组名[len];
提示:不建议不初始化数组,因为未初始化的数组,内部空间的数据时杂乱的
2)部分初始化
格式::
数据类型 数组名[len]={元素初始值};
提示:元素的初始值个数小于len
注意:部分初始化数组的方式,初始化部分数据会被赋予{}内的初始值,未被初始化的部分
3)省略长度初始化
格式:
数据类型 数组名[ ]={元素初始值};
提示:省略长度初始化就是在定以数组的时候不指定数组的长度,数组的长度由后面数组的
初始化元素个数决定
4)全部初始化
格式:
数据类型 数组名[len]={元素初始值};
元素的调用:
数组元素的调用采用的是下标法
索引:就是元素在数组中的编号
方式:
数组名[索引号]
#include <stdio.h>
int main()
{
/*int age1=25;
int age2=26;
int age3=27;
int age4=24;
int age5=23;*/
int i=0;
int age[5]={22,23,24,25,26};
/*
printf("age[0]=%d\n",age[0]);
printf("age[1]=%d\n",age[1]);
printf("age[2]=%d\n",age[2]);
printf("age[3]=%d\n",age[3]);
printf("age[4]=%d\n",age[4]);
*/
for(i=0;i<5;i++)
{
printf("age[%d]=%d\n",i,age[i]);
}
return 0;
数组的赋值方式:
初始化:就是在定以变量的时候进行赋值操作
int num=10;
不同变量的初始化值:
int : 0
float 0
double 0
char 空
指针 NULL
字符串: \0
赋 值:先定义变量后给变量赋值
int num=10;
num=20;
数组的赋值方式是同索引操作
格式:
数组名[索引号]=值;
数组的大小:
数组是相同数据类型的集合,数组的大小就是集合的大小,集合的大小就是通过集合中“存储数据的个数*存储的数据的类型”
也可以通过sizeof运算符获取
且数组的空间是连续性的
和数组相关的常用操作:
1)求最值
#include <stdio.h>
int main()
{
int i=0,max=0,tmp=0;
int age[5]={22,28,24,21,26};
for(i=0;i<5;i++)
{
if(max<age[i])
{
max=age[i];
tmp=i;
}
}
printf("sizeof(age)=%lu\n",sizeof(age));
printf("数组的最大值为=%d,下标为%d\n",max,tmp);
return 0;
2)排序
对数组元素进行排序的方法有很多种,比如冒泡排序、归并排序、选择排序、插入排序、快速排序等,其中最经典最需要掌握的是「冒泡排序」。
冒泡排序法的方法就是“两两比较求最值,值交换”
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i=0,j=0,tmp=0;
time_t times=0;
int num[10]={0};
times=time(NULL);
srand(times);
for(i=0;i<10;i++)
{
num[i]=rand()%100;
}
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,num[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
for(j=0;j<10-1-i;j++)
{
if(num[j]>num[j+1])
{
tmp=num[j];
num[j]=num[j+1];
num[j+1]=tmp;
}
}
}
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,num[i]);
}
printf("\n");
return 0;
选择排序法:
固定一个值,两两比较求最值
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i=0,j=0,tmp=0,min=0;
time_t times=0;
int num[10]={0};
times=time(NULL);
srand(times);
for(i=0;i<10;i++)
{
num[i]=rand()%100;
}
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,num[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
min=i;
for(j=i+1;j<10-i;j++)
{
if(num[min]>num[j])
{
min=j;
}
}
if(min!=i)
{
tmp=num[min];
num[min]=num[i];
num[i]=tmp;
}
}
for(i=0;i<10;i++)
{
printf("num[%d]=%d ",i,num[i]);
}
printf("\n");
return 0;
2、二维数组的定以和使用
一维数组就是多个数据的集合
一位数组中的元素是一个单个数据
二维数组:就是一维数组中存放一维数组
二维数组中的元素是一个一维数组
二维数组的定以:
格式:
数据类型 数组名[row][column];
row:行数
column:列数
注意:在定以二维数组的时候行可以省略但是列不能省略
如:
二维数组的初始化:
方式一:不初始化
数据类型 数组名[row][column];
不对二维数组的成员进行赋值操作
方式二:部分初始化
数据类型 数组名[row][column]={数组元素};
数组元素的个数小于 row*column
方式三:省略行长度初始化
数据类型 数组名[ ][column]={数组元素};
行数等于数组元素的个数除以column
假如初始化中数组的元素个数为8个,列数为3
行位:8/3+1
未初始化的数为0
方式四:全部初始化
数据类型 数组名[row][column]={数组元素};
数组元素的个数等于 row*column
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int num[2][3]={1,2,3,4,5,6};
int num1[2][3]={{1,2,3},{4,5,6}};
int num2[2][3]={1,2,3,4,5};
int num3[][3]={1,2,3,4,5,6,7};
//int num4[2][]={1,2,3,4,5,6,7,8,9,0};列不能省略
int i=0,j=0;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("num[%d][%d]=%d\t",i,j,num2[i][j]);
}
printf("\n");
}
return 0;
3、字符数组
4、字符串函数
在字符串函数中出现n的地方都是来限制长度
字符串长度获取:strlen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
int i=0;
char str[]="hello";
char str1[]={'h','e','l','l','o'};
printf("sizeof(str)=%lu\n",sizeof(str));
printf("sizeof(str1)=%lu\n",sizeof(str1));
printf("strlen(str)=%lu\n",strlen(str));
printf("strlen(str1)=%lu\n",strlen(str1));
return 0;
}
字符串的拼接:
strcat:
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
int i=0;
char str[15]="hello";
char buf[6]="world";
printf("%s\n",strcat(str,buf));
printf("%s\n",strncat(str,buf,2));
return 0;
}
字符串的比较:
strcmp, strncmp - compare two strings
#include <string.h>
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
strcmp:比较字符串是否相同
size_t n:指定比较的字节数
int:整型返回值,用来表示s1>s2(>0) 或者 s1=s2(=0)或者 s1<s2(0<)
注意:比较字符串的函数strcmp比较的是两个字符串在ASCII中的位置对应的值,若在
ASCII中的位置靠后说明值比较大,只有两个字符完全相同的时候才相同,如两个字符的
开头相同会继续向后进行比较直到比较出大小
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
int ret=0;
char str[15]="hellp";
char buf[6]="hello";
ret=strcmp(str,buf);
if(ret>0)
{
printf("str>buf\n");
}
else if(ret==0)
printf("str=buf\n");
else
printf("str<buf\n");
printf("%d\n",strncmp(str,buf,4));
return 0;
}
字符串的拷贝:
strcpy:string copy
strcpy:将源字符串拷贝到目标字符串
strncpy:将源字符串的前n个拷贝到目标字符串,只是覆盖目标字符串的前n个字节
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
int ret=0;
char str[15]="hello";
char buf[6]="world";
// printf("%s\n",strcpy(str,buf));
printf("%s\n",strncpy(str,buf,4));
return 0;
}
字符串的获取函数:
gets:
字符串输出函数:
int puts(const char *s);
const char *s:待输出的字符串的首地址
int fputs(const char *s, FILE *stream);
const char *s:待输出的字符串的首地址
FILE *stream:输出到的文件流,我们用stdout
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
char buf[20]={0};
gets(buf);
puts(buf);
return 0;
}
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
char buf[20]={0};
//gets(buf);//等同于scanf("%s",buf);
//puts(buf);//等同于printf("%s",buf);
fgets(buf,20,stdin);
fputs(buf,stdout);
return 0;
}
字符串输出
putchar()
字符的输入:
getchar:
int getchar(void);
int:用来接收获取到的单个字符的ascii码
int getc(FILE *stream);
int:用来接收获取到的单个字符的ascii码
FILE *stream:标准输入流stdin
字符输出:
putchar:
int fputc(int c, FILE *stream);
int putchar(int c);
int c:待输出的字符
FILE *stream:输出的目标流,此处是标准输出流stdout
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
char ch=' ';
char buf[20]={0};
//gets(buf);//等同于scanf("%s",buf);
//puts(buf);//等同于printf("%s",buf);
fgets(buf,20,stdin);
fputs(buf,stdout);
//ch=getchar();
//putchar(ch);
ch=fgetc(stdin);
fputc(ch,stdout);
printf("\n");
return 0;
}
提示:带有f的函数接口针对的输入输出流比较多,不带有f的接口只能对标准输入输出操作