第六周数组与函数

一、数组

<类型>变量名称[元素数量]

元素数量必须是整数

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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值