C Primer Plus 第九章 编程练习

#include <stdio.h>
/*
1.设计一个函数min(x, y),返回两个double类型值的较小值。在一
个简单的驱动程序中测试该函数。
*/
double min(double a, double b);

int main(void)
{
	double a = 0;
	double b = 0;
	
	printf("请输入第一个double:\n");
	scanf("%lf",&a); 
	
	printf("请输入第二个double:\n");
	scanf("%lf",&b);
	
	
	printf("较小的值为:%.2lf\n", min(a,b));
	return 0; 
}
double min(double a, double b){
	
	return a<b ? a : b;
}
 

#include <stdio.h>
/*
2.设计一个函数chline(ch, i, j),打印指定的字符j行i列。在一个简
单的驱动程序中测试该函数。
*/
void chline(char,int,int);

int main(void)
{
	
	
	chline('A',5,5);
	printf("\n");
	printf("\n");
	chline('B',5,10);
	
	return 0; 
}
void chline(char c ,int j,int i){
	
	for(j;j>0;j--){
	
	for(int count = i;count>0;count--){//这边容易犯错,如果直接用i,第一次打印完i的值就变为0了,后续再循环就不打印字符了,所以应该用count来进行赋值后循环,保证每行的打印个数。
	printf("%c",c);
	}
	printf("\n");
	} 
	
	return;
}
 

#include <stdio.h>
/*
3.编写一个函数,接受3个参数:一个字符和两个整数。字符参数
是待打印的字符,第1个整数指定一行中打印字符的次数,第2个整数
指定打印指定字符的行数。编写一个调用该函数的程序。
*/
void chline(char,int,int);

int main(void)
{
	char printC;
	int h = 0;
	int l = 0;
	
	printf("请输入要打印的字符:\n");
	scanf("%c",&printC);
	
	printf("请输入要打印的行数\n");
	scanf("%d",&h);
	
	printf("请输入要打印的列数\n");
	scanf("%d",&l);
	chline(printC,h,l);
	return 0; 
}
void chline(char c ,int j,int i){
	
	for(j;j>0;j--){
	
	for(int count = i;count>0;count--){
	printf("%c",c);
	}
	printf("\n");
	} 
	
	return;
}
 
#include <stdio.h>
/*
4.两数的调和平均数这样计算:先得到两数的倒数,然后计算两个
倒数的平均值,最后取计算结果的倒数。编写一个函数,接受两个
double类型的参数,返回这两个参数的调和平均数。
*/
double reciprocal(double,double);

int main(void)
{
	double a = 0;
	double b = 0;
	
	printf("请输入第一个数:\n");
	scanf("%lf",&a);
	
	printf("请输入第二个数: \n");
	scanf("%lf",&b);
	printf("调和平均数为%lf\n",reciprocal(1/a,1/b));	
	return 0; 
}
double reciprocal(double a ,double b){
	
	return 1/((a+b)/2);
}
 

#include <stdio.h>
/*
5.编写并测试一个函数larger_of(),该函数把两个double类型变量的
值替换为较大的值。例如, larger_of(x, y)会把x和y中较大的值重新赋
给两个变量。
*/
void larger_of(double*,double*);

int main(void)
{
	double a = 0;
	double b = 0;
	
	printf("请输入第一个数:\n");
	scanf("%lf",&a);
	
	printf("请输入第二个数: \n");
	scanf("%lf",&b);
	larger_of(&a,&b);
	printf("处理都得结果为a = %lf, b = %lf\n",a,b);
	return 0; 
}
void larger_of(double *a ,double *b){
	
	 *a>*b ? *b = *a : *a = *b;
}
 
#include <stdio.h>
/*
6.编写并测试一个函数,该函数以3个double变量的地址作为参
数,把最小值放入第1个变量,中间值放入第2个变量,最大值放入第3
个变量。
*/
void change(double*,double*,double*);

