浙大版《C语言程序设计》(第4版)课后代码题解答与思考

第二章

practice

2-3 暴力输出倒三角

#include <stdio.h>

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

2-6 计算物体自由下落的距离

#include <stdio.h>

int main()
{
	double height,g,time;
	time = 3;
	g=10;
	height = 0.5*g*time*time;
	printf("height = %.2f",height);//保留两位小数 
	return 0;
}

2-8 华氏摄氏温度转换

#include <stdio.h>

int main()
{
	int fahr,celsius;
	scanf("%d",&fahr);
	celsius = 5*(fahr-32)/9;
	printf("Celsius = %d",celsius);
	return 0;
}

2-10 计算分段函数【1】

#include <stdio.h>

int main()
{
	double x;
	double y;
	scanf("%lf", &x);
	if(x != 0)
	{
		y = 1/x;
	}
	else
	{
		y = 0;
	}
	printf("f(%.1f) = %.1f", x, y);
	return 0;
}

2-11 计算分段函数【2】

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

int main()
{
	double x,y;
	scanf("%lf",&x);
	if(x<0)
	{
		y = pow(x+1,2) + 2*x + 1/x;
	}
	else
	{
		y = sqrt(x);
	}
	printf("f(%.2f) = %.2f",x,y);
	return 0;
}

##本题需要使用math库

2-12 输出华氏摄氏温度转换表

#include <stdio.h>

int main()
{
	int fahr,lower,upper;
	double celsius;
	
	printf("Enter lower:");
	scanf("%d",&lower);
	printf("Enter upper:");
	scanf("%d",&upper);
	
	if(lower<=upper)//验证合法性 
	{
		printf("fahr celsius\n");
		for(fahr=lower;fahr<=upper;fahr+=2)
		{
			celsius = 5*(fahr-32)/9.0;
			printf("%4d%6.1f\n",fahr,celsius);
		}
	}
		
	else
	{
		printf("Invalid Value!\n");
	}	
	return 0;
}

2-13 求前N项和【1】

#include <stdio.h>

int main() {
    int N;
    scanf("%d",&N);

    double sum=0;
    for(int i=1;i<=N;i++)
        sum+=1.0/i;

    printf("sum = %.6lf",sum);
    return 0;
}

2-14 求前N项和【2】

#include <stdio.h>

int main()
{
	int N,denominator=1;
	double sum = 0,item=1;
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		item = 1.0/denominator;
		sum+=item;
		denominator+=2;
	
	}
	printf("sum = %.6f",sum);
	return 0;
}

2-15 求前N项和【3】

#include <stdio.h>

int main()
{
	int i,N,flag,denominator;
	double sum,item;
	flag = 1;
	denominator = 1;
	item = 0;
	sum = 0;
	scanf("%d",&N);
	for(i=1;i<=N;i++)
	{
		item = 1.0*flag/denominator;
		sum += item;
		flag = -flag;
		denominator += 3;
	}
	printf("sum = %.3f",sum);
	return 0;
}

exercise

2-1 求整数均值

#include <stdio.h>

int main()
{
	int m, n, p, q, Sum;
	double Average;
	scanf("%d %d %d %d",&m,&n,&p,&q);
	Sum = m+n+p+q;
	Average = Sum/4.0;//可以直接放在printf里面少写两行代码 
	printf("Sum = %d; Average = %.1f",Sum , Average);
	return 0;
}

2-2 阶梯电价

#include <stdio.h>

int main()
{
	int n;
	double cost;
	scanf("%d",&n);
	
	if(n<0)
	{
		printf("Invalid Value!\n");
		return 0;//这条语句很关键 ,可以结束上面的判断 
	}
	/*else if(n<=50)
		cost = 0.53*n;
	else
		cost = (n-50)*(0.53+0.05)+0.53*50;*/
	else if(n>50)
	{
		cost = (n-50)*(0.53+0.05)+0.53*50;
	}
	else//把可能会重合的判断条件放到最后 ,试过了不行。 
	{
		cost = 0.53*n;
	}
	printf("cost = %.2f\n",cost);
	
	return 0;
}

2-3 序列求和

#include <stdio.h>

int main()
{
	int m,n;
	double sum=0;
	scanf("%d %d",&m,&n);
	for(int i=m;i<=n;i++)//for循环的i最好还是在括号里面初始化 
	{
		//temp = i*i + 1.0/i;
		sum += i*i + 1.0/i;
	}
	printf("sum = %.6f\n",sum);
	return 0;
}

