C语言数组

文章目录

  • 初试数组

  • 数组的使用(如何让定义和使用数组,数组的下标和下标的范围)

  • 数组的例子:统计个数

  • 数组运算

  • 数组例子:素数

  • 二维数组



前言

系统学习C语言数组

一.初试数组

如何写一个程序计算用户输入的数字的平均数?

int x;
	double sum=0;
	int cnt=0;
	scanf("%d",&x);
	while(x!=-1){
		sum+=x;
		cnt++;
		scanf("%d",&x);
	} 
	if(cnt>0){
		printf("%f\n",sum/cnt);
	}

不需要记录输入的每一个数

如何写一个程序计算用户输入的数字的平均数,并输出所有大于平均数的数?

如何记录很多数? int num1,num2,num3.....?

数组

  • int number[100];
  • scanf("%d",&number[i]);
#include<stdio.h> 
int main()
{
	int x;
	double sum=0;
	int cnt=0;
	int number[100];//定义数组 
	scanf("%d",&x);
	while(x!=-1){
		number[cnt]=x;// 对应数组元素的赋值 
		sum+=x;
		cnt++;
		scanf("%d",&x);
	}
	if(cnt>0){
		printf("%f\n",sum/cnt);
		int i;
		for(i=0;i<cnt;i++){
			if(number[i]>sum/cnt){  //使用数组中的元素 
				printf("%d\n",number[i]);//遍历数组 
			}
		}	
	}
	return 0;
}

二.数组的使用(如何让定义和使用数组,数组的下标和下标的范围)

定义数组:

  • <类型>变量名称[元素数量];
  • int grades[100];
  • double weight[20];
  • 元素数量必须是整数

数组:

  • 是一种容器(放东西的东西):其中所有的元素具有相同的数据类型;一旦创建,不能改变大小
  • 数组中的元素在内存中是连续依次排列的

int a[10]

  • 一个int的数组
  • 10个单元:a[0],a[1],.....a[9]
  • 每个单元就是一个int类型的变量
  • 可以出现在赋值的左边或右边
  • a[2]=a[1]+6
  • *在赋值左边的叫做左值

数组的单元:

  • 数组中的每个单元就是数组类型的一个变量
  • 使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数

有效的下标范围

长度为0的数组?int a[0]; 可以存在,但是无用

三.数组的例子:统计个数

写一个程序,输入数量不确定的【0,9】范围内的整数,统计每一种数字出现的次数,输入-1表示结束

#include<stdio.h> 
int main(void)
{
	const int number=10;//数组的大小 
	int x;
	int count[number];//定义数组 
	int i;
	for(i=0;i<number;i++){//初始化数组 
		count[i]=0;
	}
	scanf("%d",&x);
	while(x!=-1) {
		if(x>0&&x<=9){
			count[x]++;//数组参与运算 
		}
		scanf("%d",&x);
	}
	for(i=0;i<number;i++){//遍历数组输出 
		printf("%d:%d\n",i,count[i]); 
	}
	return 0;
}

四.数组运算

在一组给定的数据中,如何找出某个数据是否存在?

#include<stdio.h> 
int search(int key,int a[],int length);
int main(void)
{
	int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32};
	int x;
	int loc;
	printf("请输入一个数字: ");
	scanf("%d",&x);
	loc=search(x,a,sizeof(a)/sizeof(a[0]));
	if(loc!=-1){
		printf("%d在第%d个位置上\n",x,loc);
	}
	else{
		printf("%d不存在\n",x);
	}
	return 0;
}
int search(int key,int a[],int length)
{
	int ret=-1;
	int i;
	for(i=0;i<length;i++){
		if (a[i]==key){
			ret=i;
			break;
		}
	}	
	return ret;
}

数组的集成初始化

int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32};

int a[5]=2  //2 0 0 0 0

集成初始化时的定位:

  • 用[n]在初始化数据中给出定位
  • 没有定位的数据接在前面的位置后面
  • 其他位置的值补零
  • 也可以不给出数组的大小,让编译器算
  • 特别适合初始数据稀疏的数组

数组的大小:

  • sizeof给出整个数组所占的内容的大小,单位是字节 sizeof(a)/sizeof(a[0])
  • sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组的单元个数
  • 这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码

