谁知道怎么用C语言编写万年历啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁知道怎么用C语言编写万年历啊相关的知识,希望对你有一定的参考价值。

系统实现万年历的功能,以交互的方式显示。适用于从公元1年1月1日至公元10000年之间所有日期的显示,在屏幕上任意输入某一年,系统可输出该年的年历;在屏幕上任意输入某年某月,都会以一个二维数组的形式显示该月所有天数以及每天所对应的星期值;在屏幕上任意输入一个年、月、日,都会显示出该天是星期几。

实现输入年月日输出星期用蔡勒公式,蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。

蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1

公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意对负数的取模运算!) 其他的没怎么研究过
参考技术A 说实话 你说的不是很清楚明白,我们都不知道你要的是什么比如你用什么显示,你用的是什么比如单片机?液晶1602?还是用别的都不说 这个不好贴! 我现在贴一个我自己以前写过的 用单片机AT89C52的用液晶1602做过的一个 万年历吧!#include<reg51.h>
#include<math.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define DB7_DB0 P1
#define DB7 P1_7
#define DataPort P1
uchar Data=0;
uchar i,lcd;
uchar sec0=0;
uchar sec1=0;
uchar min0=0;
uchar min1=0;
uchar hour0=0;
uchar hour1=0;
uchar num,len1,len2;
sbit RS=P2^1;
sbit RW=P2^2;
sbit E=P2^3;
uchar code q[]="0""1""2""3""4""5""6""7""8""9";
uchar code p[]="0""1""2""3""4""5""6";
uchar code s[]="0""1""2""3""4""5""6""7""8""9";
uchar code w[]="0""1""2""3""4""5""6";
uchar code a[]="0""1""2""3""4""5""6""7""8""9";
uchar code b[]="0""1""2";
uchar tab[]=0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x00<br> 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01<br> 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码 0x02<br> ;
uchar code tab2[]="20091229";
void lcd_wcom(uchar iadt);
/*********延时1ms***********/
void delay(uint k)

uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++)
;


////////////////////////////////////////////////////
key()

//if(BY1==0) //判断是否按测P3.4肯定为低电平。
//
//delay(10); //延时,软件去干扰 // if(BY1==0)
// //确认按键按下
sec0+=1;
if(sec0>9)sec1++;sec0=0;
if(sec1>=6)min0++;sec1=0;
if(min0>9)min1++;min0=0;
if(min1>=6)hour0++;min1=0;
if(hour0>9)hour1++;hour0=0;
if(hour1==2&hour0==4)hour0=0,hour1=0;
//
/*****************检验忙信号子函数********************/
void WaitForEnable(void)

DataPort=0xff;
RS=0;
RW=1;
E=1;
delay(5);
E=0;
return;

/******************写命令到LCM子函数*******************/
void WriteCommandLCM(uchar CMD,uchar Attribc)

if(Attribc)WaitForEnable();
RS=0;RW=0;
DataPort=CMD;
E=1; E=0;

/*****************写数据到LCM子函数*******************/
void WriteDataLCM(uchar dataW)

WaitForEnable();
RS=1;RW=0;
DataPort=dataW;
E=1;E=0;

/*****************LCM初始化子函数********************/
void InitLcd()

WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);

/**************显示指定坐标一个字符的子函数**********************/
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData)

Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,1);
WriteDataLCM(DData);

/*************************************/
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code*DData)

uchar ListLength=0;
Y&=0x1;
X&=0xF;
while(X<=10)

DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;

/*************************************/
/********************读忙子程序*********************/
void busy()

RS=0;
RW=1;
E=1;
delay(500);
E=0;
while(DB7_DB0&0x80);
return;

/*************初始化子程序***************/
void init(void)

lcd_wcom(0x01);//清0
busy();
lcd_wcom(0x38);//8位总线 双行 5*7显示
busy();
lcd_wcom(0x0f);//高电平表示开显示 高电平表示有光标 高电平光标闪烁
busy();
lcd_wcom(0x06);//光标移动方向,高电平右移 屏幕上所有文字是否左移或者右移。高电平表示有效
busy();
return;

