任务描述
本关任务:编写一个判断素数的函数,向主函数输入一个整数,输出是否为素数的信息。
相关知识
程序是由多个零件组成的,而函数就是这种“零件”的一个较小的单位。
例如一个 C 程序可以由一个主函数和若干个其他函数构成。主调函数调用其他函数,其他函数可以相互调用。同一个函数可以被一个或多个函数调用任意多次。本关我们就来学习函数的基础知识。
main函数和库函数
在学习函数之前,我们首先来看看我们熟悉的 main 函数,截至目前,大家见过的程序格式都是如下模式:
#include <stdio.h>
int main(void)
{
/* ... 中略 ... */
return 0;
}
这其中就包含了 main 函数。C 语言程序中, main 函数是必不可少的。程序运行的时候,会执行 main 函数的主体部分。
而 main 函数中使用了 printf、scanf、puts 等函数。由 C 语言提供的这些为数众多的函数称为库函数。
函数
当然,我们也可以自己来创建函数。而实际上,我们也必须要亲自动手创建各种函数。
C 语言中的函数的一般形式定义如下:
类型名 函数名(形式参数表列)
{
函数体
}
在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型
一个函数可以返回一个值,类型名是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,类型名是关键字 void 。
- 函数名称
这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 形式参数
函数名后括号中的参数是形式参数,在调用次函数时,主调函数把实际参数的值传递给被调用函数中的形式参数。形式参数是可选的,也就是说,函数可能不包含参数。
- 函数主体
花括号内的部分称为函数体,它可以包括声明部分和语句部分。声明部分包括对函数中用到的变量进行定义以及对要调用的函数进行声明等内容。
例如,下面的max()
函数是求两个数中较大的那个数:
/* 函数返回两个数中较大的那个数 */
int max(int num1,int num2)
{
int result; // 局部变量声明
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
函数声明
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数声明包括以下几个部分:函数类型 函数名( 参数表列 );
针对上面定义的函数max()
,以下是函数声明:
int max(int num1, int num2);
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
int max(int, int);
当在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。
调用函数
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
例如:
#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;
/* 调用函数来获取最大值 */
ret = max(a, b);
printf( "Max value is : %d\n", ret );
return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
补充说明:形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
-
传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
-
引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。
函数的返回值
函数的返回值是通过函数中的 return 语句获得的。 return 语句将被调用函数中的一个确定值带回到主调函数中去。
一个函数中可以有一个以上的 return 语句,执行到哪一个 return 语句,哪一个 return 语句就起作用。 return 语句后的括号可以不要,如return z;
与return (z);
等价。
需要注意的是,在定义函数时指定的函数类型一般应与 return 语句中的表达式类型一致。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,编写一个判断是否为素数的函数,平台将给定一个整数,函数输出是否为素数的信息。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:5
预期输出:5是一个素数
测试输入:-10
预期输出:-10不是一个素数
开始你的任务吧,祝你成功!
#include<stdio.h>
#include<stdbool.h>
bool isPrime(int n) {
/********** Begin **********/
//请在此添加‘素数判断’的代码
if(n<=1){
return false;
}
for(int i=2;i*i<=n;i++){
if(n%i==0){
return false;
}
}
return true;
/********** End **********/
}
int main(){
int a;
scanf("%d",&a);
if(isPrime(a)) printf("%d是一个素数",a);
else printf("%d不是一个素数",a);
return 0;
}