int main(void)
{
    double a = 0;
    double b = 0;
    double c = 0;
    
    printf("请输入第一个数:\n");
    scanf("%lf",&a);
    
    printf("请输入第二个数: \n");
    scanf("%lf",&b);
    
    printf("请输入第三个数: \n");
    scanf("%lf",&c);
    
    change(&a,&b,&c);
    printf("处理都得结果为a = %lf, b = %lf, c = %lf  \n",a,b,c);
    return 0; 
}
void change(double *a ,double *b,double *c){
    double max = *a;
    double min = *a;
    double mid = *a;
    
    if(max < *b){
        max = *b;
    }
    if(max < *c){
        max = *c;
    }
    
    if(min > *b){
        min = *b;
    }
    if(min > *c){
        min = *c;
    }
    
    
    if(!(mid > min && mid < max)){
        mid = *b; 
    }
    if(!(mid > min && mid < max)){
        mid = *c; 
    }
    //处理有两个数相当的情况 
    if(*a == *b||*b == *c){
        mid = *b;
    }
    if(*a == *c){
        mid = *a;
    }
    
    *a = min;
    *b = mid;
    *c = max;    
}
#include <stdio.h>
#include <ctype.h>
/*
7.编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程
序要报告每个字符是否是字母。如果是,还要报告该字母在字母表中
的数值位置。例如,c和C在字母表中的位置都是3。合并一个函数,以
一个字符作为参数,如果该字符是一个字母则返回一个数值位置,否
则返回-1。
*/
int isLetter(char);

int main(void)
{
	char input;
	int num;
	
	while((input = getchar())!= EOF){
	
	if(input == '\n'){// 
		continue;
	}	
	input = tolower(input);	//转成小写
	num = isLetter(input); 
	if(num != -1){
	printf("%c是字母,位置为%d\n",input,num);
	}else {
	printf("%c不是字母\n",input);
	}
	
	
	}

	return 0; 
}
int isLetter(char input){
	 
	 if(isalpha(input)){//判断是否是字母 
	 	return (input - 'a')+1;
	 }
	 
	 return -1;
}
8.第6章的程序清单6.20中,power()函数返回一个double类型数的
正整数次幂。改进该函数,使其能正确计算负幂。另外,函数要处理0
的任何次幂都为0,任何数的0次幂都为1(函数应报告0的0次幂未定
义,因此把该值处理为1)。要使用一个循环,�在程序中测试该函
数。
额额---
懒得做~

9.使用递归函数重写编程练习8。
同上!
#include <stdio.h>
/*
10.为了让程序清单9.8中的to_binary()函数更通用,编写一个
to_base_n()函数接受两个在2~10范围内的参数,然后以第2个参数中指
定的进制打印第1个参数的数值。例如,to_base_n(129, 8)显示的结果
为201,也就是129的八进制数。在一个完整的程序中测试该函数。
分析:这里说函数接收2~10范围的数,但举的例子确是129,虽然有些奇怪,但我们先按
要求编写程序,后续如果要写一个限定大于2第二个参数范围为2~10的函数只要改判断条件即可。 

*/
void to_radix(int,int);

int main(void)
	{
	int x = 0;
	int y = 0;
	int result = 0;
	
	printf("请输入要转换进制的数,范围在2-10之间:\n");
	scanf("%d",&x);
	while(!(x>=2&&x<=10)){
		printf("不符合要求,请重新输入\n");
		printf("请输入要转换进制的数,范围在2-10之间:\n");
		scanf("%d",&x);
	}
	while(!(x>=2)){
		printf("不符合要求,请重新输入\n");
		printf("请输入要转换进制的数,范围在2-10之间:\n");
		scanf("%d",&x);
	}
	
	printf("请输入进制,范围在2-10之间:\n");
	scanf("%d",&y);
	while(!(y>=2&&y<=10)){
		printf("不符合要求,请重新输入\n");
		printf("请输入要转换进制的数,范围在2-10之间:\n");
		scanf("%d",&y);
	}
	
	 to_radix(x,y);
	 putchar('\n');
	
	return 0; 
}
void to_radix(int num,int radix) /* 递归函数 */
{
	int r;
	r = num % radix;
	if (num >= radix)
	to_radix(num / radix,radix);
	//putchar(r == 0 ? '0' : '1');
	printf("%d",r == 0 ? 0 : r);
	return;
}
 


     

 

#include <stdio.h>
/*
11.编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那
契数。
1 1 2 3 5 8 13 21 34
*/
void Fibonacci(int num);

int main(void)
	{
	int num = 0;//定义输入的位置 
	printf("请输入想获取哪个位置的斐波那契数 :\n");
	scanf("%d",&num); 
	if(num > 0){
		Fibonacci(num);
	}else{
		printf("输入错误!\n");
	}
	 
	return 0; 
}
void Fibonacci(int num) /* 递归函数 */
{	
	unsigned long long  i = 1;
	unsigned long long j = 1;
	unsigned long long current = 0;
	
	if(num <= 2){
		printf("斐波那契数为 1\n");
	}else{
		for(int k = 3;k <= num; k++){
			current = i+j;
			i = j;
			j = current;
		}
		printf("第%d位的斐波那契数为%llu\n",num,current);
	}
	return;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值