/***********命令或地址写入子程序************/
void lcd_wcom ( uchar com)//当RS和R/W共同为低电平时可以写入指令或者显示地址

DB7_DB0=com;
RS=0;
RW=0;
E=1;
delay(500);
E=0;
return;

/************数据写入子程序*************/
void lcd_wdat(uchar dat)

DB7_DB0=dat;
RS=1;
RW=0;
E=1;
delay(1500);
E=0;
return;

/***************************************************/
void main()

char m;
len1=sizeof(tab2);
init();//初始化
lcd_wcom(0x40);//写年月日
for(m=0;m<32;m++)//

lcd_wdat(tab[m]);

lcd_wcom(0x80);//2009
for(num=0;num<4;num++)

lcd_wdat(tab2[num]);
delay(80);

lcd_wcom(0x84);//年
lcd_wdat(0);//
lcd_wcom(0x86);//08
for(num=4;num<6;num++)

lcd_wdat(tab2[num]);
delay(80);

lcd_wcom(0x88);//月 lcd_wdat(1);//
lcd_wcom(0x8A);//08
for(num=6;num<len1;num++)

lcd_wdat(tab2[num]);
delay(80);

lcd_wcom(0x8C);//日 lcd_wdat(2);//
while(1)

key();

DisplayOneChar(2,1,b[hour1]);
DisplayOneChar(3,1,a[hour0]);
DisplayOneChar(4,1,0x3a);
DisplayOneChar(5,1,w[min1]);
DisplayOneChar(6,1,s[min0]);
DisplayOneChar(7,1,0x3a);
DisplayOneChar(8,1,p[sec1]);
DisplayOneChar(9,1,q[sec0]);
delay(3000);

//DisplayListChar(0,0,&q[i]);
delay(100);
//conv();

谁知道 文件分割合并工具的 C++源码啊?

实现基本功能就行

给你个Java的
public class FileCut
/*cl_tl*/

private Shell shell;
private Display display;
private Text txtSourceFile;
private Text txtNewFilePath;
private Text txtFileSize;
private Button btnChooseFile;
private Button btnChoosePath;
private Button btnCut;
private Button btnUnionFiles;
private Button btnUp;
private Button btnDown;
private Button btnClear;
private Button btnClearAll;
private Button btnUnion;
private Table tblFileList;

private File sourceFile = null; /*源文件*/
private File[] newFile = null; /*分割后产生的文件*/
private int fileCount = 0; /*分割成的文件个数*/
private int fileSize = 0; /*分割的文件块大小*/
private String strSourceFile = null; /*源文件路径及名称*/
private String strNewFilePath = null; /*分割文件存放路径*/

public static void main(String[] args)

Display display=new Display();
FileCut Item=new FileCut();
Item.createShell();

while( !Item.shell.isDisposed())

if(!display.readAndDispatch())
display.sleep();

display.dispose();


/*fn_hd
*rem:创建窗体
*aut:
*log:2005-11-24
*/
private void createShell()
/*fn_tl*/

shell = new Shell(display, SWT.MIN);
shell.setBounds(300,250,500,330);
shell.setText("文件分割合并");
GridLayout shellLayout = new GridLayout();
shellLayout.numColumns = 3;
shell.setLayout(shellLayout);
createWidgets();
shell.open();


/**fn_hd
*rem:在窗体内添加控件
*per:
*aut:
*log:2005-11-24
*/
private void createWidgets()
/*fn_tl*/

final Label lblNull0 = new Label(shell,SWT.None);
GridData gd0 = new GridData();
gd0.horizontalSpan = 3;
lblNull0.setLayoutData(gd0);

final Label lblSourceFile = new Label(shell, SWT.None);
lblSourceFile.setText("源 文 件");

GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
txtSourceFile = new Text(shell, SWT.BORDER);
txtSourceFile.setLayoutData(gd2);

btnChooseFile = new Button(shell, SWT.PUSH);
btnChooseFile.setText("..");

