浙大C语言笔记-数组与函数

浙大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了返回值,错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值