C基本题回顾

来源:互联网 发布:网络割接 编辑:程序博客网 时间:2024/05/19 23:10

【选做题】中国有句俗语叫“三天打鱼两天晒网”。某人从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;}
}
}

原创粉丝点击