跳到主要内容

C 语言中用户自定义函数的类型

提示
  1. 不同类型的用户定义函数:示例展示了如何使用不同类型的用户定义函数来检查一个数是否为质数,包括不传递参数且不返回值、不传递参数但返回值、传递参数但不返回值以及传递参数并返回值。
  2. 函数的功能划分:不同的函数示例展示了如何将输入、处理和输出分离到不同的函数中,以实现更清晰和专注的功能划分。
  3. 选择合适的方法:根据特定问题的需要选择合适的函数类型,例如在这个质数检查的例子中,传递参数并返回值的方法(示例 4)更为合适,因为函数专注于检查质数,而不涉及输入输出。

下面这4个程序检查用户输入的整数是否为素数。

这些程序的输出结果相同,我们在每个示例中都创建了一个用户定义函数。然而,我们在每个示例中采取的方法不同。

示例1:不传递参数且没有返回值

#include <stdio.h>

void checkPrimeNumber();

int main() {
checkPrimeNumber(); // 没有传递参数
return 0;
}

// 返回类型为void,意味着不返回任何值
void checkPrimeNumber() {
int n, i, flag = 0;

printf("输入一个正整数: ");
scanf("%d",&n);

// 0和1不是素数
if (n == 0 || n == 1)
flag = 1;

for(i = 2; i <= n/2; ++i) {
if(n%i == 0) {
flag = 1;
break;
}
}

if (flag == 1)
printf("%d 不是素数。", n);
else
printf("%d 是素数。", n);
}

checkPrimeNumber()函数从用户那里获取输入,检查它是否是素数,并在屏幕上显示。

main()函数中checkPrimeNumber();的空括号表示没有向函数传递参数。

函数的返回类型是void。因此,函数没有返回任何值。

示例2:未传递参数但返回值

#include <stdio.h>
int getInteger();

int main() {

int n, i, flag = 0;

// 没有传递参数
n = getInteger();

// 0和1不是素数
if (n == 0 || n == 1)
flag = 1;

for(i = 2; i <= n/2; ++i) {
if(n%i == 0){
flag = 1;
break;
}
}

if (flag == 1)
printf("%d 不是素数。", n);
else
printf("%d 是素数。", n);

return 0;
}

// 返回用户输入的整数
int getInteger() {
int n;

printf("输入一个正整数: ");
scanf("%d",&n);

return n;
}

n = getInteger();语句中的空括号表示没有向函数传递参数。并且,函数返回的值被赋给了n。

这里,getInteger()函数从用户那里获取输入并返回它。检查数字是否为素数的代码在main()函数内。

示例3:传递参数但无返回值

#include <stdio.h>
void checkPrimeAndDisplay(int n);

int main() {

int n;

printf("输入一个正整数: ");
scanf("%d",&n);

// 将n传递给函数
checkPrimeAndDisplay(n);

return 0;
}

// 返回类型为void,意味着不返回任何值
void checkPrimeAndDisplay(int n) {
int i, flag = 0;

// 0和1不是素数
if (n == 0 || n == 1)
flag = 1;

for(i = 2; i <= n/2; ++i) {
if(n%i == 0){
flag = 1;
break;
}
}

if(flag == 1)
printf("%d 不是素数。",n);
else
printf("%d 是素数。", n);
}

用户输入的整数值被传递给checkPrimeAndDisplay()函数。

这里,checkPrimeAndDisplay()函数检查传递的参数是否为素数,并显示适当的信息。

示例4:传递参数并返回值

#include <stdio.h>
int checkPrimeNumber(int n);

int main() {

int n, flag;

printf("输入一个正整数: ");
scanf("%d",&n);

// 将n传递给checkPrimeNumber()函数
// 函数返回的值赋给flag变量
flag = checkPrimeNumber(n);

if(flag == 1)
printf("%d 不是素数",n);
else
printf("%d 是素数",n);

return 0;
}

// 函数返回整数
int checkPrimeNumber(int n) {

// 0和1不是素数
if (n == 0 || n == 1)
return 1;

int i;

for(i=2; i <= n/2; ++i) {
if(n%i == 0)
return 1;
}

return 0;
}

用户的输入被传递给checkPrimeNumber()函数。

checkPrimeNumber()函数检查传递的参数是否为素数。

如果传递的参数是素数,函数返回0。如果传递的参数不是素数,函数返回1。返回值被赋给flag变量。

根据flag是0还是1,在main()函数中打印适当的信息。

哪种方法更好?

这取决于您尝试解决的问题。在这种情况下,传递参数并从函数返回值(示例4)更好。

函数应该执行特定任务。checkPrimeNumber()函数不从用户那里获取输入,也不显示适当的信息。它只检查一个数字是否是素数。