QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 819|回复: 12

小弟想写个计算日期的程序

[复制链接]
发表于 2003-10-3 16:10:34 | 显示全部楼层 |阅读模式
小弟准备写个计算日期的程序,你输入哪年哪月哪天,就知道星期几的程序,
不知道各位大哥能给小弟我一点什么建议!
小弟的想法是用具体的哪天做个参照,用给出的日期,和参照的日期相比较,
然后除以7,余几就是星期几,不知道小弟的想法里还少了点什么!
第一次, 喜欢大家多多包涵!
发表于 2003-10-7 19:49:16 | 显示全部楼层
那就写出来给大家看看呀~~
实现的算法应该很简单,你准备用什么写?Gtk+2.x吗?
回复

使用道具 举报

 楼主| 发表于 2003-10-13 17:14:39 | 显示全部楼层
呵呵,我是newbie,随便写写,写了个雏形,
没有加上判闰年的,还有我把0000,1,1为星期一了,不知道好不好?
写了个小雏形,贴出来,接受大家的批评!
[code:1]
#include <iostream>
using namespace std;

class Data
{
  public:
       Data(int a,int b,int c);
//     ~Data();
  private:
    int year;
    int month;
    int day;
};

Data::Data(int a,int b,int c)
{
    month=a;day=b;year=c;
int l=c*356+a*30+b;
int m=l%7;
switch(m)
{
   case '1':cout<<"This is Monday";break;
   case '2':cout<<"This is Tuesday";break;
   case '3':cout<<"This is Wednesday";break;
   case '4':cout<<"This is Thursday";break;
   case '5':cout<<"This is Friday";break;
   case '6':cout<<"This is Saturday";break;
   case '7':cout<<"This is Sunday";break;
}
}

int main()
{
   int _month,_day,_year;
   cout<<"Please input a day:";
   cin>>_month>>_day>>_year;
Data a(_month,_day,_year);
}
/* data.cpp:In function 'int main()':
  data.cpp:37:warning:unused variable 'Data a'
*/

[/code:1]
呵呵,还有点小错误,大哥们指点一下,
回复

使用道具 举报

发表于 2003-10-21 23:35:20 | 显示全部楼层
switch()中的表达式是int,
case 1:
case 2
... ...
为什么加引号' '呢, ' '中表示的是单个字符啊

default: 你没有,这个是必要的,控制错误

int main(int argc, char** argv)

直接传入命令行参数不是更好吗?

还有就是最好把计算过程和,构造函数分开,这样结构才清楚

编译器提示的错误就是因为,你的计算过程包含在构造函数中,所以你根本没有使用对象的必要了
回复

使用道具 举报

发表于 2003-10-22 13:31:02 | 显示全部楼层
一个函数原型:
int fool();
人们不知道是没有参数还是作者忘了写参数表
所以没有参数就得写成:
int fool(void);

同理:
switch()中,没有写default到底是忘了还是不需要呢?即使是作者自己,以后要检查代码是否有错误时,自己也很难判断了~~
回复

使用道具 举报

 楼主| 发表于 2003-10-23 11:00:29 | 显示全部楼层
谢谢各位大哥的指点,我会继续努力的!
回复

使用道具 举报

 楼主| 发表于 2003-10-24 22:42:28 | 显示全部楼层
那一般把计算放在什么地方呢?不会是main中吧?
回复

使用道具 举报

发表于 2003-10-24 22:47:46 | 显示全部楼层
听说过“模块化”这个词吗?
回复

使用道具 举报

 楼主| 发表于 2003-10-25 14:31:43 | 显示全部楼层
template,这两天正在看,不过没有什么好例子!
回复

使用道具 举报

发表于 2003-10-25 19:08:48 | 显示全部楼层
模块化和Template“模板”是不同的

对模块化简单一点的理解就是把不同的功能用不用的模块,通常就是函数实现

你的程序里完全就可以声明一个新的函数,例如 char WhatDay(Data);
回复

使用道具 举报

 楼主| 发表于 2003-10-26 19:38:49 | 显示全部楼层
这个知识我到没有看到,谢谢fishcrazy兄提示!
回复

使用道具 举报

发表于 2004-3-11 18:19:17 | 显示全部楼层
偶刚学GTK,顺便写了一下,希望大家指点指点.
下面的程序支持从古到今到将来的任意一天(不过公元前1年输入0,前二年输入-1,以次类推),用到了一点天文的小知识--儒略日,有兴趣的话可以去看看.
[code:1]
#include<gtk/gtk.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

const gchar *yyear;
const gchar *mmonth;
const gchar *ddate;

int year;
int month;
int date;

int xingqi(int yy,int mm,int dd)
{
int y,m,A,B,xingqi;
int temp1,temp2,temp3;
float JD;
if((mm==1)||(mm==2))
{
  y=yy-1;
  m=mm+12;
}
else
{
  y=yy;
  m=mm;
}
if((yy<=1582)&&(mm<=10)&&(dd<15))
{
  A=B=0;
}
else
{
  A=y/100;
  B=2-A+(A/4);
}
temp1=365.25*y;
temp2=30.6001*(m+1);
JD=temp1+temp2+1720994.5+dd+B;
temp3=JD+1.5;
xingqi=temp3%7;
return xingqi;
}

