谭浩强c语言课后习题笔记[1-4章]

c语言程序设计(第五版)谭浩强课后习题笔记

第一章 程序设计和c语言

1.4 打印 Hello World

#include<stdio.h>

 int main()
 {
 	
 	printf("******************\n");
 	printf("Hello World!\n\n");
 	printf("******************\n");
 	return 0;	
 }

1.6 输入abc求最大值

1.求最大值最小值的代码是c语言的小套路,后续与排序结合在数组或是结构体中非常常见。

//常规代码
#include<stdio.h>

int Max(int a,int b);

 int main()
 {
 	
 	int a,b,c,max;
 	
 	scanf("%d %d %d",&a,&b,&c);
 	max=a;
 	if(max>b)
        max=b;
    if(max>c)
        max=c;
    printf("Max = %d",max);
 	return 0;
 }
/*
条件表示式版
max=max<b?b:max;
max=max<c?c:max;
*/
//函数版代码
#include<stdio.h>

int Max(int a,int b);

 int main()
 {
 	
 	int a,b,c,max;
 	
 	scanf("%d %d %d",&a,&b,&c);
 	
 	max=Max(a,Max(b,c));
 	
 	printf("Max = %d",max);
 	return 0;	
 }
 
 int Max(int a,int b)
 {
 	if(a>b)
 		return a;
 	else
 		return b;
 }

第二章 算法—程序的灵魂

本章重点:流程图

小套路:闰年整除(取余的用法)

1.8.1 输出1900-2000年中的闰年

小套路:整除—对应着一个整数取余操作正好为0

/*
符合系列两条件之一的是闰年
1.能被4整除但不能被100整除
2.能被400整除
*/
#include<stdio.h>

int isLeapYear(int year);

 int main()
 {
 	
 	int i,n,m;
 	
 	scanf("%d %d",&n,&m); //赋值年份上下限
 	
 	for(i=n;i<=m;i++) //循环遍历年份判断闰年
 		if(isLeapYear(i))
			printf("%d is Leap Year\n",i);	
 	return 0;	
 }
 
 int isLeapYear(int year) //判断闰年函数
 {
 	if((year%4==0&&year%100)||year%400==0)
 		return 1;
 	else
 		return 0;
 }

1.8.2 求ax2+bx+c的根

公式d=b2-4ac
x 1 = ( b b 2 4 a c ) 2 a x 2 = ( b + b 2 4 a c ) 2 a 求根公式一: \\ x_1={{(-b-\sqrt{b^2-4ac})}\over {2a}} \qquad x_2={{(-b+\sqrt{b^2-4ac})}\over {2a}}

p = b 2 a q = d 2 a x 1 = p + q x 2 = p q 求根公式二: \\ p={{-b}\over {2a}} \qquad q={\sqrt{d}\over {2a}} \\ x_1={p+q} \qquad x_2={p-q}

#include<stdio.h>
#include<math.h>

 int main()
 {
 	
 	double a,b,c,d,x1,x2;
 	
 	scanf("%lf %lf %lf",&a,&b,&c);
 	
 	d=b*b-4*a*c;
 	
 	if(d<0)
 		printf("Sorry! System without solution!");
 	else
 	{
 		x1=(-b+sqrt(d))/(2*a);
 		x2=(-b-sqrt(d))/(2*a);
 		printf("System Have a solution!\nx1 = %.2f\tx2 = %.2f",x1,x2);
	}	
 	return 0;	
 }
/*
else中的另一种解法
	p=-b/(2*a);
	q=sqrt(d)/(2*a);
	x1=p+q;
	x2=p-q;
*/

1.8.3 输入10个数,输出最大值

#include<stdio.h>
#include<math.h>

 int main()
 {
 	
 	int i,digit,number,max;
 	
 	scanf("%d",&digit);
 	scanf("%d",&number);
 	max=number;
 	for(i=1;i<digit;i++)
 	{
 		scanf("%d",&number);
		if(max<number)
 			max=number;		
	}
 	
 	printf("Max = %d",max);	
 	return 0;	
 }

第三章 顺序结构程序设计

本章重点:math.h函数的调用

小套路:字符转换

