一个Pascal语言写的计算指定年月日历信息的程序

这段代码是2013年8月我学Pascal语言的时候写的,不过今天看了以下那时的代码BUG还挺多,所以今天又加工了下。

编译环境使用的是FreePascal,代码是在Notepad++上写的,用FreePascalIDE进行调试

程序运行的截图如下:

代码如下:

program Acilia; {Write by Tsybius}

var intExit:        integer;
    intChoose:      integer;
    intYear:        integer;    {Data converted from input}
    intMonth:       integer;    {Data converted from input}

    strInput:       string[7];  {The string input}
    intCode:        integer;    {Code for function val}

    intTempYear:    integer;    {Variant for calculation}
    intDayOfWeek:   integer;    {Day of Week}

    intCalendar:    array[1 .. 42] of integer;  {Calendar}
    intTemp:        integer;

begin

    writeln(‘Acilia Welcomes You.‘);

    intExit := 0;  {When intExit becomes 1, the program shall be killed}

    repeat

        writeln(‘Print 1 to Search, 2 to Exit.‘);
        readln(intChoose);

        if intChoose = 1 then
            intChoose := 1
        else 
        begin
            if intChoose = 2 then
                intChoose := 2
            else
                intChoose := 3
        end;

        case intChoose of
        1:  {Search}
            begin

                writeln(‘Tell me the Year and the Month (Such as 2011-03).‘);
                writeln(‘Year from 1901 to 2100, Month from 1 to 12.‘);
                readln(strInput);
                writeln(‘The date you input is ‘, strInput);
                writeln(‘Now checking...‘);

                val(copy(strInput, 1, 4), intYear, intCode);
                val(copy(strInput, 6, 2), intMonth, intCode);
                writeln(‘Year: ‘, intYear, ‘ Month: ‘, intMonth);

                {Check if the year input is legal}
                if (intYear < 1900) or (intYear > 2100) then
                begin
                    writeln(‘Make sure the year you input is legal!‘);
                    continue;
                end;

                {Check if the month input is legal}
                if (intMonth < 1) or (intMonth > 12) then
                begin
                    writeln(‘Make sure the month you input is legal‘);
                    continue;
                end;

                intDayOfWeek := 1; {Sun:0 Mon:1 ... Sat:6}
                intTempYear := 1900;

                if intYear <> 1900 then
                begin
            
                    for intTempYear := 1900 to intYear - 1 do
                    begin
                    
                        if intTempYear = 1900 then
                        begin
                        
                            inc(intDayOfWeek, 365);
                            intDayOfWeek := intDayOfWeek mod 7;
                            continue;
                        
                        end;
                    
                        if intTempYear mod 4 = 0 then
                        begin
                        
                            inc(intDayOfWeek, 366);
                            intDayOfWeek := intDayOfWeek mod 7;
                            continue;
                        
                        end;
                    
                        inc(intDayOfWeek, 365);
                        intDayOfWeek := intDayOfWeek mod 7;
                    
                    end;  {Exit calculation about intTempYear}
                    
                    {Tell user the latest result}
                    writeln(‘January 1st in ‘, intTempYear);
                    writeln(‘ is the ‘, intDayOfWeek, ‘(st/nd/rd/th) day of the week!‘);
                    
                    if intMonth > 1 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 2 then 
                    begin
                        intDayOfWeek := (intDayOfWeek + 28) mod 7;
                        if (intTempYear = 2000) then inc(intDayOfWeek); 
                    end;
                    if intMonth > 3 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 4 then intDayOfWeek := (intDayOfWeek + 30) mod 7;
                    if intMonth > 5 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 6 then intDayOfWeek := (intDayOfWeek + 30) mod 7;
                    if intMonth > 7 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 8 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 9 then intDayOfWeek := (intDayOfWeek + 30) mod 7;
                    if intMonth > 10 then intDayOfWeek := (intDayOfWeek + 31) mod 7;
                    if intMonth > 11 then intDayOfWeek := (intDayOfWeek + 30) mod 7;
            
                    {Be careful that intDayOfWeek can not be 0}
                    if intDayOfWeek = 0 then intDayOfWeek := 7; 
                    
                    {Tell user the latest result}
                    writeln(‘First day in ‘, intMonth, ‘(st/nd/rd/th) month of ‘, intYear);
                    writeln(‘ is the ‘, intDayOfWeek, ‘(st/nd/rd/th) day of week!‘);
                    
                    {Calculate the calendar}
                    for intTemp := 1 to intDayOfWeek - 1 do intCalendar[intTemp] := 0;
                    
                    {Jan/Mar/May/Jul/Aug/Oct/Dec}
                    if (intMonth = 1) or (intMonth = 3) or 
                        (intMonth = 5) or (intMonth = 7)
                        or (intMonth = 8) or (intMonth = 10) or (intMonth = 12) then
                    begin
                        
                        for intTemp := intDayOfWeek to intDayOfWeek + 31 do
                            intCalendar[intTemp] := intTemp - intDayOfWeek + 1;
                            
                        for intTemp := intDayOfWeek + 31 to 42 do
                            intCalendar[intTemp] := 0;
                        
                    end;
                    
                    {Apr/Jun/Sep/Nov}
                    if (intMonth = 4) or (intMonth = 6) or 
                        (intMonth = 9) or (intMonth = 11) then
                    begin
                    
                        for intTemp := intDayOfWeek to intDayOfWeek + 30 do
                            intCalendar[intTemp] := intTemp - intDayOfWeek + 1;
                            
                        for intTemp := intDayOfWeek + 30 to 42 do
                            intCalendar[intTemp] := 0;
                    
                    end;
                    
                    {Feb}
                    if (intMonth = 2) then
                    begin
                    
                        for intTemp := intDayOfWeek to intDayOfWeek + 28 do
                            intCalendar[intTemp] := intTemp - intDayOfWeek + 1;
                        
                        for intTemp := intDayOfWeek + 28 to 42 do
                            intCalendar[intTemp] := 0;
                            
                        if (intTempYear mod 4 = 0) and (intTempYear <> 1900) then
                            intCalendar[intDayOfWeek + 28] := 29;
                    
                    end;
                    
                    {Print the calendar}
                    writeln;
                    writeln(‘  Mon  |  Tue  |  Wed  |  Thu  |  Fri  |  Sat  |  Sun‘);
                    
                    for intTemp := 1 to 42 do
                    begin
                    
                        if (intCalendar[intTemp] < 10) and (intCalendar[intTemp] > 0) then
                            write(‘|‘, ‘ ‘:3, intCalendar[intTemp], ‘ ‘:2, ‘|‘);
                        
                        if intCalendar[intTemp] >= 10 then
                            write(‘|‘, ‘ ‘:2, intCalendar[intTemp], ‘ ‘:2, ‘|‘);
                        
                        if intCalendar[intTemp] = 0 then write(‘ ‘:7, ‘|‘);
                        if intTemp mod 7 = 0 then writeln;
                    
                    end;
                    
                    writeln;
                    
                end;

            end;

        2:  {Exit}
            begin
                writeln(‘Prepare to Exit...‘);
                intExit := 1;
            end;

        3:    {Other input}
            writeln(‘I can not understand what you have just input!‘);
        end;

    until intExit = 1;  {End repeat}

    {Prepare to exit}
    writeln(‘Press Any Key to Continue...‘);
    readln;

