C语言编程一维数组的使用
- 格式:doc
- 大小:3.14 MB
- 文档页数:9
数组笔记在程序设计中,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。
一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
1.一维数组的定义和引用1.一维数组的定义方式在C语言中使用数组必须先进行定义。
一维数组的定义方式为:类型说明符数组名[常量表达式];其中:类型说明符是任一种基本数据类型或构造数据类型。
数组名是用户定义的数组标识符。
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
例如:int a[10]; 说明整型数组a,有10 个元素。
float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。
char ch[20]; 说明字符数组ch有20 个元素。
对于数组类型说明应注意以下几点:1)数组的类型实际上是指数组元素的取值类型。
对于同一个数组,其所有元素的数据类型都是相同的。
2)数组名的书写规则应遵循标识符命名规则。
3)数组名不能与其它变量名相同。
例如:main(){int a; float a[10];……}是错误的。
4)方括号中常量表达式表示数组元素的个数,如a[5]表示数组a 有5 个元素。
但是其下标从0 开始计算。
因此5 个元素分别为a[0],a[1],a[2],a[3],a[4]。
5)常量表达式中可以包括常量和符号常量,不能用变量来表示元素的个数,也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
例如:#define FD 5 main(){int a[3+2],b[7+FD];……}是合法的。
但是下述说明方式是错误的。
main(){int n=5; int a[n];……}6)允许在同一个类型说明中,说明多个数组和多个变量。
C语⾔⼀维数组、⼆维数组、结构体的初始化C语⾔数组的初始化表⽰⽅法⼀、C语⾔⼀维数组初始化:(1)在定义数组时对数组元素赋以初值。
如:static int a[10]={0,1,2,3,4,5,6,7,8,9};经过上⾯的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9。
(2)初始化时可以只对⼀部分元素赋初值。
例如:static int a[10]={0,1,2,3,4};定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0。
(3)将数组的元素值全部为0,可以⽤下⾯的⽅法:(⽅法⼀)int a[5] = {0}; // 将整型数组a的每个元素都初始化为0或者也可以⽤如下⽅法进⾏初始化:(⽅法⼆)int a[5] = {0, 0, 0, 0, 0}; // 初始化效果同上不能⽤: static int a[10]={0*10};如果对static型数组不赋初值,系统会对定义的所有数组元素⾃动赋以0值。
(4)在对全部数组元素赋初值时,可以不指定数组长度。
int a[]={0,1,2,3,4};相当于 int a[5]={0,1,2,3,4};⼆、C语⾔⼆维数组初始化:声明时给初始值叫初始化。
例如:int b[3][4]={1,2,3,4,5,6,7,8,4,4,4,4};声明后赋值,可以⽤赋值语句,b[0][0]=1; b[0][1]=2; b[0][2]=3; b[0][3]=4;b[1][0]=5; b[1][1]=6; b[1][2]=7; b[1][3]=8;三、C语⾔结构体初始化:1.typedef定义结构体typedef struct Student {agent age;char name[10];} Stu;2.创建结构体变量并初始化Stu s = {18,"rose"};//可以初始化,设置age为1,s为⼀个字符串.Stu s = {18};//初始化个数少于实际个数时,只初始化前⾯的成员。
一.插入:C语言数组怎么插入一个元素#include<stdio.h>#include<stdlib.h>#define MAX 40void insert(int*p,int n,int m){ int i,k;for(i=0;i<n;i++)if(p[i]>=m){ k=i;break;}for(i=n-1;i>=k;i--)p[i+1]=p[i];printf("%d\n",k);p[k]=m;}void sort(int*p,int n){int i,j;for(i=1;i<n;i++)for(j=0;i+j<n;j++)if(p[j]>p[j+1]){int t;t=p[j+1];p[j+1]=p[j];p[j]=t;}}void main(){int a[MAX];int n,i,m,d;printf("输入数据个数(n<40):");d=scanf("%d",&n);while(d!=1&&n>=40){system("cls");f flush(stdin);printf("请重新输入:");scanf("%d",&n);}printf("请输入数组元素:");for(i=0;i<n;i++)scanf("%d",a+i);printf("请输入要插入的数字:");scanf("%d",&m);sort(a,n);insert(a,n,m);for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}二.删除:在长度是n的数组a中,删除一个指定的元素num。
C语言是一种十分流行的编程语言,它的灵活性和高效性使得它在计算机科学领域中被广泛应用。
在C语言中,数组是一种常用的数据结构,用于存储一系列相同数据类型的元素。
而在定义数组时,我们经常会看到数组名后带有一对中括号的语句,下面我们来详细讨论这个问题。
1. 数组的基本定义在C语言中,数组是一种由相同类型的元素组成的集合。
数组中的元素可以通过数组名和元素的下标来访问,数组的下标从0开始。
数组的基本定义语句如下所示:```cint arr[10];```这条语句定义了一个包含10个整型元素的数组,数组名为arr。
在这个定义语句中,数组名后面紧跟一对中括号,中括号内指定了数组的大小。
2. 数组名后带有一对中括号的定义语句除了基本的数组定义语句外,C语言中还存在一种数组定义语句,即数组名后带有一对中括号的语句。
这种语句的形式如下所示:```cint arr[];```在这个定义语句中,数组名后面的中括号内没有指定数组的大小。
这种语句通常用于声明数组,而不是定义数组。
声明数组时,可以使用不带数组大小的定义语句,用于表明数组的存在,而不需要给出具体的大小。
数组的大小可以在后续的代码中赋值。
例如:```cint arr[];arr[0] = 10;```在这个例子中,我们先声明了一个不带大小的数组arr,然后在后续的代码中为数组的第一个元素赋值为10。
这种声明语句为我们提供了更大的灵活性,允许我们在不确定数组大小的情况下先声明数组。
3. 动态数组的定义C语言中,动态数组是可以在运行时改变大小的数组。
动态数组的定义语句就是数组名后带有一对中括号的语句。
使用动态数组时,数组的大小可以在运行时根据需要动态改变。
例如:```cint size = 10;int *arr = (int *)malloc(size * sizeof(int));```在这个例子中,我们定义了一个指针arr,然后使用malloc函数动态分配了一个包含10个整型元素的数组。
单片机C语言中数组的用法数组是由具有相同类型的数据元素组成的有序集合。
数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。
引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题。
数组与普通变量一样,也必须先定义,后使用。
数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。
下面就对数组进行详细的介绍。
(1)一维数组一维数组是最简单的数组,用来存放类型相同的数据。
数据的存放是线性连续的。
用以下例程说明数组的建立、数据操作:#include/*-----------------------------------------------------此程序用以说明数组的建立、数据操作-----------------------------------------------------*/unsigned char array[10];//定义一个有10个单元的数组void main(){unsigned char i;for(i=0;i<10;i++){array[i]=i; //用下标调用数组中的元素}/*---------------------------------------array |9|8|7|6|5|4|3|2|1|0| [9]~[0]---------------------------------------*/while(1);}数组名是用来表示数组的标识,其实它是数组的首地址,即一个指针。
不过它所表示的地址是固定的,不能改动。
如前几章所述的相关内容,array[2]与*(array+2)是等效的,不过不能用array++,因为array是常量。
上面的程序中的数组是静态建立的,以下例程来用说明数组的动态建立。
#include#include/*-----------------------------------------------------此程序用以说明数组的动态建立-----------------------------------------------------*/unsigned char *parray;void main(){unsigned char i;parray=(unsigned char *)malloc(10); //动态创建一个数组for(i=0;i<10;i++){parray[i]=i; //向数组中赋值}free(parray); //释放数组while(1);}字符串是数组的一个重要特例。
c语言中一维数组的引用
在C语言中,一维数组可以通过指针来引用。
一维数组的名字就是数组的首元素的地址,因此可以使用指针来引用整个数组。
例如,有一个整型数组arr,可以使用指针来引用该数组:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 使用指针引用数组
在上面的代码中,ptr指针变量指向数组arr的首元素的地址。
通过ptr指针,我们可以访问数组中的各个元素:
printf("%d\n", *ptr); // 输出数组的第一个元素
printf("%d\n", *(ptr+1)); // 输出数组的第二个元素
printf("%d\n", *(ptr+2)); // 输出数组的第三个元素
除了使用指针来引用整个数组,也可以使用数组下标来引用数组的元素。
数组下标从0开始,可以通过数组名和下标来访问数组的元素。
例如,使用数组下标引用数组arr的元素:
printf("%d\n", arr[0]); // 输出数组的第一个元素
printf("%d\n", arr[1]); // 输出数组的第二个元素
printf("%d\n", arr[2]); // 输出数组的第三个元素
以上两种方式都可以用来引用一维数组,根据实际需要选择使用。
s+1或&s[1] 是第1个元素的指针,所以s+1、&s[1]就可以表示字符串"hina";s+2或&s[2] 是第2个元素的指针,所以s+2、&s[2] 就可以表示字符串"ina"。
3.一维字符数组的初始化字符数组的初始化有如下两种方式。
(1)按字符方式初始化例如:char s1[5]={'1','2','3','4','5'};char s2[5]={'1','2','3','4'};char s3[]={'1','2','3','4'};初始化后字符数组s1和s3中不包含'\0',不能作为字符串处理,而数组s2中包含有'\0',可以作为字符串处理。
(2)按字符串方式初始化例如:char s4[20]={"Hello,World!"}; /*数组长度是20,把字符串常量赋值给字符数组*/char s5[]="programe"; /*数组长度为9*/使用字符串常量初始化字符数组时,字符串常量可以写在“{ }”内,可以省略“{ }”。
按字符串的方式初始化以后,字符数组s4和s5都可以作为字符串处理。
将字符串初始化给字符数组时应注意字符数组的长度至少应比字符串的长度多1。
例如:char str[5]="china";程序编译出错,因为字符数组str的长度为5,只有5个字节的存储空间,但初值字符串"china"包含6个字符,由5个有效字符和1个字符串结束标志组成,超过了字符数组str的长度。
实际应用中常用字符数组来处理字符串,所以更多情况下使用按字符串的方式初始化。
实验三一维数组的使用【实验目的】1掌握一维数组、二维数组的定义和初始化方法。
2熟悉使用字符数组处理字符串处理的方法。
【实验内容】1.输入10个学生的成绩,求平均成绩,并将低于平均成绩的分数打印出来.编写程序:#include <stdio.h>void readdata (float score[10]){int i;printf("依次输入10个学生的成绩:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);return;}float aver(float score[10]){float sum;int i;for(sum=0,i=0;i<10;i++)sum=sum+score[i];return(sum/10);}void printff(float score[10],float ave){int i;printf("低于平均分的成绩为:\n");for(i=0;i<10;i++)if(score[i]<ave)printf("%8.2f",score[i]);return;}main(){void readdata (float score[10]);float aver(float score[10]);void printff(float score[10],float ave);float ave,score[10];readdata(score);ave=aver(score);printf("average=%6.2f\n",ave);printff(score,ave);}2、将一个数组中的值按逆序重新存放。
例如,原来顺序为8,6,5,4,1。
要求改为1,4,5,6,8。
编写程序:#include <iostream.h>int main(){int i,j,a[5]={8,6,5,4,1},b[5];for(i=0,j=4;i<5,j>=0;i++,j--)b[j]=a[i];for(i=0;i<5;i++)a[i]=b[i];for(i=0;i<5;i++)cout<<a[i]<<"\t";}3、应用一维数组,对10个从键盘输入的数进行冒泡排序,使其按照从大到小的顺序输出。
编写程序:#include <stdio.h>int main(){int a[10];int i = 0,j=0;int max,temp;for(i=0;i<10;++i){printf("Please input the %dth number:",i+1);scanf("%d",&a[i]);}printf("The arry has been input is:\n");for(i=0;i<10;i++){printf("%d,",a[i]);}printf("\n");for(i=0;i<10;i++){max=i;for(j=i;j<10;j++){max= ((a[j]>a[max])?j:max);}temp=a[max];a[max]=a[i];a[i]=temp;}printf("The arry after sort is:\n");for(i=0;i<10;++i){printf("%d,",a[i]);}printf("\n");printf("Plesae input another number:");scanf("%d",&temp);for(i=0;i<10;i++){if(temp>a[i]){break;}}for(j=10;j>=i;--j){a[j]=a[j-1];}a[i]=temp;for(i=0;i<11;i++){printf("%d ",a[i]);}getchar();return 0;}4.编写一程序,从键盘任意输入两个字符串s1和s2,然后比较字符串的大小,若s1>s2,输出1;若s1=s2,输出0;若s1<s2,输出-1;#include <iostream>using namespace std;Int cmp (char *s, char *p);int main(){char m[20],n[20];cin>>m>>n;int i = cmp(m,n);if (i == 0)cout <<"0"<<endl;if (i == 1)cout << "1"<< endl;if (i == -1)cout << "-1" << endl;return 0;}int cmp(char *s, char *p){while (*s&&*p){if (*s>*p)return 1;else if (*s < *p)return -1;else{if (*(s+1) == '\0' && *(p+1) != '\0')return -1;else if (*(s+1) != '\0' && *(p+1) == '\0')return 1;else if (*(s+1) == '\0'&&*(p+1)=='\0')return 0;else{s++,p++;continue;}}}}5.编程序将输入的字符串删去空格输出。
编写程序:#include<iostream.h>void main(){char str[]="You are my friend";int i=0,j;while(str[i]!=NULL){if(str[i]==' '){j=i;while(str[j]!=NULL){str[j]=str[j+1];j++;}}i++;}cout<<str<<endl;}6.求一个4*4矩阵对角线元素之和。
编写程序:#include<stdio.h>main(){int i,j,sum=0,n=0;int a[4][4];printf("输入要计算的矩阵:\n");for(i=0;i<4;i++)for(j=0;j<4;j++){scanf("%d",&a[i][j]);}printf("要计算的矩阵为:\n");for(i=0;i<4;i++)for(j=0;j<4;j++){printf("%d ",a[i][j]);n++;if(n%4==0)printf("\n");}printf("\n");for(i=0;i<4;i++)for(j=0;j<4;j++){if(i==j)sum=sum+a[i][i];}printf("结果是" "%d\n",sum);}7.应用二维数组打印如图所示杨辉三角形。
11 11 2 11 3 3 11 4 6 4 1编写程序:#include<stdio.h>void main(){int i,j;int a[5][5];for(i=0;i<5;i++)a[i][0]=1;for(j=1;j<5;j++)a[0][j]=0;;for(i=1;i<5;i++)for(j=1;j<5;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];;for(i=0;i<5;i++)for(j=0;j<=i;j++){printf("%4d",a[i][j]);if(j==i)printf("\n\n");}}8.找一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。
(二维数组也可能没有鞍点)编写程序:#define H 5 有鞍点:#define L 5#include "stdio.h"void main(){int i,j,k;int a[H][L],min[H];int max[H],col=0;int super[H];for(i=0;i<H;i++)for(j=0;j<L;j++)scanf("%d",&a[i][j]);for(i=0;i<H;i++)max[i]=a[i][0];for(i=0;i<H;i++){ 没有鞍点:{ for(j=0;j<L;j++)if(a[i][j]>max[i]){max[i]=a[i][j];col=j;}}super[i]=col;}for(i=0;i<H;i++)for(k=0;k<H;k++){if(max[i]<=a[k][super[i]])min[k]=max[i];elsebreak;}printf("鞍点=%d\n",min[H-1]);}9.有一篇文章,共有3行文字,每行有80个字符。
要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。
编写程序:#include <stdio.h>#include <string.h>main(){char a[100],b[100],c[100];int l1,l2,l3,d=0,x=0,s=0,k=0,q=0,i;printf("请输入第一行文字\n");gets(a);printf("请输入第二行文字\n");gets(b);printf("请输入第三行文字\n");gets(c);l1=strlen(a);l2=strlen(b);l3=strlen(c);for(i=0;i<l1;i++){ if(a[i]>='a'&&a[i]<='z') x++;if(a[i]>='A'&&a[i]<='Z') d++;if(a[i]>='0'&&a[i]<='9') s++;if(a[i]==' ') k++;}for(i=0;i<l2;i++){ if(b[i]>='a'&&b[i]<='z') x++;if(b[i]>='A'&&b[i]<='Z') d++;if(b[i]>='0'&&b[i]<='9') s++;if(b[i]==' ') k++;}for(i=0;i<l3;i++){ if(c[i]>='a'&&c[i]<='z') x++;if(c[i]>='A'&&c[i]<='Z') d++;if(c[i]>='0'&&c[i]<='9') s++;if(c[i]==' ') k++;}q=l1+l2+l3-x-d-s-k;printf("共有大写字母%d个,小写字母%d个\n,数字%d个,空格%d个,其他字符%d个\n",d,x,s,k,q);}实验收获:1.当一种方法无法继续时,可尝试换用其他方法试试。