LoveUnix » 编程开发 & Rational » 高手帮我看看这个程序~
让LU留住您的每

一天 让LU博客留住您的每一天
2007-6-19 23:16 hyi_020102
高手帮我看看这个程序~

[i]#include <stdio.h>
int main()
{
   puts("welcome to use a perpetual calendar ");
   puts("====================================");
   puts("|      Please select key:          |");
   puts("|      1. calculating the date     |");/*算某年的任何一天是星期几*/
   puts("|      2. print the months         |");/*打印某年任意一个月的月份*/
   puts("|      3. print the years          |");/*打印某年的年历*/
   puts("|      4. Return or exit           |");/*退出或者返回*/
   puts("====================================");
   SelectKey = getch();
}
while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' && SelectKey!='4' );
  switch(SelectKey)
    {
    case '1':
    clrscr();
int day,mn,yr,i,days=0,s,k;
int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char wek[][9]={ {'S','u','n','d','a','y'},
{'M','o','n','d','a','y'},
{'T','u','e','s','d','a','y'},
{'W','e','d','n','s','d','a','y'},
{'T','h','u','r','s','d','a','y'},
{'F','r','i','d','a','y'},
{'S','a','t','u','r','d','a','y'}
      };
printf("Inpute the date (year-month-day):");
scanf("%d-%d-%d",&yr,&mn,&day);
if (yr%4==0||yr%100==0||yr%400==0)
mont[2]=29;
else
mont[2]=28;
for (i=0;i<mn;i++)
days+=mont[i];
days+=day;
s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;
k=s%7;
printf("%d-%d-%d is %s.",yr,mn,day,wek[k]);
}
getch();
break;
    case '2':
    clrscr();
int JgYr(int yr)
{
    if (yr%4==0&&yr%100!=0||yr%100==0&&yr%400==0)
      return 1;
    else
      return 0;
}[/i]
[i]int CalWkd(int yr,int mth)
{
    int ds=0,i,rst,wkd;
    int mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (JgYr(yr))
      mthd[2]=29;
    for (i=1;i<mth;i++)
      ds+=mthd[i];
    ds+=1;
    rst=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+ds;
    wkd=rst%7;
    return wkd;
}[/i]
[i]showcld(int wkd,int mtd)
{
    int dt=1,i,j=0;
    printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
    for (i=0;i<wkd;i++)
    {
      printf("\t");
      j++;
    }
    while (j!=7)
    {
        printf("%d",dt);
        if (j<6)
            printf("\t");
        else
            printf("\n");
        dt++;
        j++;
    }
    while (1)
    {
        for (j=0;j<7;j++)
        {
            printf("%d",dt);
            if (j!=6)
                printf("\t");
            else
                printf("\n");
            if (dt!=mtd)
                dt++;
            else
                return 0;
            }
        }
    }[/i]
[i]int main()
{
    int yr,mth,mtd,wkd,mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("Input the Year and Month(Year-Month):");
    scanf("%d-%d",&yr,&mth);
    if (yr<0||mth<1||mth>12)
        return 0;
    if (JgYr(yr))
        mthd[2]=29;
    mtd=mthd[mth];
    wkd=CalWkd(yr,mth);
    showcld(wkd,mtd);
    return 0;
}[/i]
[i]    case '3':
    clrscr();