3.1 生产总值倍数

#include<stdio.h>
#include<math.h>

int main()
{
	double r=0.07,p;

	r=1+r;
	p=pow(1.07,10);
	
	printf("p = %f",p);
	
	return 0;
 }
//输出结果
//p=1.967151

3.2 存款利息

在这里插入图片描述在这里插入图片描述

#include<stdio.h>
#include<math.h>

int main()
{
	double band=1000,year;
	double p1,p2,p3,p4,p5;
	
	p1=band*(1+0.03*5);
	printf("p1 = %f\n",p1);
	p2=band*(1+0.021*2)*(1+0.0275*3);
	printf("p2 = %f\n",p2);
	p3=band*(1+0.0275*3)*(1+0.021*2);
	printf("p3 = %f\n",p3);
	p4=band*pow((1+0.015),5);
	printf("p4 = %f\n",p4);
	p5=band*pow(1+0.0035/4,20);
	printf("p5 = %f\n",p5);
	return 0;
 }
//输出结果
/*
p1 = 1150.000000
p2 = 1127.965000
p3 = 1127.965000
p4 = 1077.284004
p5 = 1017.646235
*/

3.3 银行贷款

#include<stdio.h>

int main()
{
	double d=300000,p=6000,r=0.01;
	double m;
	
	m=log(p/(p-d*r))/log(1+r);
	
	
	printf("m = %.1f",m);
	return 0;
 }

3.6 编译密码字符串右偏移4位

/*题目要求单个赋值法略,进阶
既A替换为E,a替换为e,V替换A,W替换为B……Z替换为D。
*/
#include<stdio.h>
#include<string.h>

 int main()
 {
 	
 	int i;
	char str[81];
	
	gets(str); //输入字符串 
	
 	for(i=0;i<strlen(str);i++)
 	{
 		if((str[i]<='Z'&&str[i]>='A')||(str[i]<='z'&&str[i]>='a')) //保证是字母 
 		{
 			if((str[i]<='Z'&&str[i]>='V')||(str[i]<='z'&&str[i]>='v')) //进行转换 
 				str[i]=str[i]-22; //末尾-22偏移
 			else
 				str[i]=str[i]+4;  //首部+4偏移
		}
	}		
	
	puts(str);
 	return 0;	
 }

3.7 求圆面积,圆球体积等

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

 int main()
 {
 	
 	//已知半径为1.5,高为3 
	double r,h,pi=3.141526; 
	scanf("%lf %lf",&r,&h);
	double lenth,area,oarea,v,cv; 
	
	lenth=2*pi*r;
	area=pi*r*r;
	oarea=4*pi*r*r;
	v=3.0/4*pi*r*r*r;
	cv=pi*r*r*h;
	printf("lenth = %6.2f,area = %6.2f,oarea = %6.2f,v = %6.2f,cv = %6.2f",lenth,area,oarea,v,cv);
 	return 0;	
 }

3.8 putchar和getchar函数的思考

在这里插入图片描述

  1. 定义为字符型和整型均可以。

  2. 输出ASCII值要用printf函数。

  3. 只有在字符型数据范围内(0~127),整型和字符型可以相互代替。

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

 int main()
 {
 	
 	char c1,c2;
 	int c11,c12;
 	c1=getchar();
 	c2=getchar();
 	c11=getchar();
 	c12=getchar();
 	
 	printf("\nchar类型:\n");
 	putchar(c1);
 	putchar(c2);
 	putchar('\n');
 	printf(" %c %d",c1,c1);
 	printf(" %c %d",c2,c2);
 	printf("\nint类型:\n");
 	putchar(c11);
 	putchar(c12);
 	putchar('\n');
 	printf(" %c %d",c11,c11);
 	printf(" %c %d",c12,c12);
 	
 	return 0;	
 }
/*输出结果
AaBb

char类型:
Aa
 A 65 a 97
int类型:
Bb
 B 66 b 98
*/

第四章 选择结构程序设计

本章重点:if-else,switch-case

小套路:交换,选择结构与整数除法取个位数的结合

错题: a=3,b=4,c=5 , !(a>b) && !c || 1 逻辑表达式的值是1

