2023/7/17 -- C语言基础
作业:
- 求一维数组中的第二大值
#include#include #include int main(int argc, const char *argv[]) {int s[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;int j = 0;int k = 0;int min = s[9];int max = s[0];for(i = 0;i < 10;i++){if(s[i] < min){min = s[i];j = i;}}for(i = 0;i < 10;i++){if(s[i] > max){k = i;}}s[k] = s[j];max = s[0];for(i = 0;i < 10;i++){if(s[i] > max){max = s[i];}}printf("第二大值为:%d\n",max);return 0; } - 终端输入带空格的字符串,删除字符中的空格
#include#include #include int main(int argc, const char *argv[]) {char s[32] = {0};gets(s);int count = 0;int i = 0;for(i = 0;s[i];i++){if(s[i] != ' '){s[count] = s[i];count++;}}s[count] = '\0';puts(s);return 0; } 
- 自己实现剩余的string函数族函数,strcat、strcpy、strcmp
//strcat #include#include #include int main(int argc, const char *argv[]) {char s1[32] = "hello";char s2[32] = "world";int i = 0;int j = 0;while(s1[i] != '\0'){i++;}while(s2[j] != '\0'){s1[i] = s2[j];j++;i++;}s1[i] = s2[j];puts(s1);return 0; } //strcpy #include#include #include int main(int argc, const char *argv[]) {char s1[32] = "hello";char s2[32] = "world";int i = 0;while(s2[i] != '\0'){s1[i] = s2[i];i++;}s1[i] = s2[i];puts(s1);return 0; } //strcmp #include#include #include int main(int argc, const char *argv[]) {char s1[32] = "hello";char s2[32] = "helloworld";int i = 0;int cmp = 0;while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0'){i++;}cmp = s1[i] - s2[i];printf("%d\n",cmp);return 0; } 

