c语言怎么把数组中的数据删除(C语言用数组处理批量数据)
整型、字符型、浮点型数据,都是简单的数据类型。对于简单的问题,使用这些简单的数据类型就可以了。对于有些需要处理的数据,只用以上简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。
比如,一个班有30个学生,毎个学生有一个成绩,要求这30名学生的平均成绩。
实际上这些数据是同一个班级、同一门课程的成绩,它们具有相同的属性。人们想出这样的办法:既然它们都是同一类性质的数据(都代表一个班中学生的成绩)就可以用同一个名字(如 s )来代表它们,而在名字的右下角加一个数字来表示这是第几名学生的成绩,例如,可以用 s1, s2,s3, …S30 代表学生1、学生2、学生3…学生30,这30个学生的成绩。这个右下角的数字称为下标。一批具有同名的同属性的数据就组成一个数组(array), s 就是数组名。
(1)数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
(2)用一个数组名(如 s )和下标(如15)来唯一地确定数组中的元素,如 s[15] 就代表第15个学生的成绩。
(3)数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据(如学生的成绩和学生的性别)放在同一个数组中。
C 语言规定用方括号中的数字来表示下标,如用 s [15]表示 S15,即第15个学生的成绩。
将数组与循环结合起来,可以有效地处理大批量的数据。
1定义数组和引用一维数组
一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一地确定。
比如:学生成绩数组 s 就是一维数组。
有的数组,其元素要指定两个下标才能唯一确定,如用S2,3 表示“第2班第3名学生的成绩”,其中第1个下标代表班,第2个下标代表班中的学生序号。此时, s 就是二维数组。还可以有三维甚至多维数组,如用S4,2,3表示4年级2班第3名学生的成绩,这里s 就是三维数组。它们的概念和用法基本上是相同的。
定义一维数组
要使用数组,必须在程序中先定义该数组,即通知计算机:由哪些数据组成数组,数组有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。
下面是对数组的定义:
int a [10];
它表示定义了一个整型数组,数组名为 a ,此数组包含10个整型元素。
定义一维数组的一般形式为
类型说明符 数组名[常量表达式];
说明:
(1)数组名的命名规则和变量名相同,遵循标识符命名規则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,指定a[10],表示 a 数组有10个元素。注意,下标是从0开始的,这10个元素是 a [0], a [1], a[2], a [3], a [4], a [5], a [6], a [7], a[8], a [9]。按数组的定义,不存在数组元素a【10】
(3)常量表达式中可以包括常量和符号常量,如“ int a [3十5];”是合法的。不能包含变量,如“ int a [ n ];”是不合法的。也就是说, C 语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
例如,下面这样定义数组是不行的:
int n ;
scanf ("% d ",& n );//企图在程序中临时输入数组的大小
int a[n];
∥数组长度性质是常量,一定不是变量,它有地址,数值是可变的,不能变量表示数组长度。数组整体是变量。
用“ int a [10];”定义了数组 a 后,在内存中划出一片存储空间,存放了一个有10个整型元素的数组。可以看到,用一个“ int a [10];”,就相当于定义了10个简单的整型变量,比较方便。
2引用一维数组元素
在定义数组并对其中各元素赋值后,就可以引用数组中的元素。应注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。
引用数组元素的表示形式为
数组名[下标]
例如, a [0]就是数组 a 中序号为0的元素,它和一个简单变量的地位和作用相似。“下标”可以是整型常量或整型表达式。例如下面的赋值表达式包含了对数组元素的引用, a [0]= a [5] a [7]- a [2*3]
3一维数组的初始化
在定义数组的同时给各数组元素赋值,称为数组的初始化。
用“初始化列表”方法实现数组的初始化。
(1)在定义数组时对全部数组元素赋予初值。例如: int a [10]={0,,1,2,3,4,5,6,7,8,9};
将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据效为“初始化列表”。经过上面的定义和初始化之后,a [0 ]=0, a[1]=1, a [2]=2, a [3]= 3,a [4]=4,a[5]=5,
a [6]=6, a[7]=7,a[8]=8,a[9]=9。
(2)可以只给数组中的一部分元素赋值。例如: int a [10]={0,1,2,3,4};
定义 a 数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。
(3)如果想使一个数组中全部元素值为0,可以写成
int a [10]=(0,0,0,0,0,0,0,0,0,0);
或int a [10]=(0);
(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
//未赋值的部分元素自动设定为0
int a [5]=(1,2,3,4,5)可以写成
int a ={1,2,3,4,5}
在第2种写法中,花括号中有5个数,虽然没有在方括号中指定数组的长度,但是系统会根据花括号中数据的个数确定 a 数组有5个元素。但是,如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成
int a [10]=(1,2,3,4,5};
只初始化前5个元素,后5个元素为0。
说明:如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被"初始列表”指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始为"\0”,如果是指針型数组,则初始化为 NULL ,即空指针)。
4一维数组程序实例
如:已知前两项初值为1,1,后面一项是前面两项之和,依次类推,显示前40项数据。
如果用简单变量处理的,只定义3个变量,程序可以顺序计算并输出各项数据值,但不能在内存中保存这些数。假如想直接输出数列中的第40个数是很困难的。查资料找到下面程序:
#include<stdio.h>
//斐波那锲数列第四十项为多少(前两项的和是后一项)
int Fabonacci(int n)
{
int f1 = 1;
int f2 = 1;
int f3 = 1;
int i;
for(i = 3;i <= n;i )
//前两项的和给第三项,然后2给1,3给2
{
f3 = f1 f2;
f1 = f2;
f2 = f3;}
return f3;
}
int main()
{
printf("%d\n",Fabonacci(40));
getchar();
return 0;
}
scanf和getchar的区别
字符数据的输入:
scanf()函数是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量中。在scanf()语句的格式串中由于没有非格式字符在“%d%d%d”之间作为输入时的间隔,因此在输入时要用一个以上的空格或回车符作为每两个输入数之间的间隔。
scanf()在读取数字时会跳过空格、制表符和换行符。如:
1 #include<stdio.h>
2 int main()
3 {
4 int a,b,c;
5 scanf("%d%d%d",&a,&b,&c);
6 printf("%d%d%d",a,b,c); }
getchar()函数是键盘输入函数,其功能是从键盘上输入一个字符。简单来说就是getchar()函数在C程序中的功能是接收一个字符。
scanf()的程序:
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main(void)
4 {
5 int a,b,c;
6 printf("please input num a:\n");
7 scanf("%d",&a);
8 printf("please input num b:\n");
9 scanf("%d",&b);
10 printf("please input num c:\n");
11 scanf("%d",&c);
12 printf("%d,%d,%d",a,b,c);
13 }
运行结果
please input num a:
1
please input num b:
2
please input num c:
3
1 2 3 press any key to continue
char的程序:
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main(void)
4 {
5 char a,b,c;
6 printf("please input num a:\n");
7 scanf("%c",&a);
8 printf("please input num b:\n");
9 scanf("%c",&b);
10 printf("please input num c:\n");
11 scanf("%c",&c);
12 printf("%c,%c,%c",a,b,c);}
程序连续接收了三个字符,在C中enter键代表一个换行符,所以当输入完a的值‘q’之后按下enter键,换行符立马被字符b接收了,然后程序再向下走,输入c的值‘w’。结果就会按顺序显示a,b,c的值,我们已经知道a='q',b='\n',c='w';所以结果就会显示两行。
getchar()程序:
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main(void)
4 {
5 char a,b,c;
6 printf("please input num a:\n");
7 scanf("%c",&a);
8 getchar();
9 printf("please input num b:\n");
10 scanf("%c",&b);
11 getchar();
12 printf("please input num c:\n");
13 scanf("%c",&c);
14 printf("%c,%c,%c",a,b,c);
15 }
如果用数组来处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中即可。数组是变量,有空间存储地址,可以存放数组元素,要显示20项数值,直接提取20项数据。
编写程序:
# include < stdio . h >
int main ()
int i ;
int f[20]={1,1};
//对最前面两个元素[0]和[1]赋初值1,1。
for ( i =2; i <20; i +)
f[i]=f[i﹣2]+f[i﹣1] ;//先后求出 f [2]~[19]的值
for ( i =0; i <20; i +)
if ( i %5==0) printf ("\ n ");
printf ("d",f[ i ]);
//控制每输出5个数后换行
//输出一个数
printf ("\ n ");
return 0;
该程序只计算20个数,定义数组长度为20,对最前面两个元素 f [0]和 f [1]均指定初值为1,根据数列的特点,由前面两个元素的值可计算出第3个元素的值,即
f[2]= f [0]+f[1];
在循环中可以用以下语句依次计算出 f [2]~ f [19]的值。
f[i ]=f[i-2] f[i-1];
if 语句用来控制换行,每行输出5个数据。
5定义和引用二维数组
有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组。
如果建立一个数组 pay ,它应当是二维的,第一维用来表示第几分队,第二维用来表示第几个队员。例如用 pay2;3表示2分队第3名队员的工资,它的值是1725。
二维数组常称为矩阵( matrix )。把二维数组写成行( row )和列( column )的排列形可以有助于形象化地理解二维数组的逻辑结构。
5.1怎样定义二维数组
怎样定义二维数组呢?其基本概念与方法和一维数组相似。如:
float pay [3][6];
以上定义了一个 float 型的二维数组,第1维有3个元素,第2维有6个元素。每一维的长度分别用一对方括号括起来。
二维数组定义的一般形式为
类型说明符 数组名[常量表达式常量表达式];
例如:
float a [3][4], b [5][10];
定义 a 为3×4(3行4列)的数组, b 为5X10(5行10列)的数组。注意,不能写成
float a [3,4],b [5,10]; //在一对方括号内写两个下标,错误
C 语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把 a 看作一个一维数组,它有3个元素:
a [0]. a [1], a [2]
每个元素又是一个包含4个元素的一维数组。
a [0]… a [0][ 0] a [ o ][1] a [0] [2] a [0 ][3]
a [1]…a[1][0] a [1][1] a [1][2] a [1][3]
a [2]-- a [2][0] a [2][1] a [2][2] a [2][3]
可以把 a [0], a [1], a [2]看作3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于
float a [0] [4], a [1][4], a [2][4];
此处把 a [0], a [1], a [2]看作一维数组名。
C 语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。
假设数组 a 存放在从2000字节开始的一段内存单元中,一个元素占4个字节,前16个字节(2000~2015)存放序号为0的行中的4个元素,接着的16个字节(2016~2031)存放库号为1的行中的4个元素,余类推。
注意:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
C 语言还允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。
如,定义三维数组的方法如下:
float a [2][3][4];
多维数组元素在内存中的排列顺序为:第1维的下标变化最慢,最右边的下标变化最快。
5.2怎样引用二维数组的元素
二维数组元素的表示形式为数组名[下标][下标]
如: a [2][3]表示 a 数组中序号为2的行中序号为3的列的元素。下标应是整型表达式,
如 a [2-1][2*2-1]。不要写成 a [2,3] 或a [2-1,2*2-1]形式。
数组元素可以出现在表达式中,也可以被赋值,如:
b [1][2]= a [2][3]/2
注意:在引用数组元素时,下标值应在已定义的数组大小的范围内。在这个问题上常出现錯误。例如:
int a [3][4];
a [3][4]=3;
按以上的定义,数组 a 可用的“行下标”的范围为0~2,“列下标”的范围为0~3。
//定义 a 为3X4的二维数组
//不存在 a [3][4]元素
a [3][4]表示元素显然超过了数组的范围。
注意:请读者严格区分在定义数组时用的 a [3][4]和引用元素时的 a [3][4]的区别
前者用 a [3][4]来定义数组的维数和各维的大小,后者 a [3][4]中的3和4是数组元素下标值,a [3][4]代表行序号为3、列序号为4的元素(行序号和列序号均从0起算)。
5.3二维数组的初始化
可以用“初始化列表”对二维数组初始化。
(1)可以分行给二维数组赋初值。如:
int a [3][4]={(1,2,3,4),(5,6,7,8),(9.10,11,12)};
这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的教据赋给第2行的元素………,即按行赋初值。
(2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。如:
int a [3][4]={1,2,3,4,5,6,7,8,9,10,11,12);
效果与前相同。但以第(1)种方法为好,一行对一行,界限清楚。用第(2)种方法如果数据多,则会写成一大片,容易遗漏,不方便检查发现错误。
(3)可以对部分元素赋初值。例如: int a [3][4]={1},{5},(9};
它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。
(4)也可以对各行中的某一元素赋初值。如:
int a [3][4]={(1),(0,6),(0,0,11)}
这种方法对非0元素少时比较方便,不必将所有的0都写出来,只须输入少量数据,
(5)也可以只对某几行元素赋初值:
int a [3][4]={(1),(5,6)};
用数组处理批量数据
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com