实验6 函数
一、实验目的
1、熟悉定义函数、声明函数的方法;
2、熟悉调用函数时,实参与形参的对应关系,以及“值传递”方式;
3、掌握函数调用的几种形式;
4、熟悉函数的嵌套调用和递归调用及其使用方法;
5、熟悉全局变量和局部变量的概念和用法;
6、熟悉对多文件的程序的编译和运行。
二、实验内容与实验结果
编程题1:
写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
#include <math.h>
#include <stdio.h>
/*素数又叫质数。素数,指的是“大于1的整数中,只能被1和这个数本身整除的数”*/
int prime(int n);
int prime(int n) {
int i;
for (i = 2; i < n; i++)
if (n % i == 0)
return 0;
return 1;
}
int main() {
int n;
printf("please enter an integer:>>");
scanf("%d", &n);
if (prime(n))
printf("%d is a prime.\n", n);
else
printf("%d is not a prime.\n", n);
return 0;
}
编程题2:
编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。在主函数中输入字符串以及输出上述结果。
/*编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。
在主函数中输入字符串以及输出上述结果。*/
#include<stdio.h>
int letter,digit,space,others;//定义全局变量
void count(char str[]);
void count(char str[]){
int i;
for (i=0;str[i]!='\0';i++)
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
letter++;
else if (str[i]>='0'&&str[i]<='9')
digit++;
else if(str[i]==32)//空格个数
space++;
else
others++;
}
int main(){
char string[100];
printf("please enter a string:>>");
fgets(string,100,stdin);
letter=0,digit=0,space=0,others=0;
count(string);
printf("\nletter=%d\ndigit=%d\nspace=%d\nothers=%d\n",letter,digit,space,others);
return 0;
}
编程题3:
写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。
#include <stdio.h>
#include <string.h>
#define N 10
char str[N];
//起泡排序
void sort(char str[]);
void sort(char str[]) {
int i, j, flag = 1;
char t;
for (j = 1; j < N; j++) {
if (!flag)
break;
flag = 0;
for (i = 0; (i < N - j) && (str[i] != '\0'); i++)
if (str[i] > str[i + 1]) {
t = str[i];
str[i] = str[i + 1];
str[i + 1] = t;
flag = 1;
}
}
}
int main() {
int i, flag;
printf("please input ten chars:>>");
for (i = 0; i <= 10; i++)
scanf("%c", &str[i]);
sort(str);
printf("sorted string:>>");
for (i = 0; i < N; i++)
printf("%c", str[i]);
printf("\n");
return 0;
}
编程题4:
用递归方法求n阶勒让德多项式的值,递归公式为:
P
n
(
x
)
=
{
1
n
=
0
x
n
=
1
(
(
2
n
−
1
)
×
x
−
P
n
−
1
(
x
)
−
(
n
−
1
)
×
P
n
−
2
(
x
)
)
/
n
n
≥
1
P_{n}(x)=\left\{\begin{array}{cc} 1 & n=0 \\ x & n=1 \\ \left((2 n-1) \times x-P_{n-1}(x)-(n-1) \times P_{n-2}(x)\right) / n & n \geq 1 \end{array}\right.
Pn(x)=⎩⎨⎧1x((2n−1)×x−Pn−1(x)−(n−1)×Pn−2(x))/nn=0n=1n≥1
#include <math.h>
#include <stdio.h>
float formula(int n, float x);
float formula(int n, float x) {
if (n == 0)
return 1;
else if (n == 1)
return x;
else
return ((2 * n - 1) * x - formula((n - 1), x) - (n - 1) * formula((n - 2), x)) / n;
}
int main(){
int n;
float x;
printf("please input n and x:>>");
scanf("%d%f", &n, &x);
printf("value is %5.2f\n", formula(n,x));
return 0;
}
编程题5:
输入10个学生5门课的成绩,分别用函数实现下列功能:
1、计算每个学生平均分;
2、计算每门课程的平均分;
3、找出所有50个分数中最高的分数所对应的学生和课程
#include <stdio.h>
#define A 10
#define B 5
float score[A][B];
float stu[A], cour[B];
int r, c;
//输入学生成绩信息
void info();
void info() {
int i, j;
for (i = 0; i < A; i++) {
printf("\nplease input the score of student %d:>>", i + 1);
for (j = 0; j < B; j++)
scanf("%f", &score[i][j]);
}
}
//计算每个学生平均分
void aver_score();
void aver_score() {
int i, j;
float sum;
for (i = 0; i < A; i++) {
for (j = 0, sum = 0; j < B; j++)
sum += score[i][j];
stu[i] = sum / B;
}
}
//计算每门课程的平均分
void aver_course();
void aver_course() {
int i, j;
float sum;
for (j = 0; j < B; j++) {
for (i = 0, sum = 0; i < A; i++)
sum += score[i][j];
cour[j] = sum / A;
}
}
//所有50个分数中最高的分数所对应的学生和课程
float highest();
float highest() {
float high = score[0][0];
int i, j;
for (i = 0; i < A; i++)
for (j = 0; j < B; j++)
if (score[i][j] > high) {
high = score[i][j];
r = i + 1;
c = j + 1;
}
return high;
}
int main() {
int i, j;
float h;
info();
aver_score();
aver_course();
printf("\nNO.\tcourse1\tcourse2\tcourse3\tcourse4\tcourse5\taver\n");
for (i = 0; i < A; i++) {
printf("\nNO%2d", i + 1);
for (j = 0; j < B; j++)
printf("%8.2f", score[i][j]);
printf("%8.2f\n", stu[i]);
}
printf("\naverage:");
for (j = 0; j < B; j++)
printf("%8.2f", cour[j]);
h = highest();
printf("\nhighest:%8.2f\tNO.%2d\tcourse%2d\n", h, r, c);
return 0;
}
三、调试分析及经验总结
第一题
可以将for (i = 2; i < n; i++)
改成 for (i = 2; i < n/2; i++) 或者 for (i = 2; i <=sqrt(n); i++)
来提高计算机运算效率
############################################################################
函数的形参属于局部变量,仅在定义的函数内有效,函数返回后失效。
全局变量:在整个工程文件内都有效;“在函数外定义的变量”,即从定义变量的位置到本源文件结束都有效。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值。