- 整理思维导图
- 终端输入10个学生成绩,使用冒泡排序对学生成绩从低到高排序
#include#include #include int main(int argc, const char *argv[]) {int a[10] = {0};int i = 0;for(i = 0;i < 10;i++){scanf("%d",&a[i]);}int j = 0;int temp = 0;for(i = 0;i < 9;i++){for(j = 0;j < 9 - i;j++){if(a[j] > a[j+1]){temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}for(i = 0;i < 10;i++){printf("%-3d",a[i]);}putchar(10);return 0; }
目录
作业:
一、一维整型数组
【1】概念
【2】定义
【3】数组中元素的赋值和初始化
【4】数组中元素的访问
【5】数组的大小
练习
【6】数组中元素的逆置
【7】冒泡排序
i)思想
ii)代码
练习:
【8】选择排序
二、一维字符数组
【1】定义
【2】字符串
【3】字符串的输入输出函数
i)gets输入
ii)puts输出
【4】string函数族
i)strlen
ii)strcpy
iii)strcat
iv)strcmp
v)bzero
vi)memset
练习
三、二维数组
【1】定义
【2】赋值和初始化
【3】二维数组中元素的个数
一、一维整型数组
【1】概念
数组指的是能够连续存储多个同一类型数据的结构
【2】定义
变量:
存储类型 数据类型 变量名;数组:
存储类型 数据类型 数组名[长度];
int arr[4]; //定义了一个整形数组arr能存4个数据数组名也是标识符
标识符的命名规范:
1、由数字字母和下划线构成
2、不能以数字开头
3、严格区分大小写
4、不能和C语言中的32个关键字重复
【3】数组中元素的赋值和初始化
初始化:定义同时赋值
赋值:给已有变量,赋值
#include
#include
#include
int main(int argc, const char *argv[])
{int arr[4]={1,2,3,4}; //定义了一个数组arr能存4个整形数据,并完全初始化int arr1[4]={8,9}; //定义了一个能存4个整形数据的数组arr1并不完全初始化,未初始化的部分默认为0int arr2[]={1,2,3,4,5,6}; //定义了一个数组arr2,没有定义长度,系统根据初始化数据的个数来分配空间int len2 = sizeof(arr2)/sizeof(int); //求数组的长度printf("%d\n",len2);//给数组中元素赋值//printf("%d\n",arr[2]);//arr={6,5,4,3}; error,如果已经定义数组了,就不能给数组中的元素整体赋值arr1[3]=90;printf("%d\n",arr1[3]);return 0;
}
【4】数组中元素的访问
[]:
1、用在定义数组时,表示定义了一个数组,并且存储数组的长度
2、用于访问数组元素,[]里面的值是数组中元素的下标,元素下标从0开始
数组中元素的下标从0开始,数组中最大元素的下标:长度-1
注意,访问数组时,不要越界。
【5】数组的大小
sizeof(数组名); ---->数组占多大字节
单个元素占空间大小*数据个数 数组长度:sizeof(数组名)/sizeof(数据类型);sizeof(数组名)/sizeof(arr[0]);
练习
1、有一个小球,从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米,第10次反弹多高
#include
#include
#include
int main(int argc, const char *argv[])
{float high=100;float sum=0;int i;for(i=1;i<=10;i++){high/=2;//计算的是,每次落地之后再弹起经过的总高度sum=sum+high*2;}sum+=100;printf("总高度%f,第10次弹起的高度%f\n",sum-high,high);return 0;
}
2、输入一行字符,输入\n停止,求这串字符中,大写字母的个数、小写字母的个数和数字字符的个数
#include
#include
#include
int main(int argc, const char *argv[])
{char c; //用于接收终端输入的字符int num_A=0,num_a=0,num=0;c=getchar(); //保证进入循环时的C是终端获取的不是随机值//判断输入的是否是'\n'while(c!='\n'){if(c>='a'&&c<='z'){num_a++;}else if(c>='A'&&c<='Z'){num_A++;}else if(c>='0'&&c<='9'){num++;}c=getchar(); //获取终端输入,改变循环变量}printf("大写字母的个数%d,小写字母的个数%d,数字字符的个数%d\n",num_A,num_a,num);return 0;
}
【6】数组中元素的逆置
int arr[5]={23,90,7,59,8};//逆置的结果
//{8,59,7,90,23}//方法一:
#include
#include
#include
int main(int argc, const char *argv[])
{int arr[]={10,89,5,8};int len=sizeof(arr)/sizeof(int);int i,j,temp;//下标之间的大小关系//j指向尾部,i指向头for(i=0,j=len-1;j>i;i++,j--){temp = arr[i];arr[i] = arr[j];arr[j] = temp;}for(i=0;i
数组越界:
- 可能出现随机值
- 可能出现段错误
【7】冒泡排序
C基础阶段,接触到的第一个算法
i)思想
相邻数据两两比较,比较出大小关系后,再进行交换
第一个元素和第二个元素比较,如果第一个元素更大,交换顺序;
第二个元素和第三个元素比较,如果第二个元素更大,交换
·····
(有顺序的数会被放在序列的最后)
ii)代码
#include
#include
#include
int main(int argc, const char *argv[])
{int arr[]={10,89,79,5};int len=sizeof(arr)/sizeof(arr[0]);int i,j;//中间变量int temp;//外层循环控制排序的趟数for(i=1;iarr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}//测试排序是否成功for(i=0;i
练习:
1、定义一个数组,要求长度使用宏定义,终端输入数组中的数据,实现冒泡排序,
//添加标志位,标志位要求,终端输入,如果输入1,升序,输入0降序。
#include
#include
#include
#define MAX 5
int main(int argc, const char *argv[])
{int arr[MAX];int i,j,flag,temp;for(i=0;iarr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}break;case 0:if(arr[j]arr[j+1]||flag==0&&arr[j]
【8】选择排序
每次从待排序序列中,找出最小/最大一个数,和待排序序列中的第一个元素交换

#include
#include
#include
int main(int argc, const char *argv[])
{int arr[]={23,90,5,31,7};int len=sizeof(arr)/sizeof(arr[0]),i,j,temp;//定义一个变量,保存最小值的下标int index=0;//外层循环控制排序次数for(i=1;iarr[j]){//更新最小值的下标index = j;}}//找到最小值,跟第一个元素交换if(index!=i-1){//三杯水temp = arr[index];arr[index] = arr[i-1];arr[i-1] = temp;}}for(i=0;i
二、一维字符数组
【1】定义
连续存储一个或多个字符,常用于存储字符串
char arr[长度]={初始值};
【2】字符串
双引号括起来的一个或多个字符,C语言中字符串以'\0'作为结束的标志
注意:数组名是数组中首元素的地址,是系统分配的,程序运行过程中不能修改的,是一个地址常量。
#include
#include
#include
int main(int argc, const char *argv[])
{char arr[10]; //定义了一个能存10个字符的数组arr,存的是随机值char arr1[10]={'a','b','c'}; //定义了一个能存10个字符的数组arr1,并不完全初始化,未初始化的部分存的是'\0'char str[]="hello"; //6,说明除了hello还存了一个'\0'printf("%ld\n",sizeof(str));//char str1[5]="hello"; //发生了数组的越界/*str[2]='p';int i;for(i=0;i<5;i++){putchar(str[i]);}*/
// scanf("%s",str); //数组名其实就是数组中首元素的地址//scanf不能获取带空格的字符串,因为空格、tab键和回车是scanf数据间隔的标志//gets函数会报警告,是友好的警告,不会检查越界错误gets(str);puts(str);return 0;
}
【3】字符串的输入输出函数
i)gets输入
gets不会检查数组越界,使用时需要确保数组足够大
函数原型:
char *gets(char *s); //能够带空格的从终端获取字符串
参数:字符串的首地址
使用:char str[10];gets(str); ---->从终端获取字符串放到str中
ii)puts输出
函数原型:int puts(const char *s);
作用:终端输出字符串
参数:字符串的首地址
【4】string函数族
如果想要使用string函数族中的函数,需要导入头文件
i)strlen
求字符串的实际长度
函数原型:size_t strlen(const char *s);
返回值:无符号的长整型,字符串的实际长度
参数: 字符串的首地址
功能:求字符串的实际长度
使用:strlen(str);执行逻辑:从字符串的首地址开始,向后计数,遇到'\0',就结束计数
ii)strcpy
函数原型:char *strcpy(char *dest, const char *src);
返回值:目标字符串的首地址
参数:char *dest,目标字符串const char *src源字符串,加const因为拷贝过程中不能修改src 指令逻辑:从字符串的首地址开始,把src的每一位拷贝给dest,包括'\0'//char str[]="hi";
//char str1[]="hello";
使用://strcpy(str,str1); //error,str1需要6个字节,但是str只有3个字节
注意:dest(目标字符串)需要足够大容纳src(源字符串)
iii)strcat
实现两个字符串的拼接
函数原型:char *strcat(char *dest, const char *src);
返回值:目标字符串的首地址
参数:char *dest,目标字符串,被拼接的字符串const char *src,要拼接的字符串
功能:把src拼接到dest后面
使用:strcat(str,str1); //把str1的内容拼接到str后面
执行逻辑:把src的每一位拼接dest中'\0'开始的每一位(包括'\0')
注意:dest(目标字符串)需要足够大容纳src(源字符串)
iv)strcmp
函数原型:int strcmp(const char *s1, const char *s2);
返回值:ASCII的差值
通过返回值判断,s1和s2的大小关系:返回值>0, s1>s2返回值=0, s1=s2返回值<0, s1
#include
#include
#include
int main(int argc, const char *argv[])
{char str[20]="hello";char str1[]="world";/*printf("sizeof的结果%ld\n",sizeof(str)); //数组的大小printf("strlen的结果%ld\n",strlen(str)); //字符串的实际长度*///字符串拼接strcat(str,str1);puts(str); //helloworld//字符串拷贝/*strcpy(str,str1);puts(str); //world*/int ret = strcmp(str,str1);printf("%d\n",ret); //-15 ===>h-wchar s1[]="hello";char s2[]="hello";int ret1 = strcmp(s1,s2);printf("%d\n",ret1); //0 return 0;
}
v)bzero
函数原型:void bzero(void *s, size_t n);
功能:内存置0
void没有返回值
参数:void *s,要置0的内存空间的首地址size_t n,置0多少字节#include
#include
#include
int main(int argc, const char *argv[])
{char str[]="hello";puts(str);//bzero函数,给两个字节置0bzero(str,2);int i;for(i=0;i<6;i++){printf("%c\n",str[i]);//////l//l//o//}return 0;
}
vi)memset
函数原型:void *memset(void *s, int c, size_t n);
参数:void *s:要置位的内存空间的首地址int c:内存置位的内容size_t n:置多大字节 #include
#include
#include
int main(int argc, const char *argv[])
{int a=0x12345678; //数据地位存在地址低位printf("%#x\n",a);//memset内存置位函数memset(&a,0xEF,2);printf("%#X\n",a); //0X1234EFEFreturn 0;
}
练习
1、自己实现strlen函数的功能
#include
#include
#include
int main(int argc, const char *argv[])
{char str[100];gets(str);//实现strlen的功能int i=0;//如果访问到'\0',它的ascii码为0,条件为假while(str[i]){//即实现了计数的功能,也实现了向后访问元素的功能i++;}printf("%d\n",i);return 0;
}
2、输入带空格的字符串,求单词个数
__ueooe_eui_sjje__ ---->3
syue__jdjd____die_ ---->3
shuue__dju__kk ---->3
#include
#include
#include
int main(int argc, const char *argv[])
{char str[100];gets(str);int i=0,j=0,count=0;//循环遍历整个字符串while(str[i]){//如果字符串的第一位不是空格时,先计数if(i==0&&str[i]!=' '){count++;}//如果第i位是空格,但是i+1为不是空格也不是'\0'给单词计数if(str[i]==' '&&str[i+1]!=' '&&str[i+1]!='\0'){count++;}i++;}printf("%d\n",count);return 0;
}
三、二维数组
数组是连续存储多个同一类型的数据
【1】定义
一维数组:存储类型 数据类型 数组名[长度];二维数组:存储类型 数据类型 数组名[行数][列数];
在访问二维数组中的元素时:行标从0开始,列标从0开始
最大行标:行数-1
最大列标:列数-1