4.5 输出一个小于1000的数的开方

#include<stdio.h>
#include<math.h>

 int main()
 {
 	
 	int n,sn;
 	printf("请输入一个小于1000的正数:"); 
 	scanf("%d",&n);
 	while(n>1000||n<=0)
 	{
 		printf("不符合要求,请重新输入:");
		scanf("%d",&n);		
	}

 	sn=(int)sqrt(n);
 	
 	printf("sqrt %d is %d",n,sn);
 	return 0;	
 }

4.6 简单的分段函数

#include<stdio.h>
#include<math.h>
 int fact(int x);
 int main()
 {
 	
 	int x;
 	scanf("%d",&x);
 	if(x<1)
 		printf("y = %d = %d",x,x);
	else if(x>=10)
		printf("y = 3*%d-11 = %d",x,3*x-11);
	else
		printf("y = 2*%d-1 = %d",x,2*x-1);	
 	
 	printf("\nfact(x) = %d",fact(x));
 	return 0;	
 }
 
 int fact(int x)
 {
	if(x<0)
	 	return -1;
	else if(x==0)
		return 0;
	else
		return 1;	
 }

4.8 百分制成绩转换

#include<stdio.h>
#include<math.h>
void changegrade(int grade);
 int main()
 {
 	
 	double sorce;
 	int grade;
 	scanf("%d",&sorce);
 	grade=(int)sorce/10;
 	switch(grade){
 		case 10:
 		case 9: printf("sorce = %.2f, grade is A",sorce);break;
 		case 8: printf("sorce = %.2f, grade is B",sorce);break;
 		case 7: printf("sorce = %.2f, grade is C",sorce);break;
 		case 6: printf("sorce = %.2f, grade is D",sorce);break;
 		default: printf("sorce = %.2f, grade is E",sorce);break;
	 }
 	return 0;	
 }

void changegrade(int grade) //把功能抽象出来
{
	switch(grade){
 		case 10:
 		case 9: printf("sorce = %.2f, grade is A",sorce);break;
 		case 8: printf("sorce = %.2f, grade is B",sorce);break;
 		case 7: printf("sorce = %.2f, grade is C",sorce);break;
 		case 6: printf("sorce = %.2f, grade is D",sorce);break;
 		default: printf("sorce = %.2f, grade is E",sorce);break;
	 }	
}
/*
题目变式,有90-85是B,84-70是C

那么case8:需要有微调加入选择结构

case8: if((int)sorce%10>=5)
			printf("sorce = %.2f, grade is B",sorce);
		else
			printf("sorce = %.2f, grade is C",sorce);
		break;
*/

4.9 计算几位数,输出各个位上的值,逆序输出数字

#include<stdio.h>
#include<math.h>
int manydigit(int n);
void reversed(int n);
 int main()
 {
	int n,count;
	scanf("%d",&n);
	//计算几位数 
	int i,digit=0;
	for(i=n;i>0;i/=10)
		digit++;
	printf("digit = %d\n",digit);
	//输出每位数
	int g,s,b;
	g=n%10; 
	if(g>0)
		printf("g = %d\n",g);		
	s=n/10%10;
	if(s>0)
		printf("s = %d\n",s);	
	b=n/100;
	if(b>0)
		printf("b = %d\n",b);
	//逆序
	printf("方案一:逐个输出 "); 
	printf("%d%d%d\n",g,s,b); 
	printf("方案二:计算输出 "); 
	printf("%d",g*100+s*10+b);
	
	return 0;	
 }
 
 
 int manydigit(int n) //计算位数的函数 ,求水仙花数会用到
{
	int i,digit=0;
	for(i=n;i>0;i/=10)
		digit++;
	return digit;		
}
/* 函数递归方式---打印各个位上的数字(和逆序递归的区别就在打印先执行还是函数调用先执行)*/
void printdigits( int n )
{
	if(n/10==0)
		printf("%d",n%10); 
	else
	{
		printdigits(n/10);
        printf("%d",n%10);	
	}		
}
//逆序打印方法一:
void reversed(int n)//逆序打印 常见的整数逆序套路,求和的一种变形
{
	int i,sum=0;
	
	for(i=n;i>0;i/=10)
	{
		sum=sum+i%10;	
	}
	
	printf("%d",sum);	
}
//逆序打印方法二:
/* 逆序输出打印的函数递归方式 */
void printdigits( int n )
{
	if(n/10==0)
		printf("%d",n%10); 
	else
	{
		printf("%d",n%10);
		printdigits(n/10);	
	}		
}