final Label lblPath = new Label(shell, SWT.None);
lblPath.setText("存放路径");

txtNewFilePath = new Text(shell, SWT.BORDER);
GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
txtNewFilePath.setLayoutData(gd3);

btnChoosePath = new Button(shell, SWT.PUSH);
btnChoosePath.setText("..");

final Label lblSize = new Label(shell, SWT.None);
lblSize.setText("分块大小(KB)");

txtFileSize = new Text(shell,SWT.BORDER);
GridData gd7 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
txtFileSize.setLayoutData(gd7);

btnCut = new Button(shell, SWT.PUSH);
GridData gd4 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
btnCut.setLayoutData(gd4);
btnCut.setText("开始分割");

final Label lbl1 = new Label(shell, SWT.None);
GridData gd8 = new GridData();
gd8.horizontalSpan = 3;
lbl1.setLayoutData(gd8);
lbl1.setText("待合并的文件列表");

tblFileList = new Table(shell, SWT.BORDER);
GridData gd1 = new GridData(GridData.FILL_BOTH);
gd1.horizontalSpan = 2;
tblFileList.setLayoutData(gd1);

Composite com = new Composite(shell, SWT.None);
GridLayout comLayout = new GridLayout();
com.setLayout(comLayout);

final Label lblNote = new Label(shell, SWT.None);
GridData data = new GridData();
data.horizontalSpan=3;
lblNote.setLayoutData(data);
lblNote.setText("提示:注意合并文件的顺序");

btnUnionFiles = new Button(com, SWT.PUSH);
btnUnionFiles.setText("选择文件");

btnUp = new Button(com, SWT.PUSH);
btnUp.setText(" 上移 ");
btnUp.setEnabled(false);

btnDown = new Button(com, SWT.PUSH);
btnDown.setText(" 下移 ");
btnDown.setEnabled(false);

btnClear = new Button(com, SWT.PUSH);
btnClear.setText(" 删除 ");
btnClear.setEnabled(false);

btnClearAll = new Button(com, SWT.PUSH);
btnClearAll.setText("清空列表");

btnUnion = new Button(com, SWT.PUSH);
btnUnion.setText("开始合并");

btnCut.addSelectionListener(new SelectionAdapter()
//添加"开始分割"监视器

public void widgetSelected(SelectionEvent event)

cutButtonEvent();

);

btnChooseFile.addSelectionListener(new SelectionAdapter()
//添加选择(源文件)监视器

public void widgetSelected(SelectionEvent event)

FileDialog fdOpen = new FileDialog(shell,SWT.OPEN);
String strFileName = fdOpen.open();
if (strFileName != null)

txtSourceFile.setText(strFileName);
txtNewFilePath.setText(fdOpen.getFilterPath());
txtFileSize.setFocus();


);

btnChoosePath.addSelectionListener(new SelectionAdapter()
//添加选择(分割文件存放路径)监视器

public void widgetSelected(SelectionEvent event)

DirectoryDialog dirDia = new DirectoryDialog(shell);
String strFileDir = dirDia.open();
if (strFileDir != null)

txtNewFilePath.setText(strFileDir);
txtFileSize.setFocus();


);

btnUp.addSelectionListener(new SelectionAdapter()
//添加"上移"监视器

public void widgetSelected(SelectionEvent event)

//int[] itemIndices = tblFileList.getSelectionIndices();
int itemIndex = tblFileList.getSelectionIndex();
if (itemIndex == 0)

tblFileList.setFocus();
return;

//交换列表中两行的内容
String strTemp = tblFileList.getItem(itemIndex).getText();
tblFileList.getItem(itemIndex).setText(tblFileList.getItem(
itemIndex - 1).getText());
tblFileList.getItem(itemIndex - 1).setText(strTemp);
//设置焦点
tblFileList.setSelection(itemIndex - 1);
tblFileList.setFocus();

);

