码迷,mamicode.com
首页 > 其他好文 > 详细

C和指针 第七章 习题

时间:2016-08-18 22:57:11      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

  7.1 hermite递归函数

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

	if (n == 1) {
		return 2 * x;
	}

	return 2 * x * hermite(n - 1, x) - 2 * (n - 1) * hermite(n - 2, x);
}

7.2两个整型值M和N(m、n均大于0)的最大公约数计算公式:

gcd(M,N)

当M % N = 0;  N

当M % N =R, R > 0; gcd(N,R)

unsigned int gcd(unsigned int M, unsigned int N)
{
	if (M % N == 0) {
		return N;
	}

	unsigned int R;
	R = M % N;
	return gcd(N, R);
}

7.3 为原型编写函数定义,

int ascii_to_interger(char *string)

每遇到一位数,把当前总值乘以10,加上遇到的数。

int ascii_to_interger(char *string)
{
	static total = 0;
	int num = *string - ‘0‘;

	//到达字符串末尾或遇到非法字符直接返回总计值
	if (*string == ‘\0‘ || (*string - ‘0‘ > 9)) {
		return total;
	}

	//每遇到一个数,把当前值乘以10,加上遇到的数
	total = 10 * total + num;

	//string右进一位
	return  ascii_to_interger(string + 1);
}

7.4  可变参数函数需要第一个参数必须为命名的确定参数。编写可变函数max_list求最大值。

#include <stdarg.h>

int max_list(int first_arg, ...)
{
        //指向参数栈的指针
	va_list va_arg;
        //初始化指针
	va_start (va_arg, first_arg);

	int value = va_arg(va_arg, int);
	int max = first_arg;
        
	while (value > 0) {
		if (max < value) {
			max = value;
		}
                //循环取出值
		value = va_arg(va_arg, int);
	}
        //将指针指向为NULL
	va_end(va_arg);

	return max;
}

7.5实现简化版本的printf函数,能够处理%d %f %s %c格式码,假设以及存在print_interger和print_float,其他的两个用putchar打印。

#include <stdio.h>
#include <stdarg.h>
void print_integer(int integer)
{
	printf("%d", integer);
}

void print_float(float floatNum)
{
	printf("%f", floatNum);
}

//mini版printf只支持 %d %f %c %s
void mini_prinf(char *format, ...)
{
	va_list arg;
	
	va_start(arg, format);
	char *sPtr = format;
	char *str;
	float flt;

	while (*sPtr != ‘\0‘) {
		//普通字符直接输出
		if (*sPtr != ‘%‘) {
			putchar(*sPtr++);
			continue;
		}
		
		// %%输出一个%
		if ((*sPtr == *(sPtr + 1) == ‘%‘)) {
			putchar(*sPtr++);
			sPtr++;
			continue;
		}

		//遇到%后面有格式符,进行判断类型,然后读取打印参数,每次跳2位包括% 和后面的格式码
		switch (*(sPtr + 1)){
			case ‘d‘:
				print_integer(va_arg(arg, int));
				sPtr += 2;
				break;
			case ‘f‘:
				/*C语言中,调用一个不带原型声明的函数时: 
				调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。 
				同时,对可变长参数列表超出最后一个有类型声明的形式参数之后的每一个实际参数,也将执行上述提升工作。*/
				//所以这里写double
				print_float(va_arg(arg, double));
				sPtr += 2;
				break;
			case ‘c‘:
				//字符也是小整型,直接当int取,char读出来
				putchar(va_arg(arg, int));
				sPtr += 2;
				break;
			case ‘s‘:
				str = va_arg(arg, char *);
				while (*str != ‘\0‘) {
					putchar(*str++);
				}
				sPtr += 2;
				break;
			default:
				sPtr += 2;
				break;
		}
	}
}

整型提升:

——float类型的实际参数将提升到double 
——char、short和相应的signed、
——unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int

参考:http://blog.csdn.net/astrotycoon/article/details/8284501

7.6 编写函数:

void written_amount(unsigned int amount, char * buffer);

实现amount为16312,buffer中储存SIXTEEN THOUSAND THREE HUNDRED TEWLVE

C和指针 第七章 习题

标签:

原文地址:http://www.cnblogs.com/yangxunwu1992/p/5785502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!