数组元素作为函数参数

数组元素作为函数的参数时,只传送作为实参的数组元素,和其他简单变量作为函数参数没有区别,值参。

示例:利用判断素数的函数,找出一个整型数组的所有素数。

设计判断素数的函数prime(),

原型:int prime(int k);

功能:当K为素数时,函数值为1;否则,函数值为0.

在主函数main()中建立一个自然数数组natural,然后将其每一个数组元素作为参数调用prime()。


#include<stdio.h>
#include<math.h>
#define N 10
int main(){
    int prime(int);
    int i,natural[N];
    printf("Data:");
    for(i=0;i<N;i++)
    scanf("%d",&natural[i]);
    for(i=0;i<N;i++)
    if(prime(natural[i]))
    printf("%d",natural[i]);
    printf("\n");
}
int prime(int k){
    int sk,i;
    int flag=1;
    sk=sqrt(k);
    for(i=2;i<=sk;i++)
    if(k%i==0){
        flag=0;
        break;
    }
    return flag;
}

一维数组名作为函数参数

数组名的实本质是数组的首地址。数组名作为函数参数时传送的是数组的开始地址,是一种 传址调用。形参数组和实参数组要在各自的函数中进行等同的定义,地址参数。

示例:利用求数列最大值元素的函数vMax(),求一维数组元素的最大值。

#include<stdio.h>
#define N 10
int main(){
    int vMax(int a[N],int);
    int data[N],i;
    printf("Data:");
    for(i=0;i<N;i++)
    scanf("%d",&data[i]);
    printf("Max=%d\n",vMax(data,N));
    return 0;
}
int vMax(int a[],int n){
    int i;
    int max=a[0];
    for(i=1;i<0;i++)
    if(max<a[i])
    max=a[i];
    return max;
}

简写:

#include<stdio.h>

#define N 10

int main(){

    int vMax(int [],int);

    int data[50],i;

    printf("Data:");

    for(i=0;i<N;i++)

    scanf("%d",&data[i]);

    printf("Max=%d\n",vMax(data,N));

}

int vMax(int a[],int n){

    int i;

    int max=a[0];

    for(i=1;i<n;i++)

    if(max<a[i])

    max=a[i];

    return max;

}

输入一个字符串,;利用自定义函数统计其中数字字符的个数。

#include<stdio.h>

int countDigitalChar(char str[]){

    int i,count;

    for(i=0;count=0;str[i]!='\0';i++)

    if(str[i]>='0'&&str[i]<='9')

    count++;

    return count;

}
#include<stdio.h>
#define N 100
int main(void)
{
    char string[N];
    int count_s(char []);
    gets(string);
    printf("Total:%d\n",count_s(string));
    return 0;
}
int count_s(char str[])
{
    int i,count;
    for(i=0,count=0;str[i]!='\0';i++)
    if(str[i]>='0'&&str[i]<='9')count++;
    return count;
}

二维数组VS一维数组

  • 二维数组为数组元素为一维数组的一维数组
  • 行优先:二维数组在内存中按夯筑列存储
  • 个数组元素一次占用连续的存储单元
  • 存储后的状态与一维数是没有区别的
  • 可以用对应的一维数组处理二维数组

example可视为由example[0]和example[1]两个元素构成的一维数组。

example[0]、example[1]又可视为分别存储二维数组example各行元素的一维数组。

若把一维数组p映射到m*n的二维数组example的存储空间,则二维数组元素和一维数组元素有如下对应关系:

example[i][j]->p[i*n+j]

example[0]->

example[0][0]p[0]
example[0][1]p[1]
example[0][2]p[2]

example[1]->

example[1][0]p[3]
example[1][1]p[4]
example[1][2]p[5]

求下列3*4矩阵的所有元素的和

16 27 8 -6

-17 21 5 19

66 9 58 86

int sumArray(int a[],int m,int n){
    int i,s=0;
    for(i=0;i<m*n;i++)
    s+=a[i];
    return s;
}
#include<stdio.h>
int main(){
    int arr[3][4]={{16,27,8,-6},{-17,21,5,19},{66,9,58,86}};
    printf("sum=%d\n",sumArray(arr[0],3,4));
}

int sumArray(int a[],int m,int n){

    int i,s=0;

    for(i=0;i<m*n;i++)

    s+=a[i];

    return s;

}

#include<stdio.h>

int main(){

    int arr[3][4]={{16,27,8,-6},{-17,21,5,19},{66,9,58,86}};

    printf("sum=%d\n",sumArray(arr[0],3,4));

}


函数应用 等级划分

通过用户函数实现“学生成绩分等统计”

设计flag()函数,其功能为按课程成绩判定等级,其原型如下:

int flag(int x,int y)

其中,形参x、y代表课程成绩。

对应于5个等级,flag()函数有5种取值。

flag函数值01234
对应等级        优秀良好中等及格不及格
对应技术元素r[0]r[1]r[2]r[3]r[4]
#include<stdio.h>
#define N 6
int main(void)
{
    int flag(int,int);
    int s1,s2,i;
    static int r[5];
    for(i=0;i<N;i++)
    {
        printf("Score:");
        scanf("%d,%d",&s1,&s2);
        r[flag(s1+s2)]++;

    }
    for(i=0;i<5;i++)
    printf("%d",r[i]);
    printf("\n");
}
int flag(int x ,int y)
{
    int ave;
    ave=(x+y)/2;
    if(ave>=90)return 0;
    else if(ave>=80)return 1;
    else if(ave>=70)return 2;
    else if(ave>=60)return 3;
    else return 4;
}
#include<stdio.h>
#define N 6
int main(void)
{
    int flag(int,int);
    int s1,s2,i;
    static int r[5];
    for(i=0;i<N;i++)
    {
        printf("Score:");
        scanf("%d,%d",&s1,&s2);
        r[flag(s1,s2)]++;

    }
    for(i=0;i<5;i++)
    printf("%d",r[i]);
    printf("\n");
}
int flag(int x,int y){
    int ave,i;
    ave=(x+y)/2;
    switch(ave/10){
        case 10:
        case 9:i=0,break;
        case 8:i=1,break;
        case 7:i=2,break;
        case 6:i=3,break;
        otherwise:i=4;
    }
    return i;
}

哥德巴赫猜想

哥德巴赫猜想:

任一大于2定的偶数都可写成两个素数之和利用判断素数的函数prime()求解哥德巴赫猜想

(1)判断素数的函数prime()原型如下

int prime(int n)

若为素数,则函数prime(n)值为1,否则prime(n)为0。

(2)对于任何偶数n(n>6),n=i+(n-i),若prime(i)、prime(n-i)均为1,即为n的哥德巴赫猜想式。

#include<stdio.h>
#include<math.h>
int prime(int n)/*判断素数函数*/
{
    int i;
    for(i=2;i<=sqart(n);i++)
    if(n%i==0)return 0;
    return 1;
}
int main(void){
    int i,n;
    scanf("%d",&n);
    for(i=3;i<=n/2;i+=2)
        if(prime(i)&&prime(n-i))
        printf("%d=%d+%d\n",n,i,n-i),break;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靳向阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值