btnDown.addSelectionListener(new SelectionAdapter()
//添加"下移"监视器

public void widgetSelected(SelectionEvent event)

//int[] itemIndices = tblFileList.getSelectionIndices();
int itemIndex = tblFileList.getSelectionIndex();
if (itemIndex == tblFileList.getItemCount() - 1)

tblFileList.setFocus();
return;

//交换列表中两行的内容
String strTemp = tblFileList.getItem(itemIndex).getText();
tblFileList.getItem(itemIndex).setText(tblFileList.getItem(
itemIndex + 1).getText());
tblFileList.getItem(itemIndex + 1).setText(strTemp);
//设置焦点
tblFileList.setSelection(itemIndex + 1);
tblFileList.setFocus();

);

btnClear.addSelectionListener(new SelectionAdapter()
//添加"删除"监视器

public void widgetSelected(SelectionEvent event)

int itemIndex = tblFileList.getSelectionIndex();
tblFileList.remove(itemIndex);
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);

);

btnClearAll.addSelectionListener(new SelectionAdapter()
//添加"清空列表"监视器

public void widgetSelected(SelectionEvent event)

tblFileList.removeAll();
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);

);

txtFileSize.addSelectionListener(new SelectionAdapter()
//添加"分块大小"文本框中输入回车监视器

public void widgetDefaultSelected(SelectionEvent event)

cutButtonEvent();

);

btnUnionFiles.addSelectionListener(new SelectionAdapter()
//添加"选择文件"监视器

public void widgetSelected(SelectionEvent event)

FileDialog fd = new FileDialog(shell, SWT.MULTI);
fd.setFilterExtensions(new String[]"*.dat", "*.*");
if (fd.open() != null)

String[] strFiles = fd.getFileNames();
String strFilePath = fd.getFilterPath();
//strUnionFilePath = new String[strFiles.length];
for(int i = 0; i < strFiles.length; i++)

//strUnionFilePath[i] = fd.getFilterPath();
TableItem item = new TableItem(tblFileList, SWT.None);
item.setText(strFilePath + "\\" + strFiles[i]);



);

btnUnion.addSelectionListener(new SelectionAdapter()
//添加"开始合并"监视器

public void widgetSelected(SelectionEvent event)

if (tblFileList.getItemCount() == 0)

return;

switch (unionFiles())

case 1:
showMessage("成功", "合并完成!",
SWT.OK | SWT.ICON_INFORMATION);
tblFileList.removeAll();
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);
break;
case -1:
showMessage("错误", "文件不存在!",
SWT.OK | SWT.ICON_ERROR);
break;
case -2:
break;
default:
showMessage("错误", "有错误发生,文件合并失败!",
SWT.OK | SWT.ICON_ERROR);


);

tblFileList.addSelectionListener(new SelectionAdapter()
//添加选中列表中元素监视器

public void widgetSelected(SelectionEvent event)

btnUp.setEnabled(true);
btnDown.setEnabled(true);
btnClear.setEnabled(true);

);


/**fn_hd
*rem:显示消息框
*log:2005-11-24
*/
private int showMessage(String strText, String strMessage, int i)
/*fn_tl*/
MessageBox msgBox = new MessageBox(shell,i);
msgBox.setText(strText);
msgBox.setMessage(strMessage);
return msgBox.open();


/**fn_hd
*rem:点击"分割"按钮触发的事件响应
*log:2005-11-24
*/
private void cutButtonEvent()
/*fn_tl*/

strSourceFile = txtSourceFile.getText().trim();
strNewFilePath = txtNewFilePath.getText().trim();

if (strSourceFile.equals("") || strNewFilePath.equals(""))

showMessage("提示", "请输入源文件和 \n\n分割文件的路径! ",
SWT.OK | SWT.ICON_INFORMATION);
return;

try

fileSize = Integer.parseInt(txtFileSize.getText());
fileSize *= 1024;
if (fileSize <= 0)

showMessage("错误", "分块大小为正整数! ",
SWT.OK | SWT.ICON_ERROR);
return;


catch(Exception e)

showMessage("错误", "请在分块大小框填入数字! ",
SWT.OK | SWT.ICON_ERROR);
return;

