C语言数组的学习概要和学习方法
一、学习概要
数组作为一个数据类型,在大一《C语言程序设计》这门课上我们将学习C语言数组的一维数组,二维数组及数组数据的处理。这一章主要就是围绕这三个部分展开。
二、学习方法
作为一种计算机语言的学习,一定要多练习,Practice makes perfect!所以,数组作为一种十分方便我们处理数据的一种格式,更加需要我们花时间和精力去练习。
C语言数组之一维数组
下面是C语言数组的基本的定义和打印的功能,以及一些注意事项均写在代码块当中
C语言一维数组的一些基本用法
#include<stdio.h>
//数组的学习
int
main()
{
int array1[6],i; //数组的创建 []里面是告诉编译器array在内存中需要多大的空间
char b[24];
double c[3];
int d[3]={25,65,75};
printf("%d\n",sizeof(array1));//输出的结果为24 四个int 类型 4*6=24
printf("%d\n",sizeof(b)); //1*24=24
printf("%d\n",sizeof(c)); // 3*8=24
// 注意之前C语言当中的数组不存在动态初始化,定义后大小不能随意改变 区别Java 故[]里面只能是常量 但是后来C99支持了
//对于构造型数据类型的学习,总是遵循增,删,改,查
/*******************这是一条分割线*********************/
for(i=0;i<6;i++)
{
array1[i]=i+1;
}
for (i=0;i<6;i++)
{
printf("%d\n",array1[i]);
}
printf("*********这是一条分割线**************\n");
for(i=0;i<3;i++)
{
printf("%d\n",d[i]);// 注意数组访问的时候是下标是从零开始,超过数组的范围会出现数组的越界
// 数组的编译器无法进行数组越界的报错,故一定要注意这个问题,C语言'老bug'
}
}
C语言一维数组的初始化
#include<stdio.h>
// 数组的初始化
int
main()
{
int i;
int a[5]={0}; // 将所有的元素初始值设置为0,如果换成1或其他数字则不成立
int b[5]={1,2,3,4,5};
int c[10]={18,28,3,85,58}; //一部分元素赋值,未被赋值的元素自动初始化为0
int e[]={425,65,89};
int f[10]={[3]=50,[5]=89};
printf("%d\n",f[3]);
printf("%d\n",sizeof(e)); //输出结果为12
/***********************************************************/
printf("***********************************************************\n");
for(i=0;i<5;i++){
printf("%d\n",a[i]);
}
for(i=0;i<10;i++){
printf("%d\n",c[i]);
}
return 0;
}
C语言数组学习之一维数组练习题目和一些注意事项
这道题目主要的功能是实现班级同学成绩的录入和求取班级同学成绩的平均值
#include<stdio.h>
#define NUM 10
// 数组练习
int
main()
{
int array[NUM];
int i,sum;
for (i=0;i<10;i++)
{
printf("请输入第%d位同学的成绩:",i+1);
scanf("%d",&array[i]);
sum +=array[i];
}
printf("成绩录入完毕,平均分为%.2f",(double)sum/NUM);
return 0;
}
下面是一个注意事项关于C99当中对于数组动态初始化,动态初始化就是在使用数组的时候可以动态调整数组的大小类似Java中数组的使用
#include<stdio.h>
int
main()
{
int n,i;
printf("请输入字符的个数:");
scanf("%d",&n);
char a[n+1] ; //发现数组可以动态初始化 ,说明C99支持动态初始化
printf("请开始输入字符:");
getchar();// 作用是吸收内存中多余的换行字符\n,并且不保存将其丢弃(输入后的回车键产生的)
for(i=0;i<n;i++)
{
scanf("%c",&a[i]);
}
a[n]='\n';//字符串末尾要加上一个\n结尾
printf("你输入的字符串是:%s\n",a) ;
return 0;
}
一维数组中对于数据的处理
对于构造数据类型,这一类的学习都是有相似的方法,例如C语言中的数组,Python中的列表,字典还有Java中数据库的使用。基本都遵循增删改查的学习过程
增和改的处理还是比较容易的,增这里可以理解为给数组中元素赋予一个初值
#include<stdio.h>
int main()
{
int array[10]={12,52,65,256};
int i;
array[5]=125; //增
array[4]=25; //改
for(i=0;i<10;i++){
printf("%d\n",array[i]);
}
return 0;
}
当然如果结合查的过程去改和增,可以使整个程序运行起来更加接近实际情况
查
#include<stdio.h>
//数组元素的查找
int
main()
{
int a[5]={52,98,85,98,254};
int num,i,j,count=0,k;
printf("请输入要查找的数字:");
scanf("%d",&num);
for (i=0;i<5;i++){
if(a[i]==num)
{
count+=1;
}
}
if(count==0)
{
printf("Not Found!\n");
}
printf("累计找到%d次\n",count);
printf("查找结束");
return 0;
}
删
#include<stdio.h>
//数组元素的删除
int
main()
{
int a[5]={52,98,85,98,254};
int del_num,i,j,count=0; //加入count计数项完美修复bug,不愧是聪明机制的我
printf("请输入要删除的数字:");
scanf("%d",&del_num);
for(i=0;i<5;i++)
{
if(a[i]==del_num){
count+=1;
for(j=i;j<5-count;j++){
a[j]=a[j+1];
}
}
}
if(count==0) printf("没有找到你要删除的数字\n");
for(i=0;i<5-count;i++)
{
printf("%4d\n",a[i]);
}
}
移动和逆序重排
#include<stdio.h>
int
main()
{
int a[10]={98,85,58,98,56,78,85,86,87,82};
int i,j,n,temp;
printf("请输入要移动的位数:");
scanf("%d",&n);
for(i=0;i<n;i++){
temp=a[0];
for(j=0;j<9;j++){
a[j]=a[j+1];
}
a[9]=temp;
}
for(i=0;i<10;i++){
printf("%d\n",a[i]);
}
/*逆序重排程序
这里面考虑了偶数的情况,关于奇数情况,可以自己分析并书写代码
*/
printf("*******下面进行逆序重排程序*******\n");
for(i=0;i<=10/2;i++){ //如果是奇数的话,这里面循环的判断语句就不能加上等号!!!
temp=a[i];
a[i]=a[9-i];
a[9-i]=temp;
}
for(i=0;i<10;i++){
printf("%d\n",a[i]);
}
return 0;
}
字符处理函数的介绍
#include<stdio.h>
#include<string.h>
/*字符数组 -----字符串处理函数
一定要注意引入库函数!!!
*/
int
main()
{
char str[]="I love C program!";
char str1[]="Original String";
char str2[]="New String";
char str3[25];
char str4[]="To be or not to be?" ;
char str5[40];
/*获取字符串长度函数*/
printf("sizeof str = %d\n",sizeof(str));
printf("strlen str = %u\n",strlen(str)); //%u 为无符号的十进制整数
/*
strlen不包含最后的\0
**********************************************************/
/*拷贝字符串函数*/
strcpy(str1,str2);//将str2的值(包括\0)拷贝到str1 要注意数组内存空间大小问题
strcpy(str3,"Copy Success!");
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
printf("str3:%s\n",str3);
/*受限的拷贝字符串函数*/
strncpy(str5,str4,5); //防止出现数组数据溢出的现象
str5[5]='\0' ; //最好写上这个东西使其读到第五个就结束 ,去掉后devc++不会报错
printf("str5:%s\n",str5);
/*连接字符串函数*/
strcat(str5," "); //加一个空格,更加美观符合英语书写情况
strcat(str5,str2);
printf("%s\n",str5);
/*受限的连接字符串函数*/
strncat(str5," I do not to be",5);
printf("%s\n",str5); //区别于strncpy,strncat 会自动添加\0
/*比较字符串函数*/
if(strcmp(str1,str2))
{
printf("两个字符串完全一致");
}
else
{
printf("两个字符串不一致");
}
/*受限的比较字符串函数strncmp也是同样的道理,比较前几个字符串的相似性*/
return 0;
}
学习日记持续更新中!!!学习ing!!!
2021/04/40更新
一维数组之降序排列
#include<stdio.h>
int main()
{
int a[14]={98,85,98,87,65,99,100,78,86,57,86,59,60,84};
int max,temp,i,j,k;
/*
max=a[0];
for(i=0;i<14;i++){
if (max<=a[i])
max=a[i];
}
printf("%d\n",max); 测试是否成功获得最大值
*/
for(i=0;i<14-1;i++){
max=i; //给max赋予一个初值,因为还没有开始比较所以不知道哪一个是最大值,就默认第一个元素为最大值。
for(j=i+1;j<14;j++){ //这个元素的目的是在剩下的元素中寻找最大值
if(a[max]<a[j])
max=j;
}
if(max!=i){ //这一段的目的是将发现的最大值元素前置,等价于把刚才的那个默认最大值(其实不一定是最大值)和遍历数组【i】后面元素发现的最大值 进行位置的对调
temp=a[i];
a[i]=a[max];
a[max]=temp;
}
}
for(k=0;k<14;k++){
printf("%d\n",a[k]);
}
return 0;
}
一维数组既然有降序排列,那么肯定也会有升序排列
一维数组的升序排列留作练习,自己想一想应该怎么写再看下面的答案。
一维数组的升序排列
#include<stdio.h>
int main()
{
int a[14]={98,85,98,87,65,99,100,78,86,57,86,59,60,84};
int min,temp,i,j,k;
for(i=0;i<14-1;i++){
min=i;
for(j=i+1;j<14;j++){
if(a[min]>a[j])
min=j;
}
if(min!=i){
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
for(k=0;k<14;k++){
printf("%d\n",a[k]);
}
return 0;
}
会发现几乎没有什么差别,无非就是名称和判断语句符号发生了改变。
二维数组
二维数组的初始化过程其实和一维数组类似,二维数组在内存空间内的布局可以理解为一维数组的嵌套,学习二维数组,可以采用类比的方式学习
二维数组的初始化和相关知识
#include<stdio.h>
/*二维数组*/
int main()
{
int a[6][6]; //6*6 的数组 内存中的存放依旧是线性的,使用嵌套(子集)的形式储存
int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int c[3][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
int d[3][4]={0};
int f[3][4]={{1},{2},{3}}; //只给每一行的第一个元素赋初值
int g[][4]={{1},{2},{3}}; //只有第一个坐标是可以省略不写的
int i,j;
printf("%d\n",sizeof(a));//运算结果为144 6*6*4=144
/*
二位数组的访问和一维数组是相同的 例如a[0][1]
*/
/*数组元素的遍历*/
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d",b[i][j]) ;
}
printf("\n");
}
/***************************/
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d",f[i][j]) ;
}
printf("\n");
}
}
二维数组的练习
#include <stdio.h>
int main( )
{ int i,j,a[3][4]={{1,5,-2,-9},{-3,-6,4,8},{5,-1,0,7}},b[12],k=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if (a[i][j]<0){
b[k]=a[i][j];
k+=1;
}
}
}
for(i=0;i<k;i++)
printf("%d ",b[i]);
printf("\n");
return 0;
}
二维数组和线性代数与空间解析几何之间的关系
#include<stdio.h>
//矩阵的转置
int
main()
{
int i,j;
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d",a[i][j]) ;
}
printf("\n");
}
printf("************\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d",a[j][i]) ;
}
printf("\n");
}
}
打印以下的杨辉三角形(输出8行)
#include<stdio.h>
int main()
{
int a[8][8],i,j;
for(i=0;i<8;i++)
{
a[i][i]=1;
a[i][0]=1;
}
for(i=2;i<8;i++)
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<8;i++)
{
for(j=0;j<=i;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
return 0;
}