#include "stdio.h"
#include "string.h"
int main()
{
int i,s,w,year,month,day,days=0;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *wek[7]={"sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
printf("input the date (year-month-day):\n ");
scanf("%d %d %d",&year,&month,&day);
if ((year%4==0)&&(year%100!=0)||(year%400==0))
mon[2]=29;
for (i=0;i<month;i++)
days=days+mon[i];
days=days+day;
w=year-1+(int)((year-1)/4)-(int)((year-1)/100)+(int)((year-1)/400)+days;
s=w%7;
printf("%d-%d-%d is %s\n",year,month,day,wek[s]);
return 0;
}
#include<conio.h>
long int f(int year ,int month)
{if(month<3)return year-1;
else return year;
}
long int g(int month)
{if(month<3)return month+13;
else return month+1;
}
long int n(int year,int month,int day)
{return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{return(int)((n(year,month,day)%7-621049L%7+7)%7);
}
int date[12][6][7];
int day_tbl[][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}};
void main()
{int sw,leap,i,j,k,wd,day,year;
char title[]="   SUN MON TUE WED THU FRI SAT";
printf("You want to know the year:");
scanf("%d%*c",&year);
sw=w(year,1,1);
leap=year%4==0&&year%100!=0||year%400==0;
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;
for(i=0;i<12;i++)
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
{date[i][wd][sw]=day;
sw=++sw%7;
if(sw==0)wd++;
}
printf("============================================================\n");
printf("\n=================================%d=========================\n",year);
for(i=0;i<6;i++)
{for(wd=0,k=0;k<7;k++)
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s \n",i+1,title,i+7,title);
for(j=0;j<wd;j++)
{printf("    ");
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf("    ");
printf("       ");
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf("    ");
printf("\n");
}
}
puts("================================================================");
puts("Please put any key");
getch();
}
    case '4':
    clrscr();
    puts("================================");
    puts("|   Thank you for your using!  |");
    puts("|            Good bye!         |");
    puts("================================");
    getch();
    return;
  }
}
}
[/i][i][i][i][i][i][i][i][i][i]
[color=blue]
这个是我用TC编的万年历。可是有很多错误。老师的要求是:
内容:设计一个查询并打印万年历的程序。
[/color]要求:
1. 查询某年某月某日是星期几
2. 打印某年的某月的全月日历
3. 打印某年的全年日历
4. 退出
2. 在主菜单中输入1后,显示:
“请输入年月日(XXXX,XX,XX)”
运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?
如果输入Y,则重新显示 “请输入年月日(XXXX,XX,XX)”,否则回到主菜单。
3. 在主菜单中输入2后,显示:
“请输入要打印的月份(XXXX)”
运行后输出X月的日历,格式为:
X
4. 在主菜单中输入3后,显示:
“请输入要打印的年份(XXXX)”
运行后输出XXXX年的日历,
XXXX
X(月数)
0 1 2 3 4 5 6
S M T W T F S
x x x x x x x
x x x xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx
X(月数)
0 1 2 3 4 5 6
S M T W T F S
x x x x
x x x xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx
.
运行完后显示:“是否继续打印(Y/N)?”
如果输入Y,则重新显示,“请输入要打印的年份(XXXX)”,否则回到主菜单。
5. 在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”
如果输入Y,结束程序运行,否则重新显示主菜单。
[color=red]不知道出错在哪里?哪位帮忙修改下~~万分感谢~[/color][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

[color=red][i]下面这个[/i]附件是万年历的三个子程序,我想把他结合在一起,可是出错了~[/color]

[[i] 本帖最后由 hyi_020102 于 2007-6-19 23:24 编辑 [/i]]

2007-6-20 03:04 oraix
终于憋出来不少代码了,呵呵,恭喜!
编程是需要思想和耐心的, debug是最锻炼你的时候, 这是一种修炼.
当初我学编程的时候,没有电脑所有东西都要人工去静态模拟执行, 上机的时间基本就是修改输入错误和编译执行. 但这反而养成了一种良好的做事风格.

计算星期的公式已经弄到了,其实已经成功了一半. 剩下的就是计算如何输出, 可以生成一个矩阵/数组把所有的日子都排好, 或者用一个专用格式化输出函数,每次计算一个日期就马上输出到指定位置.

另外一年52个星期左右, 而字符下缺省屏幕是80*25的,估计你打不下, 除非重新设置屏幕显示模式,至少TC下面你需要这么做.

另外LZ的编程还需要养成好的习惯. 该有注释的地方没注释, 写注释的地方反而是没有必要做注释的(因为语句本身已经很明了了)
缩进需要更规范一些, 变量的命名也需要更有意义一些,更规范些.

C语言基础也应该补补,至少一个程序里面不会有两个main()
把这些都修炼好了,你就能开始体会创造一个东西的快乐了.

有点好为人师了, 呵呵, 不中听的地方, 就当没看到.
good luck

2007-6-20 17:41 hyi_020102
恩。谢谢LZ 哦,我会继续努力的~

2007-6-20 18:46 hyi_020102
#include <stdio.h>
#include <string.h>
#include<conio.h>
void main()
{  int num;
   puts("welcome to use a perpetual calendar ");
   puts("====================================");
   puts("|      Please select key:          |");
   puts("|      1. calculating the date     |");/*算某年的任何一天是星期几*/
   puts("|      2. print the months         |");/*打印某年任意一个月的月份*/
   puts("|      3. print the years          |");/*打印某年的年历*/
   puts("|      4. Return or exit           |");/*退出或者返回*/
   puts("====================================");
   scanf("%d",&num);
   clrscr();
   switch(num)
{
case 1:{ int day,mn,yr,i,days=0,s,k;
int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char wek[][9]={ {'S','u','n','d','a','y'},
{'M','o','n','d','a','y'},
{'T','u','e','s','d','a','y'},
{'W','e','d','n','s','d','a','y'},
{'T','h','u','r','s','d','a','y'},
{'F','r','i','d','a','y'},
{'S','a','t','u','r','d','a','y'}
};
printf("Inpute the date (year-month-day):");
scanf("%d-%d-%d",&yr,&mn,&day);
if (yr%4==0||yr%100==0||yr%400==0)
mont[2]=29;
else
mont[2]=28;
for (i=0;i<mn;i++)
days+=mont[i];
days+=day;
s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;
k=s%7;
printf("%d-%d-%d is %s.",yr,mn,day,wek[k]);
   break;
}
case 2:{
int months()
{
    int yr,mth,mtd,wkd,mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    printf("Input the Year and Month(Year-Month):");
    scanf("%d-%d",&yr,&mth);
    if (yr<0||mth<1||mth>12)
        return 0;
    if (JgYr(yr))
        mthd[2]=29;
    mtd=mthd[mth];
    wkd=CalWkd(yr,mth);
    showcld(wkd,mtd);
    return 0;

};
int JgYr(int yr)
{
    if (yr%4==0&&yr%100!=0||yr%100==0&&yr%400==0)
      return 1;
    else
      return 0;
}

int CalWkd(int yr,int mth)
{
    int ds=0,k,rst,wkd;
    int mthd[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (JgYr(yr))
      mthd[2]=29;
    for (j=1;k<mth;k++)
      ds+=mthd[i];
    ds+=1;
    rst=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+ds;
    wkd=rst%7;
    return wkd;
}

showcld(int wkd,int mtd)
{
    int dt=1,k,j=0;
    printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
    for (i=0;i<wkd;k++)
    {
      printf("\t");
      j++;
    }
    while (j!=7)
    {
        printf("%d",dt);
        if (j<6)
            printf("\t");
        else
            printf("\n");
        dt++;
        j++;
    }
    while (1)
    {
        for (j=0;j<7;j++)
        {
            printf("%d",dt);
            if (j!=6)
                printf("\t");
            else
                printf("\n");
            if (dt!=mtd)
                dt++;
            else
                return 0;
            }
        }
    }

}
case 3:{
int b,s,w,year,month,day,days=0;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *wek[7]={"sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
printf("input the date (year-month-day):\n ");
scanf("%d %d %d",&year,&month,&day);
if ((year%4==0)&&(year%100!=0)||(year%400==0))
mon[2]=29;
for (b=0;b<month;b++)
days=days+mon[f];
days=days+day;
w=year-1+(int)((year-1)/4)-(int)((year-1)/100)+(int)((year-1)/400)+days;
s=w%7;
printf("%d-%d-%d is %s\n",year,month,day,wek[s]);
return 0;
}
long int f(int year ,int month)
{if(month<3)return year-1;
else return year;
}
long int g(int month)
{if(month<3)return month+13;
else return month+1;
}
long int n(int year,int month,int day)
{return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{return(int)((n(year,month,day)%7-621049L%7+7)%7);
}
int date[12][6][7];
int day_tbl[][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}};
int years()
{int sw,leap,e,w,q,wd,day,year;
char title[]="   SUN MON TUE WED THU FRI SAT";
printf("You want to know the year:");
scanf("%d%*c",&year);
sw=w(year,1,1);
leap=year%4==0&&year%100!=0||year%400==0;
for(e=0;e<12;e++)
for(w=0;w<6;w++)
for(q=0;q<7;q++)
date[e][w][q]=0;
for(e=0;e<12;e++)
for(wd=0,day=1;day<=day_tbl[leap][e];day++)
{date[e][wd][sw]=day;
sw=++sw%7;
if(sw==0)wd++;
}
printf("============================================================\n");
printf("\n=================================%d=========================\n",year);
for(e=0;e<6;e++)
{for(wd=0,q=0;q<7;q++)
wd+=date[i][5][k]+date[e+6][5][q];
wd=wd?6:5;
printf("%2d %s %2d %s \n",e+1,title,e+7,title);
for(w=0;w<wd;w++)
{printf("    ");
for(q=0;q<7;q++)
if(date[e][w][q])
printf("%4d",date[e][w][q]);
else printf("    ");
printf("       ");
for(q=0;q<7;q++)
if(date[e+6][w][q])
printf("%4d",date[e+6][w][q]);
else printf("    ");
printf("\n");
}
}
puts("================================================================");
puts("Please put any key");
getch();
}
case 4:{
    clrscr();
    puts("================================");
    puts("|   Thank you for your using!  |");
    puts("|            Good bye!         |");
    puts("================================");
    return;
}
}
}
我重新编译下,还是有点错误,尤其是CASE2和case3这两个。我觉得应该没有错的,真不知道错在哪里啊?

2007-7-14 15:22 ardi
格式太乱,根本不想别人帮你解决问题

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.