#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;
}