switch (cutFile())

case 1:
showMessage("提示", "分割完成! ", SWT.OK |
SWT.ICON_INFORMATION);
txtSourceFile.setText("");
txtNewFilePath.setText("");
txtFileSize.setText("");
break;
case -1:
showMessage("错误", "源文件不存在或存放路径不存在!",
SWT.OK | SWT.ICON_ERROR);
break;
default:
showMessage("未知错误", "文件分割失败! ",
SWT.OK | SWT.ICON_ERROR);



/*fn_hd
*rem:文件分割实现
*per:成功返回1,文件未找到返回-1,其他情况返回0
*exp:IOException
*aut:
*log:2005-11-22,创建
*log:2005-11-24,修改
*/
private int cutFile()
/*fn_tl*/

sourceFile = new File(strSourceFile);
fileCount = (int) (sourceFile.length() / fileSize);
if (sourceFile.length() % fileSize != 0)

fileCount++;

newFile = new File[fileCount];

try

int count = 0;
int i = 0;
byte[] bueff = new byte[fileSize];
FileOutputStream out = null;
FileInputStream in = new FileInputStream(sourceFile);
for (i = 0; i < newFile.length; i++)

newFile[i] = new File(strNewFilePath,
i + sourceFile.getName() + ".dat");

i = 0;
while ((count = in.read(bueff,0,fileSize)) != -1)

out = new FileOutputStream(newFile[i]);
out.write(bueff,0,count);
out.close();
i++;

in.close();
return 1;

catch(FileNotFoundException e)

System.out.println(e);
return -1;

catch(IOException e)

System.out.println(e);
return 0;



/*fn_hd
*rem:文件合并的实现
*per:成功返回1,文件未找到返回-1,取消操作返回-2,其他情况返回0;
*aut:
*exp:FileNotFoundException,IOException
*log:2005-11-28,创建
*/
private int unionFiles()
/*fn_tl*/

String[] strFiles = new String[tblFileList.getItemCount()];
File[] unionFiles = new File[strFiles.length];
FileDialog fdSave = new FileDialog(shell, SWT.SAVE);
String s = fdSave.open();
if (s == null)

return -2;

File outFile = new File(fdSave.getFilterPath(),
fdSave.getFileName());
if (outFile.exists())

int msg = showMessage("提示", "该文件以存在,是否替换?",
SWT.YES | SWT.NO | SWT.ICON_QUESTION);
if (msg == SWT.NO)

return -2;


for(int i = 0; i < strFiles.length; i++)

strFiles[i] = tblFileList.getItem(i).getText();

try

FileInputStream in = null;
FileOutputStream out = new FileOutputStream(outFile);
byte[] buff = new byte[1024];
int count;
for(int i = 0; i < strFiles.length; i++)

in = new FileInputStream(strFiles[i]);
while((count = in.read(buff,0,1024)) != -1)

out.write(buff,0,count);

in.close();

out.close();
return 1;

catch(FileNotFoundException e)

System.out.println(e);
return -1;

catch(IOException e)

System.out.println(e);
return 0;



参考技术A 是用标准C++实现还是可以利用Framework?
基本原理就是读到文件流里,再一块一块读出写到新文件里。
我这里有一份BCB的源码,翻译成标准C++或VC的CFile实现也不难,需要的话说一声即可
参考技术B 分割就行了?

不要压缩?
参考技术C winRAR就行 别告诉我你不知道这个软件~

以上是关于谁知道怎么用C语言编写万年历啊的主要内容,如果未能解决你的问题,请参考以下文章

求高手编写一个万年历的C语言程序

万年历 编程

用java语言编写一个万年历程序,要求只显示阳历、节日、还有农历年、闰年

c语言编写万年历时计算每月第一天是星期几的公式是啥

求C语言编程万年历 答案合适者200分必送。

C语言程序设计;"已知2000年1月1日为星期六,请输入任一年的年份后,打印该年的年历" 怎么设计啊,速求老师