浙大C语言笔记,原视频链接:https://www.icourse163.org/learn/ZJU-199001?tid=1450247457#/learn/content?
数组
输入一组数求平均数:
#include <stdio.h>
int main ()
{
int x ;
double sum = 0;
int cnt = 0;
scanf("%d",&x);
while(x != -1){
sum += x;
cnt ++;
scanf("%d",&x);
}
if (cnt > 0){
printf("%d\n",sum/cnt);
}
}
可以发现是不需要记录每一个数字的
如何计算用户输入的平均数,并且输出所有大于平均数的数?
如何记录每一个数呢?
—数组
#include <stdio.h>
int main ()
{
int x ;
double sum = 0;
int cnt = 0;
int number[100];//定义数组,里面不超过100个数
scanf("%d",&x);
while(x != -1){
sum += x;
number[cnt] = x;//对数组里的元素赋值
cnt ++;
scanf("%d",&x);
}
if (cnt > 0){
int i = 0;
double average = sum/cnt;
for (i=0;i<cnt;i++){
if(number[i]>average){
printf("%d\n",number[i]);//遍历数组
}
}
}
}
数组的定义和特性
为了避免越界带来的麻烦有两种解决方法:
- 检查,当输入的元素数超过了数组的大小,程序终止
- 利用C99的特性,[]内的元素可以是动态的,eg:
int number[cnt];//cnt是可以变化的
小问题:int a[0];存在么?(即长度为0的数组存在么?)
–存在的,但是没有意义
应用
输入10个数,输出每个数出现的次数:
根据上面我们说到的数组大小可以是动态的,把10 换成number,如下:
函数的定义和使用
在之前我们做素数求和的时候,for循环是比较大,比较复杂的,我们可以定义一个函数,将原来的for循环拆解开。
将它变成函数:
#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(10,20);
sum(20,30);
sum(35,40);
return 0;
}
注意:()表示函数调用,即使没有参数也必须要有()
void 不能使用带值的return,调用的时候也不能做返回值的赋值
标题函数的参数与变量
函数的原型声明(函数头取出来)必须要放在函数调用前面
本地变量:
原型的参数一定要写全,如果确定函数没有参数,void p(void),括号里的void写上去!
如果想要使用运算符,就像上图所示,再加上一层圆括号。
二维数组
这个游戏的代码如下:
#include <stdio.h>
int main()
{
const int size = 3;
int board[size][size];
int i, j;
int numOfX1;
int numOfO1;
// 添加两个变量,判断行列的时候,标记列中X和O的个数;判断对角线的时候,标记另一条对角线的X和O的而数量;以便减少循环次数。
int numOfX2;
int numOfO2;
int result = -1;
// 读入矩阵
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++)
{
numOfX1 = numOfO1 = numOfX2 = numOfO2 = 0;
for (j = 0; j < size; j++)
{
if (board[i][j] == 1)
{
numOfX1++;
}
else
{
numOfO1++;
}
if (board[j][i] == 1)
{
numOfX2++;
}
else
{
numOfO2++;
}
}
if (numOfO1 == size || numOfO2 == size)
{
result = 0;
}
else if (numOfX1 == size || numOfX2 == size)
{
result = 1;
}
}
// 判断对角线
if (result == -1)
{
numOfX1 = numOfO1 = numOfX2 = numOfO2 = 0;
for (i = 0; i < size && result == -1; i++)
{
if (board[i][i] == 1)
{
numOfX1++;
}
else
{
numOfO1++;
}
if (board[i][size - i - 1] == 1)
{
numOfX2++;
}
else
{
numOfO2++;
}
}
if (numOfO1 == size || numOfO2 == size)
{
result = 0;
}
else if (numOfX1 == size || numOfX2 == size)
{
result = 1;
}
}
if (result == 0)
{
printf("O方胜\n");
}
else if (result == 1)
{
printf("X方胜\n");
}
else
{
printf("平局\n");
}
return 0;
}
void是没有返回值的,B选线return了返回值,错误