void qingkong(GtkWidget *widget,GtkWidget *entry)
{
gtk_entry_set_text(GTK_ENTRY(entry),"");
}

void getyear(GtkWidget *widget,GtkWidget *entry)
{
yyear=gtk_entry_get_text(GTK_ENTRY(entry));
}

void getmonth(GtkWidget *widget,GtkWidget *entry)
{
mmonth=gtk_entry_get_text(GTK_ENTRY(entry));
}

void getdate(GtkWidget *widget,GtkWidget *entry)
{
ddate=gtk_entry_get_text(GTK_ENTRY(entry));
}

void jishuan(GtkWidget *widget,GtkWidget *entry)
{
int xingqishu;
year=atoi(yyear);
month=atoi(mmonth);
if(month<=0||month>12)
{
   gtk_entry_set_text(GTK_ENTRY(entry),"Wrong month");
}
else
{
  date=atoi(ddate);
  if(date<=0||date>31)
  {
   gtk_entry_set_text(GTK_ENTRY(entry),"wrong date");
  }
  else
  {
   xingqishu=xingqi(year,month,date);
   switch(xingqishu)
   {
    case 0:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Sunday");break;
    case 1:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Monday");break;
    case 2:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Tuesday");break;
    case 3:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Wednesday");break;
    case 4:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Thirstday");break;
    case 5:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Friday");break;
    case 6:gtk_entry_set_text(GTK_ENTRY(entry),"The day is Saturday");break;
    default:break;
   }
  }
}
}

int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *vbox,*hbox;
GtkWidget *entry_year,*entry_month,*entry_date,*entry_xingqi;
GtkWidget *label;
GtkWidget *button;
GtkWidget *separator;

gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

vbox=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_widget_show(vbox);

hbox=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(vbox),hbox);
gtk_widget_show(hbox);
label=gtk_label_new("What day is it ?");
gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,0);
gtk_widget_show(label);

separator=gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(vbox),separator,FALSE,TRUE,10);
gtk_widget_show(separator);

entry_xingqi=gtk_entry_new();
gtk_editable_set_editable(GTK_EDITABLE(entry_xingqi),FALSE);
gtk_box_pack_start(GTK_BOX(vbox),entry_xingqi,FALSE,FALSE,0);
gtk_widget_show(entry_xingqi);

hbox=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(vbox),hbox);
gtk_widget_show(hbox);
entry_year=gtk_entry_new();
g_signal_connect(G_OBJECT(entry_year),"changed",
                  G_CALLBACK(qingkong),entry_xingqi);
gtk_box_pack_start(GTK_BOX(hbox),entry_year,FALSE,FALSE,5);
gtk_widget_show(entry_year);
label=gtk_label_new("year");
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
gtk_widget_show(label);

hbox=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(vbox),hbox);
gtk_widget_show(hbox);
entry_month=gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry_month),2);
g_signal_connect(G_OBJECT(entry_month),"changed",
                  G_CALLBACK(qingkong),entry_xingqi);
gtk_box_pack_start(GTK_BOX(hbox),entry_month,FALSE,FALSE,5);
gtk_widget_show(entry_month);
label=gtk_label_new("month");
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
gtk_widget_show(label);

hbox=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(vbox),hbox);
gtk_widget_show(hbox);
entry_date=gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry_date),2);
g_signal_connect(G_OBJECT(entry_date),"changed",
                  G_CALLBACK(qingkong),entry_xingqi);
gtk_box_pack_start(GTK_BOX(hbox),entry_date,FALSE,FALSE,5);
gtk_widget_show(entry_date);
label=gtk_label_new("date");
gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5);
gtk_widget_show(label);

button=gtk_button_new_with_label("check now");
g_signal_connect(G_OBJECT(button),"clicked",
                  G_CALLBACK(getyear),entry_year);
g_signal_connect(G_OBJECT(button),"clicked",
                  G_CALLBACK(getmonth),entry_month);
g_signal_connect(G_OBJECT(button),"clicked",
                  G_CALLBACK(getdate),entry_date);
g_signal_connect(G_OBJECT(button),"clicked",
                  G_CALLBACK(jishuan),entry_xingqi);
gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
gtk_widget_show(button);

separator=gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(vbox),separator,FALSE,TRUE,10);
gtk_widget_show(separator);

button=gtk_button_new_with_label("quit");
g_signal_connect(G_OBJECT(button),"clicked",
                  G_CALLBACK(gtk_main_quit),NULL);
gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,FALSE,0);
gtk_widget_show(button);

gtk_widget_show(window);

gtk_main();

return 0;
}
[/code:1]
[/code]
回复

使用道具 举报

发表于 2004-3-11 18:35:08 | 显示全部楼层
忘了说如何编译
编译:将文件保存为getxingqi.c
gcc getxingqi.c  `pkg-config --cflags --libs gtk+-2.0`
./a.out
不过这里还有一个bug(还是不说吧,呵呵,再想想)
[img]

呢?图怎么贴啊?? [/img]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 20:34 , Processed in 0.061487 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表