第7章--函数

1、Hermite Polynominal(厄米多项式)是这样定义的:
H n ( x ) = { n ≤ 0 : 1 n = 1 : 2 x n ≥ 2 : 2 x H n − 1 ( x ) − 2 ( n − 1 ) H n − 2 ( x ) } H_n(x) = \begin{Bmatrix} n ≤ 0 : 1 \\ n = 1 : 2x \\ n ≥ 2 : 2xH_{n-1}(x) - 2(n-1)H_{n-2}(x) \end{Bmatrix} Hn(x)= n0:1n=1:2xn2:2xHn1(x)2(n1)Hn2(x) 例如, H 3 ( 2 ) H_3(2) H32的值是40,请编写一个递归函数,计算 H n ( x ) H_n(x) Hnx的值,你的函数应该与下面的原型匹配:
int hermite(int n, int x)

#include <stdio.h>

int hermite(int n, int x);

int main(void)
{
	int i, j;
	int result;
	
	printf("please input n and x:");
	scanf("%d %d", &i, &j);
	
	result = hermite(i, j);
	printf("result: %d\n", result);

	return 0;
}

int hermite(int n, int x)
{
	if (n <= 0)
		return 1;
	if (n == 1)
		return x * 2;
	if (n >= 2)
		return (hermite(n - 1, x) * x * 2) - (hermite(n - 2, x) * (n - 1) * 2);
}

2、 两个整型值M和N(M、N均大于0)的最大公约数可以按照下面的方法计算:
g c d ( M , N ) = { M % N = 0 : N M % N = R , R > 0 : g c d ( N , R ) } gcd(M,N) = \begin{Bmatrix} M \% N = 0 : N \\ M \% N = R, R > 0 : gcd(N,R) \end{Bmatrix} gcd(M,N)={M%N=0:NM%N=R,R>0:gcd(N,R)}

#include <stdio.h>

int gcd(int m, int n);

int main(void)
{
	int i,j;

	printf("please input m and n:");
	scanf("%d %d", &i, &j);
	printf("result: %d\n", gcd(i, j));

	return 0;
}

int gcd(int m, int n)
{
	int r;
	
	if ((m <= 0) || (n <= 0))
		return 0;

	do{
		r = m % n;
		m = n;
		n = r;
	}while (r);
		
	
	return m;
}

3、为下面这个函数原型编写函数定义:
int ascii_to_integer(char *string);
这个字符串参数必须包含一个或多个数字,函数应该把这些数字字符转换为整数并返回这个整数,如果字符串参数包含了任何非数字字符,函数就返回零。请不必担心算数溢出。提示:这个技巧很简单,你每发现一个数字,把当前值乘以10,并把这个值和新数字所代表的值相加。

#include <stdio.h>

int ascii_to_integer(char *string);

int main(void)
{
	char *str = "9876";

	printf("%d\n", ascii_to_integer(str));
	
	return 0;
}

int ascii_to_integer(char *string)
{
	int value = 0;

	while ((*string >= '0') && (*string <= '9')) {
		value = value * 10 + (*string - '0');
		string++;
	}

	if (*string != '\0')
		value = 0;

	return value;
}

4、编写一个名叫max_list的函数,它用于检查任意数目的整型参数并返回它们中最大值。参数列表必须以一个负数结尾,提示列表结束。

#include <stdio.h>
#include <stdarg.h>

int max_list(int first, ...);

int main(void)
{
	printf("max: %d\n", max_list(100, 23, 44, 3, 5, 66, 0, 199, -1));
	return 0;
}

int max_list(int first, ...)
{
	va_list var_arg;
	int max, next;

	max = first;
	va_start(var_arg, first);	
	do {
		next = va_arg(var_arg, int);
		if (next > max)
			max = next;
	}while (next >= 0);
	va_end(var_arg);

	return max;
}

5、实现一个简化的printf函数,它能够处理%d,%f,%s和%c格式码,根据ANSI标准的原则,其他格式码的行为是未定义的,你可以假定已经存在函数print_integer和print_float,用于打印这些类型的值,对于另外两种类型的值,使用putchar来打印。

#include <stdio.h>
#include <stdarg.h>

void myprintf(char format[], ...);

int main()
{
	printfs("%d, %f, %s, %c", 100, 1.23, "abc", 'd');
	return 0;
}

void myprintf(char format[], ...)
{
	char *p = format;
	va_list var_arg;

	va_start(var_arg, format);
	while (*p){
		if (*p == '%'){
			switch (*++p){
				case 'd':
					print_integer(va_arg(var_arg, int));
					break;
				case 'f':
					print_float(va_arg(var_arg, float));
					break;
				case 's':
					puts(va_arg(var_arg, char *));
					break;
				case 'c':
					putchar(va_arg(var_arg, char));
					break;
				default:
					printf("/%%c format are not supported!\n", *p);
			}
		}
		else {
			putchar(*p);
		}
		p++;
	}
	va_end(var_arg);
}

6、编写函数:
void written_amount(unsigned int amount,char *buffer);
它把amount表示的值转化为单词形式,并存储于buffer中,这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是:SIXTEEN THOUSAND THREE HUNDRED TWELVE
调用程序应该保证buffer缓冲区的空间足够大。有些值可以用两种不同的方法进行打印。例如,1200可以是ONE THOUSAND TWO HUNDRED或TWELVE HUNDRED。你可以选择一种你喜欢的形式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *unit[]   = {"", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ", "ten ", "eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen "};
char *decate[] = {"", "", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety "};
void written_within_thousand(unsigned int amount, char *buffer);
void written_amount(unsigned int amount, char *buffer);

#define MAX   10000

int main(int argc, char *argv[])
{
	unsigned int mount = atoi(argv[1]);
	char buf[MAX];

	written_amount(mount, buf);
	puts(buf);

	return 0;
}

void written_amount(unsigned int amount, char *buffer)
{
	if (amount >= 1000000000){
		written_within_thousand(amount / 1000000000, buffer);
		strcat(buffer, "billion ");
		amount %= 1000000000;
	}
	if (amount >= 1000000){
		written_within_thousand(amount / 1000000, buffer);
		strcat(buffer, "million ");
		amount %= 1000000;
	}
	if (amount >= 1000){
		written_within_thousand(amount / 1000, buffer);
		strcat(buffer, "thousand ");
		amount %= 1000;
	}
	written_within_thousand(amount, buffer);
}

void written_within_thousand(unsigned int amount, char *buffer)
{
	if (amount >= 100){
		strcat(buffer, unit[amount / 100]);
		strcat(buffer, "hundred ");
		amount %= 100;
	}
	if (amount >= 20){
		strcat(buffer, decate[amount / 10]);
		amount %= 10;
	}
	strcat(buffer, unit[amount]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值