C和指针 第七章 习题
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
#include <stdio.h>
#include <string.h>
//一千THOUSAND,一千的一千倍一百万MILLION,一百万的一千倍十亿BILLION,下面的数只是对一千以下的数进行num转字符串,更高位的只需三位分隔开,加上千,百万,十亿,单位即可。
int num_to_alp(unsigned int num, char * buffer)
{
if (num == 0) {
//返回0,标示num为0,便于后面不加thousand,billion单位
return 0;
}
static char *digits[] = {"", "ONE ", "TWO ", "THREE ", "FOUR ", "FIVE ", "SIX ", "SEVEN ", "EIGHT ", "NINE ", "TEN ", "ELEVEN ", "TWELVE ", "THIRTEEN ",
"FOURTEEN ", "FIFTEEN ", "SIXTEEN ", "SEVENTEEN ", "EIGHTEEN ", "NINETEEN " }; static char *tens[] = {"", "", "TWENTY ", "THIRTY ", "FORTY ", "FIFTY ", "SIXTY ", "SEVENTY ", "EIGHTY ", "NINETY "}; //如果百位有数,先添加百位
if (num / 100) {
int hud = num / 100;
strcat(buffer, digits[hud]);
strcat(buffer, "HUNDRED ");
} num = num % 100;
//对十位上的数判断处理,大于20用ty后缀,小于20用digits中字符串
int ten = num / 10; if (ten >= 2) {
//十位
strcat(buffer, tens[ten]);
//个位
num = num % 10;
strcat(buffer, digits[num]);
}else{
//小于20直接用digits中个位
strcat(buffer, digits[num]);
}
return 1;
} //将amount按三位分一组,进行分组。数组第一位指定组长eg 123456789 =>数组[3, 789, 456, 123]
unsigned int * div_amount(unsigned int amount)
{
unsigned int arr_amount[100]; unsigned int amount_dived;
int loc = 1;
do {
arr_amount[loc] = amount % 1000;
amount /= 1000;
loc++;
} while (amount); arr_amount[0] = loc - 1; return arr_amount;
} void written_amount(unsigned int amount, char *buffer)
{
if (amount == 0) {
strcat(buffer, "zero ");
}
//上千,百万,十亿,单位
static char *magnitudes[] = { "", "THOUSAND ", "MILLION ", "BILLION " };
//分割后的数组指针
unsigned int *dived_arr;
//分割的段数,数组长度
int len;
//分隔数字
dived_arr = div_amount(amount);
len = dived_arr[0]; //当分成三组时只需要magnitudes前三个
while (len > 0) {
//对每三个数字进行num转字符串
if (num_to_alp(dived_arr[len], buffer)) {
//如果三位数不是零,加上这三位数的单位
strcat(buffer, magnitudes[len - 1]);
}
len--;
}
}
测试:
int main()
{
char buffer[1] = { '\0' };
unsigned int amount = 12345678910;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 1000001;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 1;
written_amount(amount, buffer);
printf("%s\n", buffer); buffer[0] = '\0';
amount = 0;
written_amount(amount, buffer);
printf("%s\n", buffer); while (1)
;
return 0;
}
执行结果:

C和指针 第七章 习题的更多相关文章
- C和指针 第六章 习题
6.1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL #include <stdio.h> char * f ...
- C和指针 第十七章 习题
17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- C和指针 第十一章 习题
1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...
- C和指针 第七章 可变参数
可变参数列表是通过stdarg.h内的宏来实现的: 类型 va_list 三个宏: va_start va_arg va_end 我们可以声明一个va_list变量,与这三个宏配合使用. 可变参数必须 ...
- C和指针 第七章 函数递归与迭代
C语言通过运行时堆栈支持递归函数的实现,递归函数时直接或者间接调用自身的函数,经常有人拿斐波那契实现当做递归的实现,然后这样做效率并不高. n < 1; Fib(1) =1 n = 2; F ...
- C和指针 第五章 习题
下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...
- C和指针 第四章 习题
4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...
- C和指针 第三章 习题
在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...
随机推荐
- HTML ------ 关于表单 Form
Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(一)
上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactor ...
- C++学习笔记(1)
本学习笔记是C++ primer plus(第六版)学习笔记.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p/3874148.html,谢 ...
- Web 开发中很实用的10个效果
在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...
- HTTP Status
Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答 头,一个空行,内容文档.下面是一个最简单的应答 : 状态行包含HTTP版本.状态代码.与状态代码对应的 ...
- Advanced Office Password Recovery如何设置快捷方式
一般软件安装成功之后都会在桌面上形成快捷方式以方便使用,但是一些用户发现Advanced Office Password Recovery这种office密码破解工具安装成功后桌面上没有出现快捷方式, ...
- linux 下载百度盘,迅雷离线文件,解压乱码文件的方法。
首先,利用bypy的自动打包功能,将百度盘里的文件自动存放至app/bypy中,这样文件就是打包形式. 再利用 axel -n 10 "下载地址",将文件下载至本地. 下载地址获取 ...
- 【Beta】Scrum05
Info 由于12.9~12.11三天,PM和测试到上海参加比赛,期间PM对博客更新暂停,功能测试暂停,Scrum会议暂停,12.12日起补充及恢复之前未能完成的工作. 时间:2016.12.08 2 ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...