一、数组
<类型>变量名称[元素数量]
元素数量必须是整数
C99之前:元素数量必须是编译时刻的字面量。
一旦创建无法改变大小
*数组中的元素在内存中是连续依次排列的。
数组中的每个单元就是数组类型的一个变量。
使用数组时[]中的数字叫做下标或索引,下标从0开始计数;
数据可以存放在变量里,每一个变量有一个名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存这些数据,而不是用很多个独立的变量。数组是长度固定的数据结构,用来存放指定的类型的数据。一个数组里可以有很多个数据,所有的数据的类型都是相同的。
计算用户输入数字的平均数,并输出所有大于平均数的数
#include<stdio.h>
int main()
{
int x;
double sum = 0;
int cnt = 0;
int number[100]; //定义一个 int 型,最大100个的一个数组。
scanf("%d",&x);
while( x != -1 )
{
number[cnt] = x; //对数组中的元素进行赋值
sum += x;
cnt ++;
scanf("%d",&x);
}
if (cnt>0)
{
int i;
double average = sum/cnt;
for(i=0; i<cnt; i++) //遍历数组
if(number[i] > average) //使用数组中的变量,拿number数组中的值与average作比较。
{
printf("%d\n",number[i]); //打印出来这些数。
}
}
return 0;
}
输入不确定的[0,9]范围内的整数,统计每一种数字出现的,输入-1表示结束。
count[x]++ == count[x]=count[x]+1:就是count第x个元素+1
二、函数的定义与使用
求素数的和
#include<stdio.h>
int main(void)
{
int m, n;
int sum = 0;
int cnt = 0;
int i;
scanf("%d %d",&m ,&n);
//m=10,n=31;
if (m==1) m=2;
for(i=m; i<=n; i++)
{
int isPrime = 1;
int k;
for(k=2; k<i-1; k++)
{
if(i%k == 0)
{
isPrime = 0;
break;
}
}
if(isPrime)
{
sum += i;
cnt++;
}
}
printf("%d %d\n",cnt ,sum);
return 0;
}
求素数和——代码函数的运用
#include<stdio.h>
int isPrime(int i)
{
int ret = 1;
int k;
for(k=2; k<i-1; k++)
{
if(i%k == 0)
{
ret = 0;
break;
}
}
return ret;
}
int main()
{
int m, n;
int sum = 0;
int cnt = 0;
int i;
scanf("%d %d",&m ,&n);
//m=10,n=31;
if (m==1) m=2;
for(i=m; i<=n; i++)
{
if(isPrime(i))
{
sum += i;
cnt++;
}
}
printf("%d %d\n",cnt ,sum);
return 0;
}
求和——求出1-10,20-30,35-40的三个和
#include<stdio.h>
int main()
{
int i;
int sum;
for(i=1,sum=0; i<=10; i++ )
{
sum += i;
}
printf("1-10的和%d\n",sum);
for(i=20,sum=0; i<=30; i++ )
{
sum += i;
}
printf("20-30的和%d\n",sum);
for(i=35,sum=0; i<=40; i++ )
{
sum += i;
}
printf("35-40的和%d\n",sum);
return 0;
}
代码复制是程序不良的表现
数段内求和(完善后)
#include<stdio.h>
void sum(int begin, int end) //定义了一个自己的函数
{
int i;
int sum=0;
for(i=begin; i<=end; i++)
{
sum += i;
}
printf("%d-%d的结果是%d\n",begin ,end ,sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,40);
return 0;
}
实现分功能编程,便于模块化编程
函数
函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值。
函数的定义
void:不返回任何类型和值。
函数的调用
函数名(参数值);
()起到了表示函数调用的重要作用;
即使没有参数也需要();
如果有参数,则需要给出正确的数量和顺序;
这些值会被按照顺序依次用来初始化函数中的参数。
函数返回
函数知道每一次是哪里调用它,会返回到正确的地方。
return停止函数的执行,并返回一个值;
return;
return 表达式;
一个函数里面可以出现多个return。
如果函数有返回值,必须使用带值的return!
三、函数的参数和变量
原型声明可以不写变量名字,写变量名字只是让人更好理解。
本地变量的规则
本地变量定义在块内
它可以定义在函数的块内
也可以定义在语句的块内
甚至可以随便拉一对大括号来定义变量
程序进入这个块之前,这个变量不存在,离开这个块,其中的变量就消失
块外面定义的变量在里面仍然有效。
块里面定义了和外面同名的变量则掩盖了外面的。
不能在一个块内定义同名的变量。
本地变量不会被默认初始化。
参数在进入函数的时候会被初始化。
逗号运算符
f(a,b) //逗号算标点符号
f((a,b)) //逗号算运算符
C语言不允许函数的嵌套。可以放声明,但是不可以放定义。
main函数
int main() 也是一个函数
四、二维数组
二维数组的遍历
a[i][j]是一个int :表示第i行第j列上的单元。
二维数组的初始化
int a[][5] =
{
{0,1,2,3,4},
{2,3,4,5,6},
};
列数必须是给出的,行数可以由编译器来数;
每行一个{},逗号分隔;
最后的逗号可以存在,有古老的传统;
如果省略,表示补零;
也可以用定位(*C99 ONLY)
tic-tac-toe游戏(井字棋)
读入一个3X3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示为O;
程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜。
#include<stdio.h>
int main()
{
const int size = 3;
int board[size][size];
int i,j;
int numofX;
int numofo;
int result = -1; //-1:没人赢 1:X赢 0:O赢
//读入阵列
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(numofo == 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(numofo == size)
{
result = 1;
}
}
}
//检查正对角线
numofo = numofX = 0;
for(i=0; i<size; i++)
{
if(board[i][j] == 1)
{
numofo++;
}else
{
numofX++;
}
}
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)
{
numofo++;
}else
{
numofX++;
}
}
return 0;
}