【2】赋值和初始化
#include
#include
#include
int main(int argc, const char *argv[])
{int arr[2][3]={1,2,3,4,5,6}; //定义了一个两行三列的二维数组arr,并完全初始化int arr1[2][3]={3,4,5}; //定义了一个两行三列的二维数组arr,并不完全初始化,未初始化的部分默认为0int arr2[2][3]={{1,2,3},{3,2,1}}; //定义了一个两行三列的二维数组,并以行为单位的完全初始化int arr3[2][3]={{},{3}}; //定义了一个两行三列的二维数组,并以行为单位的不完全初始化//int arr4[2][]={1,2,3,4,5,6}; 二维数组不能省略列数的初始化int arr4[][3]={1,2,3,4}; //二维数组省略行数的初始化int arr5[][3]={{1,2},{3},{}}; //36,三个{},表示三行int arr6[][3]={1,2,3}; //12, 1,2,3三个数连续分配空间printf("%ld\n",sizeof(arr4));printf("%ld\n",sizeof(arr5));//给arr5的第二行的第三个元素赋值arr5[1][2]=90;printf("%d\n",arr5[1][2]);return 0;
}二维数组中元素的访问,通过行标和列标
数组名[行标][列标];
arr[i][j]; ---->访问数组中行标为i,列标为j的元素
【3】二维数组中元素的个数
行数*列数;
sizeof(arr)/sizeof(arr[0][0]);
练习:
1、完成杨辉三角,10行

#include
#include
#include
int main(int argc, const char *argv[])
{//定义10行10列的二维数组int arr[10][10]={0};int i,j;for(i=0;i<10;i++){arr[i][0]=1; //把杨辉三角的第一列全部赋值为1for(j=1;j<10;j++){if(i>0){//给杨辉三角的每一项赋值arr[i][j]=arr[i-1][j]+arr[i-1][j-1];}}}//输出三角形for(i=0;i<10;i++){for(j=0;j<=i;j++){printf("%-4d",arr[i][j]);}putchar(10);}return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