2-4 求交错级数前n项和

#include <stdio.h>

int main()
{
	int N,flag=1;
	double sum=0;
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		sum += 1.0*i*flag/(2*i-1);//乘号不要忘记了 
		flag = -flag;
	}
	printf("%.3f",sum);
	return 0;
}

2-5 平方根求和

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

int main()
{
	int N;
	double sum = 0;
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		sum += sqrt(i);
	}
	printf("sum = %.2f",sum);
	return 0;
}

2-6 求给定序列前n项和

#include <stdio.h>

double fact(int N);//这里不要忘记了; 
int main()
{
	int N;
	scanf("%d",&N);
	double sum =0;
	for(int i=1; i<=N ;i++)
	{
		sum += fact(i);
	}
	printf("%0.f",sum);
	return 0;
}

double fact(int N)
{
	double product=1;
	for(int i=1; i<=N;i++)
	{
		product *= i;
	}
	return product;
}

第三章

pratice

3-2 计算符号函数的值

#include <stdio.h>

int main()
{
	int n,y;
	scanf("%d",&n);
	if(n<0)
	{
		y = -1;
	}
	else if(n==0)
	{
		y = 0;
	}
	else
	{
		y = 1;
	}
	printf("sign(%d) = %d",n,y);
	return 0;
}

3-3 统计学生平均成绩与及格人数

#include <stdio.h>

int main()
{
	int N, count = 0;
	double score,total = 0;
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		scanf("%lf",&score);
		total += score;
		if(score>=60) 
	    count ++;
	}
	
	
	if(N!= 0)
	printf("average = %.1f\ncount = %d",total/N,count);
	else
	printf("average = %.1f\ncount = %d",0.0,0);
	
	return 0;
}

3-4 统计字符

#include <stdio.h>
int main()
{
	int letter,blank,digit,other;
	letter = blank = digit = other = 0;
	char ch;
	for(int i=1;i<=10;i++)
	{
		ch = getchar();
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//打的时候注意,看清>与< 
		{
			letter++;
		}
		else if(ch>='0'&&ch<='9')
		{
			digit++;
		}
		else if(ch==' '||ch=='\n')
		{
			blank++;
		}
		else
		other++;
	}
	printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
	
	return 0;
}

3-5 输出闰年

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int flag = 0;//给个标志位说明闰年是否存在 
	if(n>2000 && n<=2100)//没有突出21世纪,已改正 
	{
		for(int i=2001 ; i<=n ; i++)//PAT不要2000这个数字 
		{
			if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
			{
				flag = 1;
				printf("%d\n",i);
			}
		}
		if(flag == 0)//不要放进for循环 ,慢慢品之间的逻辑关系 ,题目给的是不存在任何闰年再判none 
			{
				printf("None");
			}
	}
	else
	{
		printf("Invalid year!");
	}
	return 0;
}

3-7 将百分制成绩转换成五分制成绩

#include <stdio.h>

int main()
{
	int score;
	scanf("%d",&score);
	
	if(score>=90)
	printf("A");
	else if(score>=80 && score<90)
	printf("B");
	else if(score>=70 && score<80)
	printf("C");
	else if(score>=60 && score<70)
	printf("D");
	else
	printf("E");
	return 0;
}

3-8 查询水果的单价

#include <stdio.h>

int main()
{
	int n;
	double price;
	printf("[1] apple\n");
	printf("[2] pear\n");
	printf("[3] orange\n");
	printf("[4] grape\n");
	printf("[0] exit\n");
	
	for(int i=1;i<=5;i++)
	{
		scanf("%d",&n);
		if(n==0)
		break;
		switch(n)
		{
			case 1:
				printf("price = 3.00\n");
				break;
			case 2:
				printf("price = 2.50\n");
				break;
			case 3:
				printf("price = 4.10\n");
				break;
			case 4:
				printf("price = 10.20\n");
				break;
			default:
				printf("price = 0.00\n");
				break;
		}
	}
	return 0;
}

exercise

3-1 比较3个整数的大小

#include <stdio.h>