4.10 求利润问题(要求用两种选择语句,类似出租车里程计费问题)

#include<stdio.h>
#include<math.h>

 int main()
 {
	int cash,flag;
	scanf("%d",&cash);
	double profit;
	flag=cash/100000;
	switch(flag){
		case 0: profit=cash*0.1;break;
		case 1: profit=0.1*100000+(cash-100000)*0.075;break;
		case 2: 
		case 3: profit=100000*0.175+(cash-200000)*0.05;break;
		case 4: 
		case 5: profit=100000*0.185+(cash-400000)*0.03;break;
		case 6:
		case 7:
		case 8:
		case 9:	profit=100000*0.191+(cash-600000)*0.015;break;	
		default: profit=100000*0.194+(cash-600000)*0.01;break;
	}
	printf("switch-case output:\n");
	printf("profit = %.2f\n",profit); 
	
	if(cash<=100000)
		profit=cash*0.1;
	else if(cash<=200000)
		profit=0.1*100000+(cash-100000)*0.075;
	else if(cash<400000)
		profit=100000*0.175+(cash-200000)*0.05;
	else if(cash<=600000)
		profit=100000*0.185+(cash-400000)*0.03;
	else if(cash<=1000000)
		profit=100000*0.191+(cash-600000)*0.015;
	else
		profit=100000*0.194+(cash-600000)*0.01;
		
	printf("id-else output:\n");
	printf("profit = %.2f",profit);
		
	return 0;	
 }
/*输出结果
156890
switch-case output:
profit = 14266.75
id-else output:
profit = 14266.75
*/

4.11 简单排序,从小到大输出4个整数

//不使用数组很繁琐,但是排序的核心是比较和交换,尤其是交换
//交换是最经典的一个套路:temp=a;a=b;b=temp;不管是数组也好,结构体也好框架不会变
#include<stdio.h>
#include<math.h>

void swap(int *a,int *b);
 int main()
 {
	int a,b,c,d;
	scanf("%d %d %d %d",&a,&b,&c,&d);
	
	if(a>b)
		swap(&a,&b);
	if(a>c)
		swap(&a,&c);
	if(a>d)
	 	swap(&a,&d);
	//此时a已经为最小值
	
	//重复操作,使得b,c,d依次通过交换变为升序
	if(b>c)
		swap(&b,&c);
	if(b>d)
		swap(&b,&d);
	if(c>d) 
		swap(&c,&d);
		
	printf("%d < %d < %d < %d",a,b,c,d);
	
	return 0;	
 }

void swap(int *a,int *b)
{
	int temp;
	
	temp=*a;
	*a=*b;
	*b=temp;
}

4.12 构造坐标点求建筑高度

#include<stdio.h>
#include<math.h>

 int main()
 {
	//塔外建筑高度为0,塔内建筑高度为10,判定在塔内还是塔外 
	//每个圆的半径都为1,且横纵坐标的绝对值都为2,而判定一点是否在园内
	//只需要判定点掉圆心的距离是否超过半径,所以用两次fabs取绝对值即可。 
	double x,y,fx,fy,ret; 
	
	scanf("x=%lf y=%lf",&x,&y);
	fx=fabs(fabs(x)-2);
	fy=fabs(fabs(y)-2);
	ret=sqrt(fx*fx+fy*fy);
	if(ret<=1&&ret>=0)
		printf("YES,height is 10m");
	else
		printf("No,height is 0m");	 
	return 0;	
 }
/*
输出结果
x=0.5 y=0.7
No,height is 0m
-----------------
x=2.1 y=2.3
YES,height is 10m
*/
发布了137 篇原创文章 · 获赞 8 · 访问量 4351

猜你喜欢

转载自blog.csdn.net/qq_35891520/article/details/104869414