数组的赋值

  • 数组变量本身不能被赋值
  • 要把一个数组的所有元素交给另一个数组,必须采用遍历

数组作为函数参数时,往往必须再用另一个参数来传入数组的大小

五.数组例子:素数

判断素数

int isPrime(int x);
int main(void)
{
	int x;
	scanf("%d",&x);
	if(isPrime(x)){
		printf("%d是素数\n",x);
	}else{
		printf("%d不是素数\n",x);
	}
	return 0;
 }

从2到x-1测试是否可以整除

  • 对于n要循环n-1遍
  • 当n很大时就是n遍
int isPrime(int x);
 {
 	int ret=1;
 	int i;
 	if(x==1)ret=0;
 	for(i=2;i<x;i++){
 		int(x%i==0){
 			ret=0;
 			break;
		 }
	 }
 	return ret;	
 }

去掉偶数后,从3到x-1,每次加2

  • 如果x是偶数,立刻
  • 否则要循环(n-3)/2+1遍
  • 当n很大时就是n/2遍
int isPrime(int x);
 {
 	int ret=1;
 	int i;
 	if(x==1||x!=2)ret=0;
 	for(i=3;i<x;i+=2){
 		int(x%i==0){
 			ret=0;
 			break;
		 }
	 }
 	return ret;	
 }
 

判断是否能被已知的且<x的素数整除

#include<stdio.h>
int isPrime(int x,int KnowPrimes[],int number0fKnownPrimes);
int main(void)
{
	const int number=10;
	int prime[number]={2};
	int count=1;
	int i=3;
	while(count<number){
		if(isPrime(i,prime,count)){
			prime[count++]=i;
		}
		i++;
		{
			for(i=0;i<number;i++){
				printf("%d",prime[i]);
				if((i+1)%5) printf("\t");
		else printf("\n");
			}
			
		return 0;
}
int isPrime(int x,int KnowPrimes[],int number0fKnownPrimes)
{
	int ret=1;
	int i;
	for(i=0;i<number0fKnownPrimes;i++){
		if(x%KnowPrimes[i]==0){
			ret=0;
			break;
		}
	}
	return ret;

}

六.二维数组

  • int a[3][5];
  • 通常理解为a是一个3行5列的矩阵

二维数组的遍历

for(i=0;i<3;i++){
	for(j=0;j<5;j++){
		a[i][j]=i*j;
	}
}
  • a[i][j]是一个int
  • 表示第i行第j列上的单元
  • a[i,j]是什么?

二维数组的初始化

int a[][5]={{0,1,2,3,4},{2,3,4,5,6},};

  • 列数是必须给出的,行数可以由编译器来数
  • 每一行{},逗号分隔
  • 最后的逗号可以存在
  • 如果省略,表示补零

const int size=3;
int board[size][size];
int i,j;
int numofx;
int numofo;
int result=-1 //-1平局 1x赢 0o赢
//读入矩阵 
for(i=0;i<size;i++) {
	for(j=0;j<size;j++){
		scanf("%d",&board[i][j]);
	}
}
//检查行
 for(i=0;i<size&&result==-1;i++){
 	numofo=numofx=0;
 	for(j=0;j<size;j++){
 		if(board[i][j]==1)
 		numofx++;
	 }
	 else{
	 	numofo++;
	 }
}
if(numofo==size){
	result=0;
}else if(numofx==size){
	result=1
}
//检查列
if(result==-1) {
	for(j=0;j<size&&result==-1;j++){
 	numofo=numofx=0;
 	for(i=0;i<size;i++){
 		if(board[i][j]==1)
 		numofx++;
	 }
	 else{
	 	numofo++;
	 }
}
if(numofo==size){
	result=0;
}else if(numofx==size){
	result=1;
}
//检查对角线
numofo=numofx=0;
{
	for(i=0;i<size;i++){
 	if(board[i][j]==1)
 		numofx++;
	 }
	 else{
	 	numofo++;
	 }
}
if(numofo==size){
	result=0;
}else if(numofx==size){
	result=1;
} 
numofo=numofx=0;

	for(i=0;i<size;i++){
 	if(board[i][size-i-1]==1){
 		numofx++;
	 }
	 else{
	 	numofo++;
	 }
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值