int main()
{
	int a,b,c;
	int temp1,temp2,temp3;
	temp1=temp2=temp3=0;
	scanf("%d %d %d",&a,&b,&c);
	if(a>b)//暴力内嵌解题 
	{
		if(a>c)
		{
			if(b>c)
			{
				temp1 = a;
			    temp2 = b;
			    temp3 = c;
			}
			
			else
			{
				temp1 = a;
			    temp2 = c;
			    temp3 = b;
			}
			
		}
		else
		{
			temp1 = c;
		    temp2 = a;
		    temp3 = b;
		}	
	}
	else
	{
		if(a>c)
		{
			temp1 = b;
		    temp2 = a;
		    temp3 = c;
		}
		
		else
		{
			if(b>c)
			{
				temp1 = b;
		        temp2 = c;
		        temp3 = a;
			}
			
		    else
		    {
		    	temp1 = c;
		        temp2 = b;
		        temp3 = a;
			}	
		}
	}
	
	printf("%d->%d->%d",temp3,temp2,temp1);
	
	return 0;
}

3-2 高速公路超速罚款

#include <stdio.h>
int main()
{
	int carspeed,limspeed;
	double x;
	scanf("%d %d",&carspeed,&limspeed);
	x = (carspeed - limspeed)*100.0/limspeed;
	
	if(x>=10 && x<50)
	printf("Exceed %.0f%%. Ticket 200",x);//打两个%%才能输出一个% 
	else if(x>=50)
	printf("Exceed %.0f%%. License Revoked",x);
	else
	printf("OK");
	
	return 0;
}

3-3 出租车计价

#include <stdio.h>

int main()
{
	double mile,mprice,tprice;
	int time;
	mprice = 0;
	tprice = 0;
	
	scanf("%lf %d",&mile,&time);//输出不要限制格式为%.1lf,不然程序无法正常运行 
	
	if(mile<=3)//写分支时一定要注意 
	mprice = 10;
	else if(mile<=10)
	mprice = 10 + (mile - 3)*2;
	else
	mprice = 10 +(10 - 3)*2 + (mile - 10)*3;
	
	if(time>=5)
	tprice = (time*2)/5;//注意超过五分钟收费包括前面的五分钟 
	else
	tprice = 0;
	
	printf("%.0f",mprice+tprice);
	return 0;
}

3-4 统计学生成绩

#include <stdio.h>

int main()
{
	int N,score;
	int countA,countB,countC,countD,countE;
	countA=countB=countC=countD=countE=0;
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&score);
		if(score<60)
		countE++;
		else if(score<70)
		countD++;
		else if(score<80)
		countC++;
		else if(score<90)
		countB++;
		else
		countA++;
	}
	
	printf("%d %d %d %d %d",countA,countB,countC,countD,countE);
	return 0;
}

3-5 三角形判断

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

int main()
{
	double x1,y1,x2,y2,x3,y3;
	scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);//注意输入的格式要求 
	double L=0,s=0,A=0,L1=0,L2=0,L3=0;
	L1 = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
	L2 = sqrt(pow(x1-x3,2)+pow(y1-y3,2));
	L3 = sqrt(pow(x2-x3,2)+pow(y2-y3,2));
	
	if(L1+L2>L3 && L1+L3>L2 && L2+L3>L1)
	{
		L = L1+L2+L3;
    	s = (L1+L2+L3)/2;//注意公式不要用错了 
	    A = sqrt(s*(s-L1)*(s-L2)*(s-L3));
	    printf("L = %.2f, A = %.2f",L,A);
	}
	else
	printf("Impossible");

	return 0;
}

第四章

pratice

4-3 序列求和

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

int main()
{
	int flag = 1,denominator = 1;
	double eps,item=1,sum=0;
	scanf("%lf",&eps);
	
	while(fabs(item)>eps)
	{
		sum += item;
		flag = -flag;
		denominator += 3;
		item = flag*1.0/denominator;
	}
	sum += item;
	printf("sum = %.6f",sum);
	return 0;
}

4-6 猜数字游戏

#include <stdio.h>

