自己练习的~C语言经典编程282例。每天坚持!加油!
//实例013 任意次方后的最后三位/*#include<stdio.h>
void main()
{
int x,y,a[3];
printf("请输入两个数,x和y(x^y)\n");
scanf("%d%d",&x,&y);
a[2]=(x^y)%10;
for(int i=1;i>=0;i--)
{
a[i]=a[i+1]%10;
}
for(i=0;i<3;i++)
{
printf("%d",a[i]);
}
}*/
//第一次程序算法有误。何为正确算法?!
/*#include<stdio.h>
void main()
{
int i,x,y,z=1;
printf("请输入两个数,x和y(x^y)\n");
scanf("%d%d",&x,&y);
for(i=0;i<y;i++)
{
z=z*x%1000;//核心代码
}
if(z>=100)
{
printf("%d^%d的最后三位为%d\n",x,y,z);
}
else if(z>=10&&z<100)
{
printf("%d^%d为0%d\n",x,y,z);
}
else if(z<10)
{
printf("%d^%d为00%d\n",x,y,z);
}
}*/
//体会:对于对1000求余,产生的结果即为:若小于1000则是本身,若大于1000,则将其商算出后仍余下三位数。这就是不越界而求出后三位的玄妙之处。
//实例014 输入年月日,计算某日是该年的第几天
/*#include<stdio.h>
int leap(int y);
int number(int y,int m,int d);
void main()
{
unsigned int y,m,d;
printf("请输入年-月-日:\n");
scanf("%u-%u-%u",&y,&m,&d);
printf("该日期为该年的第%d天",number(y,m,d));
}
int leap(int y)//判断年份是否为闰年
{
if(y%4==0&&y%100!=0||y%400==0)
return 1;
else
return 0;
}
int number(int y,int m,int d)//判断输入日期为该年第几天
{
int sum=0;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
if(leap(y)==0)
{
for(int i=0;i<m-1;i++)
{
sum+=a[i];
}
return sum=sum+d;
}
if(leap(y)==1)
{
for(int i=0;i<m-1;i++)
{
sum+=b[i];
}
return sum=sum+d;
}
}*/
//小结:利用函数进行功能的划分,主函数简洁明了。在计算天数时,利用两个数组结合for循环进行加和,进而求出天数。
//015 婚礼上的谎言
/*#include<stdio.h>
void main()
{
int a,b,c;
for(a=1;a<=3;a++)//a=1意为a与x结婚;a=2意为a与y结婚...
for(b=1;b<=3;b++)
for(c=1;c<=3;c++)
if(a!=1&&c!=1&&c!=3&&a!=b&&a!=c&&b!=c)
{
printf("z将嫁给A\n");//其实把经过推理直接算出的结果打印出即可。
printf("%c将嫁给B\n",'X'+b-1);//但是这样计算更高端一点。(不太理解??)
printf("%c将嫁给C\n",'X'+c-1);
}
}*/
//小结:本题通过笔算和逻辑推理可以得出结果。但是不知道如何通过计算机进行算法设计。本题核心算法在于通过穷举法a=1意为a与x结婚;a=2意为a与y结婚...进行for循环的嵌套,
//遍历每一种可能性,在满足所有不能条件的基础上,注意同性不能结婚,此时,即可打印出自己的正确推测结果。
//016 百元买百鸡
/*#include<stdio.h>
void main()
{
int x,y,z;//公鸡数,母鸡数,小鸡数
for(x=0;x<=20;x++)//钱数最多买20只公鸡
{
for(y=0;y<=33;y++)//最多买33只母鸡
{
for(z=3;z<=99;z++)//最多买99只小鸡
{
if(5*x+3*y+z/3==100)
{
if(x+y+z==100)
{
if(z%3==0)//小鸡要是3的倍数
{
printf("公鸡:%d 母鸡:%d 小鸡:%d\n",x,y,z);
}
}
}
}
}
}
}*/
//小结:注意范围判断。第一次编写就是忽略了范围判断因此无法进行有效的运算!
//通过范围的限制和穷举一次次计算是否满足条件,满足即输出结果。考察for和if的嵌套使用。
//017 打渔晒网问题
/*#include<stdio.h>
int leap(int y);
int number(int y,int m, int d);
void main()
{
int y,m,d,days,day;
printf("请输入2011年1月1日之后的年-月-日:\n");
scanf("%d-%d-%d",&y,&m,&d);
days=number(y,m,d);
day=days%5;
if(day>=1&&day<=3)
{
printf("%d-%d-%d,打渔\n",y,m,d);
}
else printf("%d-%d-%d,晒网\n",y,m,d);
}
int leap(int y)//判断是平年还是闰年
{
if(y%4==0&&y%100!=0||y%400==0)
return 1;
else return 0;
}
int number(int y,int m, int d)//判断该日子距2011年1月1日多少天
{
int i,sum=0,k,n;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
if(leap(y)==0)
{
for(i=0;i<m-1;i++)
{
sum+=a[i];
}
sum+=d;
}
if(leap(y)==1)
{
for(i=0;i<m-1;i++)
{
sum+=b[i];
}
sum+=d;
}
k=y-2011;
if(k==0)
{
printf("该日子距2011年1月1日%d天\n",sum);
}
else//感觉这里之下的程序未执行。
{
for(n=0;n<k;n++)
{
if(leap(y)==0)
{
sum+=365;
}
else
{
sum+=366;
}
}
printf("该日子距2011年1月1日%d天\n",sum);
}
return sum;//出现问题:在2011年内的可以正确运算,但在2011年之后的不可以计算出距2011年1月1日多少天!*/
//解决问题:在第一个if之后就返回了sum的值,导致函数结束,而事实上函数还有另一个判断条件。因此,应先进行完if-else的判断,再决定返回值。
//当未利用指针进行操作时,函数返回值只能有一个。
//}
//018 判断三角形的类型
#include<stdio.h>
#include<math.h>
void main()
{
printf("Please input a,b,c:\n");
float a,b,c;
float l,s;
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)//"任意"两边之和大于第三边才是满足可以构成三角形的条件。要满足任意需要使用&&
{
printf("此三边能够组成三角形\n");
l=(float)(a+b+c)/2;
s=(float)sqrt/*开方*/(l*(l-a)*(l-b)*(l-c));//学到了关于任意三角形求取面积的公式。
printf("此三角形面积为%.2f\n",s);
if(a==b&&a==c)//a==b而且a==c,不就意味着a==b==c么!
{
printf("此三角形为等边三角形\n");
}
if(a==b||b==c||a==c)//有三种可能性,只要有一种成立。就是等腰三角形。
{
printf("此三角形为等腰三角形\n");
}
if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))//三种情况中,只要有一种成立(勾股定理),就是直角三角形。
{
printf("此三角形为直角三角形\n");
}
}
}
//小结:本题中忽略了几个问题。任意两边之和大于第三边才是满足可以构成三角形的条件。在此总条件下才可进行其他详细的判断。注意&&与||的使用。编程逐渐熟练,小错误也少了。很棒!继续加油!