end.

需要注意的几点:

1)关于FreePascalIDE的乱码

这个问题是由于控制台的编码方式错误导致的

解决方案在命令行属性中,在“选项”选项卡中把编码方式改成“437 (OEM-美国)”

修改后就可以看到无乱码的FreePascalIDE了

2)FreePascalIDE中编译的时候并不会对源码进行保存操作,要经常按F2保存代码,否则不慎关闭追悔莫及。这个IDE环境在关闭时是没有保存提示的,所有未保存的操作都会丢失。

END

时间: 2024-08-29 14:10:10

一个Pascal语言写的计算指定年月日历信息的程序的相关文章

10.1 优化函数 在前面的章节中,我们已经知道,递归是 F# 中处理函数的主要控制流机制。我们第一次是使用它写一些进行计算的简单函数,例如,计算指定范围内的数字的和或阶乘。后来,我们发现它在处理递

10.1 优化函数 在前面的章节中,我们已经知道,递归是 F# 中处理函数的主要控制流机制.我们第一次是使用它写一些进行计算的简单函数,例如,计算指定范围内的数字的和或阶乘.后来,我们发现它在处理递归数据结构,最重要的列表是时,是无价的. 我们知道,递归也有一些局限性,堆栈溢出的可能性是最明显的一个:我们将会看到,某些递归计算非常低效.在命令式语言中,通常使用非递归函数,以避免出现问题:函数语言已经有方法解决这些问题,并可以高效地使用递归.首先要集中关注于正确性:如果一个额外的字节吹动堆栈,真正

