数组元素作为函数的参数时,只传送作为实参的数组元素,和其他简单变量作为函数参数没有区别,值参。
示例:利用判断素数的函数,找出一个整型数组的所有素数。
设计判断素数的函数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函数值 | 0 | 1 | 2 | 3 | 4 |
对应等级 | 优秀 | 良好 | 中等 | 及格 | 不及格 |
对应技术元素 | 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;
}