int main()
{
	int mynumber,yournumber,N;
	int flag = 0, count = 0;
	scanf("%d %d",&mynumber,&N);
	
	while(count<N)
	{
		scanf("%d",&yournumber);//这里不要加换行符号 
		if(yournumber < 0)
	    {
		    break;
	    }
		count++;
		if(yournumber == mynumber)
		{
			if(count == 1)
    	    {
		       printf("Bingo!\n");
	        }
	        else if(count <= 3)
	        {
		       printf("Lucky You!");
	        }
	        else
	        {
		    printf("Good Guess!");
        	}
        	flag = 1;
        	break;
		}
		else if(yournumber > mynumber)
		{
			printf("Too big\n");
		}
		else
		{
			printf("Too small\n"); 
		} 
	}
	if(flag == 0)
	{
		printf("Game Over\n");
	}
	return 0;
}

4-7 求e的展开式的和

#include <stdio.h>

int main()
{
	int n;
	double item, sum=1;
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		item = 1;
		for(int j=1 ; j<=i ;j++)
		{
			item*=j;
		}
		sum += 1/item;
	}
	printf("%.8f",sum);
}

4-10 找出最小值

#include <stdio.h>

int main()
{
	int n,item,min;
	scanf("%d",&n);
	
	scanf("%d",&item);
	min = item;
	
	for(int i=1;i<n;i++)
	{
		scanf("%d",&item);
		if(item<min)
		min = item;
	}
	printf("min = %d",min);
	
	return 0;
}

4-11 统计素数并求和

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

int main()
{
	int M,N,flag;
	int count=0,sum=0,limit;
	scanf("%d%d",&M,&N);
	
	if(M<1 || M>N || N>500)
	{
		printf("Invalid.");
	}
	//if(M>=1 && M<=N && N<=500)
	else{
		for(int i=M;i<=N;i++)
	{
		if(i==1)
		{
			flag=0;
		}
		else if(i==2)
		{
			flag=1;
		}
		else
		{
			flag=1;
			limit =sqrt(N)+1;
		    for(int j=2;j<=limit;j++)
		    {
			   if(i%j==0)
			   {
				flag=0;
				break;
			   }
		    }
		}
		
		if(flag == 1)
		{
			count++;
			sum+=i;
		}
	
	}
	}
	printf("%d %d",count,sum);
	return 0;
}

exercise

4-1 求奇数和

#include <stdio.h>

int main()
{
	int n,sum = 0;
	scanf("%d",&n);
	
	while(n>0)
	{
		if(n%2!=0)
		{
			sum+=n;
		}
		scanf("%d",&n);//注意scanf放在后面 
	}
	printf("%d",sum);
	return 0;
}

4-2 展开式求和

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

double fact(int n);
int main()
{
	int k;
	double x,sum=1,item;
	scanf("%lf",&x);
	item =x;
	k=1;//把k拿出来就可以跑了 
	while(fabs(item)>= 0.0001)
	{
		item = pow(x,k)/fact(k);
		sum += item;
		k++;
	}
	printf("%.4f",sum);
	return 0;
}

double fact(int n)
{
	double product=1;
	for(int i=1;i<=n;i++)
	{
		product*=i;
	}
	return product;
}

4-3 求序列和2/1+3/2+5/3+8/5...

#include <stdio.h>

int main()
{
	int N;
	double f=2,d=1,t;
	double sum = 2, item;
	scanf("%d",&N);
	
	for(int i = 1; i<N ; i++)
	{
		t = f;//一定要有中间变量t,不然值会被覆盖 
		f = f+d;
		d = t;
		item = f/d;
		sum += item;
	}
	printf("%.2f",sum);
	return 0;
}

4-4 求序列和a+aa+aaa+aaa...

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

int main()
{
	int a,n;
	int s = 0, item = 0;
	scanf("%d %d",&a,&n);//知道问题了,因为输入a在定义之后所以报错 
	
	for(int i = 1; i <= n ; i++)
	{
		item = item*10 + a;
		s += item;
	}
	printf("s = %d",s);
	return 0;
}

4-5 换硬币

#include <stdio.h>

int main()
{
	int x,n1,n2,n5;
	int count = 0;
	scanf("%d",&x);
	
	for(n5 = (x-3)/5; n5>0; n5--)
	{
		for(n2 = (x-5*n5-1)/2; n2>0; n2--)
		{
			n1 = x-5*n5-2*n2;
			if(n1 > 0)
			{
				count ++;
				printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",n5,n2,n1,n1+n2+n5);
			}
		}
	}
	
	printf("count = %d",count);
	return 0;
}

4-6 输出水仙花数

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

