【选做题】中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”?
*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从1990年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
C语言中判断能否整除可以使用求余运算(即求模)
*程序与程序注释
#include <stdio.h>
#include <stdlib.h>
struct Date{
int year;
int month;
int day;
};
int days(struct Date date)
{
static int day_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,},
};
int i,lp;
/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
lp= date.year % 4 == 0 && date.year % 100 !=0 || date.year % 400 == 0;
for(i=1;i<date.month;i++) /*计算本年中自1月1日起的天数*/
date.day += day_tab[lp][i];
return date.day;
}
int main()
{
struct Date today,term;
int daysum,year,day;
printf("输入 年/月/日(格式:yy mm dd):\n");
while( 3 != scanf("%d%d%d", //如果输入不正确则继续提示输入
&today.year,&today.month,&today.day))
{
printf("输入格式错误,请重新输入\n"
"\t格式:yy mm dd\n");
fflush(stdin); //清除输入缓冲区
}
term.month = 12; /*设置变量的初始值:月*/
term.day = 31; /*设置变量的初始值:日*/
for(daysum=0,year=1990;year<today.year;year++)
{
term.year = year;
daysum +=days(term); /*计算从1990年至指定年的前一年共有多少天*/
}
daysum += days(today); /*加上指定年中到指定日期的天数*/
day = daysum%5; /*求余数*/
if( day>0 && day<4)
printf("这天捕鱼.\n"); /*打印结果*/
else
printf("这天晒网.\n");
system("pause");
return 0;
}
【选做题】输入一个时间(年、月、日、时、分、秒),判断时间是否合法,输出下一秒的时间
例如:输入2000-2-29 23:59:59
输出2000-3-1 0:0:0
// ***************************************************************
// 例如输入当前时间2006年12月20日19时17分59秒,
// 计算后输出时间是2006年12月20日19时18分00秒。
// 程序要求:
// 1) 程序应该可以运行:通过控制台输入数据,输出数据通过printf给出;
// 2) 程序结构明了、逻辑清晰;
// 3) 请考虑闰年、月份(大小)等逻辑;
// 4) 程序功能完整;
// ***************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Month_Day[2][12] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
//判断是否是闰年,是则返回1,否则返回0
int is_leap_year(int y)
{
return ((y % 400 == 0) || ((y % 4 == 0)&&(y % 100 != 0)));
}
//得到下一天的日期
void get_next_day(int *Y,int *M,int *D)
{
int carry1=0,carry2=0; //记录进位
carry2 = ((*D) + 1) / Month_Day[is_leap_year(*Y)][(*M)];
*D = ((*D) + 1) % Month_Day[is_leap_year(*Y)][(*M)];
carry1 = ((*M) + carry2) / 12;
*M = ((*M) + carry2) % 12;
*Y += carry1;
}
//得到下一秒
int get_next_sec(int *h,int *m,int *s)
{
int iC1 = 0, iC2 = 0;
iC1 = (*s + 1) / 60;
*s = (*s + 1) % 60;
iC2 = (*m + iC1) / 60;
*m = (*m + iC1) % 60;
iC1 = (*h + iC2) / 24;
*h = (*h + iC2) % 24;
return iC1;
}
//得到下一秒的日期时间
void nextSec(struct tm * st)
{
int c = get_next_sec(& st->tm_hour, & st->tm_min, & st->tm_sec);
if ( c != 0 ) //如果下一秒小时有进位
{
get_next_day(& st->tm_year, & st->tm_mon, & st->tm_mday);
}
}
//输入时间
struct tm * inPutTime(struct tm * st)
{
printf("请输入时间(格式:yy mm dd hh mi ss):\n");
while( 6 != scanf("%d%d%d%d%d%d", //如果输入不正确则继续提示输入
& st->tm_year, & st->tm_mon, & st->tm_mday,
& st->tm_hour, & st->tm_min, & st->tm_sec))
{
printf("输入格式错误,请重新输入\n"
"\t格式:yy mm dd hh mi ss\n");
fflush(stdin); //清除输入缓冲区
}
st->tm_mon -= 1; //输入的月份转换成内部存储的月份
st->tm_mday -= 1; //输入的日期转换成内部存储的日期
return st;
}
//输出日期和时间
void outPutTime(struct tm *st)
{
//输出日期
printf("%d年%d月%d日", st->tm_year, st->tm_mon +1, st->tm_mday +1);
//输出时间
(st->tm_hour < 10) ? printf("0"):printf("");
printf("%d时", st->tm_hour);
(st->tm_min == 0) ? printf("0"):printf("");
printf("%d分", st->tm_min);
(st->tm_sec == 0) ? printf("0"):printf("");
printf("%d秒", st->tm_sec);
}
int main()
{
struct tm st;
inPutTime(&st);
printf("\n当前时间:\n");
outPutTime(&st);
nextSec(&st);
printf("\n一秒以后的时间是:\n");
outPutTime(&st);
printf("\n");
system("pause");
return 0;
}
【基本题】有三个整数a、b、c,由键盘输入,输出其最大的数。
#include <stdio.h>
void main()
{
int a,b,c;
int m;
printf("Please input a b c\n");
scanf("%d %d %d",&a,&b,&c);
m = a;
if (b > m) m = b;
if (c > m) m = c;
printf("Max is %d\n",m);
}
【基本题】给一个不多于5位的正整数,要求如下:
1、求出它是几位数
2、分别输出每一位数字
3、按逆序输出各位数字,例如原数为321,应输出123
#include <stdio.h>
void main()
{
int digits=0; //位数
int i=0;
long int temp;
long int number; //输入的数据
int a[5]; //存储各位
printf("Input a postive interger:\n");
scanf("%ld",&number);
if((number<0)||(number>=100000))
{
printf("Input Error!\n");
return;
}
temp=number;
while(temp!=0)
{
digits++;
temp=temp/10;
}
printf("The digits of the interger is %d\n",digits);
a[4]=number%10; //个位
temp=number/10;
a[3]=temp%10; //十位
temp=temp/10;
a[2]=temp%10; //百位
temp=temp/10;
a[1]=temp%10; //千位
a[0]=temp/10; //万位
while(i<digits)
{
printf("%d",a[4-i]);
i++;
}
printf("\n");
}
【基本题】输入两个正整数m和n,求其最大公约数和最小公倍数
main()
{
int p,r,n,m,temp;
printf("请输入两个正整数 n,m:");
scanf("%d,%d",&n,&m);
if(n<m) //n放大数,m放小数
{temp=n;
n=m;
m=temp;
}
p=n*m;
while(m!=0)
{r=n%m;
n=m;
m=r;
}
printf("它们的最大公约数为:%d\n",n);
printf("它们的最小公倍数为:%d\n",p/n);
}
【基本题】求100之内的素数
#include <stdio.h>
#include "math.h"
#define N 101
main()
{
int i,j,line,a[N];
for(i=2;i<N;i++) a[i]=i;
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;}
printf("\n");
for(i=2,line=0;i<N;i++)0
{
if(a[i]!=0)
{printf("%5d",a[i]);
line++;}
if(line==10)
{printf("\n");
line=0;}
}
}