写一个c语言程序

在Mac系统环境下编写第一个C语言程序,最后把程序运行起来,跟计算机做一个小小的互动 一.编写第一个C语言程序-Hello World 为什么称第一个程序为“Hello Wolrd”呢?其实计算机行业里面,学习任何技术的第一个程序都可以称为“Hello World”.“Hello World”的字面意思是“你好,世界”,也就是跟世界打招呼.我们第一个程序在这世界上诞生了,那肯定要跟世界打声招呼嘛,所以就称为“Hello World”. 1.用什么工具写代码 首先我们要做的肯定是写代码,在代码里面

今天看到一个网站不知道是用什么语言写的

今天看到一个网站不知道是用什么语言写的网站(www.kufangwuyou.com)不知道这是怎么回事一直费解,想换成div+cdd的!

如何判断一个网址是由哪种语言写的

一般的情况看页面的后缀名 Server Side Includes 技术,拓展名为.shtml或.html或.htm PHP技术,拓展名为.php JSP技术,拓展名为.jsp或.jsf(JSF技术是JSP技术的拓展) ASP.NET技术,拓展名为.aspx (x 代表extension) ASP技术,拓展名为.asp ColdFusion技术,拓展名为.cfc 好点的网站,一般用资源转向功能(就向JSP中web.xml定义的名字,把HOME转向到home.jsp,就隐藏了拓展名).或者用Apa

一个用 C 语言写的迷你版 2048 游戏,只有 500个字符

Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak") );puts(W&1?"WIN":"LOSE");}K[]={2,3,1};s(f,d,i ,j,l,P){for(i=4;i--;)for(j=k=l=0;k<4;)j<4?P=M [w(d,i,j++)],W|=P>>11,l*

换一个视角看事务 - 用&quot;Java语言&quot;写&quot;作文&quot;

前段时间在抽工作之空余,更加系统和深入的重新学习Java的一些技术知识. 最近也试着申请了一个专栏,对前段时间的一些收获和知识点做一个系统性的归纳回顾和总结. 昨天也是刚刚写完了关于Java中的各种基础语言要素的总结,总觉得少了点什么. 对基础语言要素的理解和使用,实际上是很重要的. 俗话说,一切伟大的行动和思想,都源于一个微不足道的开始. 而对于一门语言来说,熟练的掌握对其基础语言要素的理解和使用,就是这个"微不足道的开始" 可以这样说,一门语言的基础语言要素,就等同于是一门武功的内

02-编写第一个C语言程序

1.打开Xcode,新建Xcode项目 2.选择最简单的命令行项目 3.输入项目信息 4.选择一个用来存放C程序代码的文件夹 5.运行项目 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 由于我们最终要学习的是iOS开发,因此就使用Mac平台下的Xcode搭建C语言开发环境,而不使用Windows系统 如果你是在Windows环境下,可以下载这个简单的C语言学习工具:C/C+

不好意思啊,我上周到今天不到10天时间,用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊

花10天时间用C语言做了个小站 http://tieba.yunxunmi.com/index.html 简称: 云贴吧 不好意思啊.我上周到今天不到10天时间.用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊 估计採集1000万贴,欢迎大家狠狠的来拍吧! 整站大小(网页+C ISAPI类库)不到1MB 容量大.速度快.不管什么贴,随便贴吧,就是量大.容量大.肚量大!

用C语言写一个“事件”的模拟程序

源:用C语言写一个“事件”的模拟程序 Example.c //定义一个函数指针 func int (*func) (void); //调用该函数相当于触发了事件. //该事件触发后,会检查函数指针func是否为NULL,如果不为NULL,说明该指针已被赋值(相当于该事件被注册). //如果事件已被注册,则执行之. void fireTheEvent() { if(func != NULL) { func(); } } void registerTheEvent(int (*function) (