/*int ipow (int x, int n)
{
   int i, p = 1;
   for (i = 1; i <= n; i++)
   {
        p = p * x;
   }
   return p;
}*/

int main (void)
{
   int a, b, digit, i, n, number, s;
 
   scanf ("%d", &n);
   a = pow (10, n-1);//N位数的最大值与最小值 
   //b = a*10;
   b = pow(10, n);
    
   for (i = a; i < b; i++)//从a到b依次遍历各个数 
   {
    s = 0;//s代表最后相加的总数 
    number = i;//代表把要检测的值赋给 
   
   while (number != 0)//对number进行逐位分离,分到最高位了,number就等于0了,循环跳出 
   {                  //也可以把循环条件写成number>0 
      digit = number % 10;
      number = number / 10;
      s = s + pow (digit, n);
   }
   if (i == s)//判断各位N方和是否与该数相等,如果相等即为水仙花数,将其输出
   {
      printf ("%d\n", s);
   } 
   }
  return 0;
}

4-7 求最大公约数和最小公倍数

#include <stdio.h>

int main()
{
	int m,n,j;
	scanf("%d %d",&m,&n);
	j=m;
	while(j%n!=0)
	{
		j=j+m;
	}
	printf("%d %d",(m*n)/j,j);
	
	return 0;
}

4-8 高空坠球

#include <stdio.h>

int main()
{
	int height,n;
	double s1,s2,sum;
	scanf("%d %d",&height,&n);
	//s1=height;
	s1 = height;
	s2 = 0.5*height; 
	if(n==0||height==0)
	{
		printf("0.0 0.0");
	}
	else
	{
		for(int i=1; i<=n; i++)
	    {
		/*s2+= 2*s1;
		s1 = 0.5*s1;
		sum = s2-height;//使用两个变量就够了,给s1的初始值赋为0.5height 
	    }*/
	    s1+= 2*s2;
		s2 = 0.5*s2;//交换了上面s1,s2的含义,在赋初始值的时候变化 
	    }
	    printf("%.1f %.1f",s1,s2);
	}	
	return 0;
}

4-9 打印菱形星号“*”图案

#include <stdio.h>
//要求*带空格 
int main()
{
	int i,j,n;//这里n为奇数 
	scanf("%d",&n);
	
	for(i=1; i<=n/2+1; i++)//控制每一行 ,n/2+1为最中间的行 ,先打印上半部分 
	{
		for(j=n/2+1-i; j>0; j--)//先打印空格,再打印* 
		{
			printf("  ");//如果这里是两个空格,上面j的初始值就不用*2 
		}
		for(j=1; j<=2*i-1; j++)//上半部分行数与*的关系 
		{
			printf("* ");
		}
		printf("\n");
	}
	
	for(i=1; i<=n/2; i++)//打印下半部分 ,这里为n/2,因为会取整 
	{
		for(j=1; j<=i; j++)//n为固定值,循环的变量是找到与i的关系 
		{
			printf("  ");//这里依旧为两个空格 
		}
		for(j=n-2*i; j>0; j--)
		{
			printf("* ");
		}
		printf("\n");
	}
	return 0;
}

评注:这里使用的是矩阵按行打印的思想,将菱形分为上下两部分分别实现,外循环控制行,内循环依次打印空格和星号,用循环的次数控制空格数与星号数。找到空格数与星号数与行的关系is the key point!

4-10 猴子吃桃问题

//n为偶数 
#include <stdio.h>

int main()
{
	int n,sum;
	scanf("%d",&n);
	sum = 1;
	for(int i=n; i>1; i--)//只需要计算n-1次  
	{
		sum = 2*(sum+1);
	} 
	printf("%d",sum);
	return 0;
}

评注:这里的一个大前提是N为偶数,key point为找到桃子总数的递推关系即sum=2*(sum+1),注意这里只用循环n-1次,因为第n-1次的循环通过递推式子就已经得到第N次的结果。

4-11 兔子繁殖问题

分析

Month123456
满1月兔对数n1101123
满2月兔对数n1010112
满3月及以上兔对数n3001123
sum112358

注:兔子要满三个月再生产,而不是在第三个月就生产!!!

#include <stdio.h>

int main()
{
	int n,n1,n2,n3,month;
	scanf("%d",&n);
	n1 = 1;
	n2 = 0;
	n3 = 0;
	month = 1;//注意这里起始条件为1月 
	while(n1+n2+n3<n)
	{
		n3 = n3 + n2;
		n2 = n1;
		n1 = n3;
		month++;
	}
	printf("%d",month);
	return 0;
}

