文章目录
-
初试数组
-
数组的使用(如何让定义和使用数组,数组的下标和下标的范围)
-
数组的例子:统计个数
-
数组运算
-
数组例子:素数
-
二维数组
前言
系统学习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++;
}
}