鸟语天空
C语言—函数
post by:追风剑情 2019-9-16 20:47

示例一:一个简单函数

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis, CA 94904"
#define WIDTH 40

void starbar(void); /* ANSI C风格函数原型 */
//void starbar(); /* 对于不识别ANSI C风格的编译器这样声明 */
//一些老的编译器甚至连void都识别不了

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	// 也可以在函数里面声明
	//void starbar(void);

	starbar();
	printf("%s\n", NAME);
	printf("%s\n", ADDRESS);
	printf("%s\n", PLACE);
	starbar(); /* 调用函数 */

	system("pause");
	return 0;
}

void starbar(void) /* 定义函数 */
{
	int count;
	for (count = 1; count <= WIDTH; count++)
		putchar('*');
	putchar('\n');
}

运行测试
1111.png

示例二:对示例一进行改进

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis, CA 94904"
#define WIDTH 40
#define SPACE ' '

// 推荐的声明方式
void show_n_char(char ch, int num);
// 推荐的声明方式,根据个人喜好声明函数时也可以不写变量名
//void show_n_char(char, int);

// 也可以不声明参数(已废弃)
//void show_n_char();

// ANSI C之前的声明形式(已废弃)
//void show_n_char(ch, num)
//char ch;
//int num;


//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	int spaces;
	show_n_char('*', WIDTH);
	putchar('\n');
	show_n_char(SPACE, 12);
	printf("%s\n", NAME);
	spaces = (WIDTH - strlen(ADDRESS)) / 2;
	show_n_char(SPACE, spaces);
	printf("%s\n", ADDRESS);
	show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2);
	printf("%s\n", PLACE);
	show_n_char('*', WIDTH);
	putchar('\n');

	system("pause");
	return 0;
}

void show_n_char(char ch, int num)
{
	int count;
	for (count = 1; count <= num; count++)
		putchar(ch);
}

运行测试
111.png

示例:函数返回值

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

int imin(int, int);

// ANSI C允许使用部分原型(实用于函数参数不固定的情况)。
// 如: int printf(const char *, ...);

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	int evil1, evil2;
	printf("Enter a pair of integers (q to quit):\n");
	while (scanf("%d %d", &evil1, &evil2) == 2)
	{
		printf("The lesser of %d and %d is %d.\n",
			evil1, evil2, imin(evil1, evil2));
		printf("Enter a pair of integers (q to quit):\n");
	}
	printf("Bye.\n");

	system("pause");
	return 0;
}

// 如果把函数定义放在main()之前,则可以省略函数声明。
int imin(int n, int m)
{
	return (n < m) ? n : m;
}

运行测试
1111.png

示例:递归

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

void up_and_down(int);

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	up_and_down(1);
	system("pause");
	return 0;
}

void up_and_down(int n)
{
	printf("Level %d: n location %p\n", n, &n);
	if (n < 4)
		up_and_down(n + 1);
	printf("LEVEL %d: n location %p\n", n, &n);
}

运行测试
1111.png

示例:尾递归

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

long fact(int n);
long rfact(int n);

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	int num;
	printf("This program calculates factorials.\n");
	printf("Enter a value in the range 0-12 (q to quit):\n");
	while (scanf("%d", &num) == 1)
	{
		if (num < 0)
			printf("No negative numbers, please.\n");
		else if (num > 12)
			printf("Keep input under 13.\n");
		else
		{
			printf("loop: %d factorial = %ld\n",
				num, fact(num));
			printf("recursion: %d factorial = %ld\n",
				num, rfact(num));
		}
		printf("Enter a value in the range 0-12 (q to quit):\n");
	}
	printf("Bye.\n");

	system("pause");
	return 0;
}

// 使用循环计算
long fact(int n)
{
	long ans;
	for (ans = 1; n > 1; n--)
		ans *= n;
	return ans;
}

// 使用递归计算
long rfact(int n)
{
	long ans;
	if (n > 0)
		ans = n * rfact(n - 1);
	else
		ans = 1;
	return ans;
}
运行测试
1111.png


示例:递归和倒序计算

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

void to_binary(unsigned long n);

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	unsigned long number;
	printf("Enter an integer (q to quit):\n");
	while (scanf("%lu", &number) == 1)
	{
		printf("Binary equivalent: ");
		to_binary(number);
		putchar('\n');
		printf("Enter an integer (q to quit):\n");
	}
	printf("Done.\n");

	system("pause");
	return 0;
}

// 使用递归将十进制数用二进制表示
void to_binary(unsigned long n)
{
	int r;
	r = n % 2;
	if (n >= 2)
		to_binary(n / 2);
	putchar(r == 0 ? '0' : '1');
}
运行测试
1111.png



评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容