评注:关于while循环体中三个变量的赋值,一定是先赋n3,若先赋n1,n3不好计算,需增加一个中间变量。本题的一个重要条件是满三月进一月兔进1,注意!

第七章

pratice

7-2 求最大值及其下标

找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

#include <stdio.h>

int main()
{
	int n,index,i;
	int a[10];//定义数组要说明大小 
	
	scanf("%d",&n);//确定数组元素个数 
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}//数组初始化 
	index = 0;
	for(i=1;i<n;i++)
	{
		if(a[index]<a[i])
		{
			index = i;
		}
	}
	printf("%d %d",a[index],index);
	return 0;
}

7-3 将数组中的数逆序输出

#include <stdio.h>

int main()
{
	int n,i,temp;
	int a[10];
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n/2;i++)
	{
		temp=a[i];
		a[i]=a[n-1-i];
		a[n-1-i]=temp;
	}
	for(i=0;i<n-1;i++)
	{
		printf("%d ",a[i]);
	}
	printf("%d",a[n-1]);//这样是保证最后的元素没有空格
	return 0;
}

7-4 找出不是两个数组共有的元素

#include <stdio.h>

int main()
{
	int m,n,i,j,flag1,flag2,flag3;
	int t=0;
	int a[20];
	int b[20];
	int c[40];//最坏情况每个元素都不相同 
	
	scanf("%d",&n);//对a[],b[]数组初始化,输入指定元素 
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);//&一定不要忘记 
	}
	scanf("%d",&m);
	for(i=0;i<m;i++) 
	{
		scanf("%d",&b[i]);
	}
	
	for(i=0;i<n;i++)//遍历数组a[]找出与b[]不相同的元素
	{
		flag1=1;
		for(j=0;j<m;j++)
		{
			if(a[i]==b[j])//修改了一处bug,这里是判等,而不是赋值 
			flag1=0;
		}
		if(flag1==1)
		{
			c[t++]=a[i];
		}		
	}
	
	for(i=0;i<m;i++)//遍历数组b[]找出与a[]不相同的元素
	{
		flag2=1;
		for(j=0;j<n;j++)
		{
			if(b[i]==a[j])
			{
				flag2=0;//第二处bug,这里是赋值,不是判等 
			}
		}
		if(flag2==1)
		{
			c[t++]=b[i];
		}
	}
	
	printf("%d",c[0]);//打印输出c[]中元素,重复的不输出 
	for(i=1;i<t;i++)
	{
		flag3=1;
		for(j=0;j<i;j++)
		{
			if(c[j]==c[i])
			{
				flag3=0;
			}
		}
		if(flag3==1)
		{
			printf(" %d",c[i]);
		}
	}
	
	return 0;
}

exercise

第八章

example

8-4 输入年份和天数,输出对应的年、月、日

#include <stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);//申明子函数调用需要加分号 

int main()
{
	int day,month,year,yearday;
	
	printf("please input year and yearday:");
	scanf("%d%d",&year,&yearday);//中间可以不用打空格
	month_day(year,yearday,&month,&day);
	printf("%d-%d-%d\n",year,month,day);
	
	return 0;
}

//先写子函数再调用
void month_day(int year,int yearday,int *pmonth,int *pday)//定义子函数结尾不需要加分号 
{
	int k,leap;
	int tab[2][13]=//定义二维数组存放非闰年和闰年每月的天数 
	{
		{0,31,28,31,30,31,30,31,31,30,31,30,31},//非闰年每个月的天数 
		{0,31,29,31,30,31,30,31,31,30,31,30,31},//闰年的2月为29天 
	};
	leap=(year%4==0&&year%100!=0)||year%400==0;//真则置1,假则置0,对应数组的行 
	//是闰年就是第1行,非闰年就是第0行 
	for(k=1;yearday>tab[leap][k];k++)//依次与给定行元素对比,大于则减去该元素,剩余数值继续比较 
	{
		yearday-=tab[leap][k];
	}
	*pmonth=k;//用指针进行参数传递 
	*pday=yearday;
} 

书上非常好的通过指针返回多个值的例子,这里记录对代码的思考过程

pratice

exercise

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值