【TUM-EI-Programmieren】 307 c) - Wochentag für gegebenes Datum bestimmen 计算给定日期是星期几

Q:

Schreiben Sie ein Programm, um den Wochentag an einem bestimmten Datum zu bestimmen. 

Fragen Sie zunächst das Datum mit

"Jahr: "
"Monat: "
"Tag: "

ab. Überprüfen Sie dessen Korrektheit (Tag und Monat im gültigen Bereich; Jahr ≥ 0) und brechen Sie bei einer fehlerhaften Eingabe sofort mit der Meldung 

"Falsche Eingabe." 

ab. War das eingegebene Datum in Ordnung, geben Sie den Wochentag mit 

"Der xx.xx.xxxx ist ein yyyyyyy."

aus. Dabei ist xx.xx.xxxx das eingegebene Datum, beispielsweise in der Form 13.1.736, und yyyyyyy der Wochentag, z.B. Donnerstag. Geben Sie Tag, Monat und Jahr mit %d aus, d.h. als Dezimalzahl ohne vorgegebene Stellenbreite (1.1.0 und nicht 01.01.0000). Anführungszeichen sollen nicht mit ausgegeben werden.

Hinweise zur Lösung:

  • Berechnen Sie zur Lösung der Aufgabe die Anzahl der Tage, die seit dem 1.1.00 vergangen sind.
  • Denken Sie an die Besonderheit des Monats Februar. Er hat üblicherweise 28 Tage, in Schaltjahren aber 29.
  • Ein Nichtschaltjahr hat 365 Tage, ein Schaltjahr 366 Tage.
  • Wie bei allen anderen Aufgaben kann auch hier die Ausgabe von Zwischenwerten bei der Fehlersuche sehr hilfreich sein. Dazu können Sie ihr Programm zunächst ohne Moodle mit einem normalen Texteditor entwickeln und mit gcc übersetzen. Geben Sie die Anzahl der Tage aus, die seit dem 1.1.00 vergangen sind, eventuell auch noch weitere Werte. Tun Sie das aber nur am Anfang (um Fehler schneller mit Hilfe des Terminals zu finden) und entfernen Sie diese Ausgabe wieder, ehe Sie Ihre Lösung in Moodle kopieren und prüfen lassen.
  • Sie werden als Teilproblem die Anzahl an Tagen in einem Monat ermitteln müssen. Dies ist natürlich über eine switch-Anweisung möglich. Um Ihnen die Arbeit zu erleichtern, können Sie aber auch ein Feld, z.B. tim (Tage im Monat) benutzen. In diesem speichern Sie zu jedem Monat die Anzahl der Tage des Monats (z.B. tim[4] = 30 für den April) ab.
  • Selbiges gilt für den Namen eines Wochentags: Auch hier können Sie eine switch-Anweisung sparen, indem Sie ein Feld (z.B. w) für die Wochentags-Namen verwenden. Wenn i die Nummer des Wochentags ist (0, ..., 6) und w das Wochentags-Array, dann entspricht w[i] dem Namen des Wochentags. Dabei kann z.B. 0 der Sonntag, 1 der Montag, ... und 6 der Samstag sein. Sie können aber auch eine andere (sinnvolle) Zuordnungen wählen.

Hinweise zur Bestimmung des Schaltjahres:

  • Ein Jahr, dessen Jahreszahl durch 4 teilbar ist, ist ein Schaltjahr ...
  • ..., außer wenn die Jahreszahl durch 100 teilbar ist.
  • Ist die Jahreszahl durch 400 teilbar, dann ist das entsprechende Jahr aber trotzdem ein Schaltjahr. (Beispielsweise ist 1900 kein Schaltjahr, 2000 ist aber ein Schaltjahr).
  • Das (fiktive) Jahr 0 war kein Schaltjahr und der 01.01.00 war ein Sonntag.

Sie können bei der Eingabe des Jahres in der main-Funktion das Schaltjahr anhand dieser Regeln bestimmen und das Ergebnis in einer Variable, z.B. istSchaltjahr ablegen und diese Variable dann im weiteren Programm-Verlauf verwenden.

Alternativ, falls Sie etwas Neues ausprobieren möchten, können Sie diese Regeln in einer Funktion istSchaltjahr() zusammenfassen. (Funktionen werden erst im nächsten Arbeitsblatt besprochen.) Verwenden Sie für die Funktion das nachfolgend angegebene Grundgerüst und ersetzen Sie dabei XXX durch einen Ausdruck, der 

  • 0 zurückgibt, falls das als Parameter j übergebene Jahr kein Schaltjahr war bzw.
  • 1 zurückgibt, falls es sich bei dem als Parameter j übergebenen Jahr um ein Schaltjahr handelt.

int istSchaltjahr(int j)
{
   return XXX;
}

Diesen Code können Sie dann in ihrer Lösung zwischen der #include-Anweisung und der main-Funktion (also global) einfügen. In der main-Funktion können Sie dann die Funktion mit istSchaltjahr(j) aufrufen, wobei j das zu überprüfende Jahr darstellt. Im Falle eines Schaltjahres liefert die Funktion dann 1, sonst 0.


A:

#include<stdio.h>

int istSchaltjahr(int j)
{
    return ((j!=0)&&((j%4)==0)&&(((j%100)!=0)||((j%400)==0)));
}

int main()
{
    int j ,m ,t, tt, i;
    int tim[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    char *w[]={"Samstag","Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"};
    
    printf("Jahr: ");
    scanf("%d",&j);
    if(j<0)
    {
        printf("Falsche Eingabe.\n" );
        return 0;
    }
    
    printf("Monat: ");
    scanf("%d",&m);
    if(m<1||m>12)
    {
        printf("Falsche Eingabe.\n" );
        return 0;
    }
    
    printf("Tag: ");
    scanf("%d",&t);
    if(t<1||t>tim[m] + (m==2 && istSchaltjahr(j)))
    {
        printf("Falsche Eingabe.\n" );
        return 0;
    }
    
    tt=365*j;
    tt+=((j-1)/4 - (j-1)/100 + (j-1)/400);
    
    for(i=1;i<m;i++)
       tt+=(tim[i]+(i==2&& istSchaltjahr(j)));
    
    tt += t;
    printf("Der %d.%d.%d ist ein %s.\n",t,m,j,w[tt%7]);
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在ORB-SLAM2中运行TUM数据集,需要进行以下步骤: 1. 下载TUM数据集:您可以从TUM官方网站上下载TUM RGB-D数据集(例如,TUM RGB-D数据集)。 2. 准备数据:解压缩下载的数据集,并确保数据集的文件结构符合ORB-SLAM2的要求。ORB-SLAM2需要RGB图像和深度图像作为输入。您可以将RGB图像和深度图像放在同一文件夹中,并使用与图像序列对应的时间戳命名图像文件(例如,rgb/,depth/ 文件夹下的文件名为 "rgb/1305031910.938850.png" 和 "depth/1305031910.938850.png")。 3. 配置参数:ORB-SLAM2提供了一个配置文件,您可以根据需要进行修改。在ORB-SLAM2的主目录下,有一个名为"Examples/RGB-D/TUMX.yaml"的配置文件,其中X代表数据集的名称(例如,TUM1.yaml, TUM2.yaml等)。您可以打开该配置文件并根据需要进行修改,例如设置相机内参、深度图缩放系数等。 4. 运行ORB-SLAM2:在终端中导航到ORB-SLAM2的主目录,并执行以下命令来运行ORB-SLAM2: ``` ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml 数据集文件夹路径 ``` 其中,Vocabulary/ORBvoc.txt 是ORB-SLAM2的词典文件路径,Examples/RGB-D/TUMX.yaml 是您在第3步中修改的配置文件路径,数据集文件夹路径是您存储TUM数据集的文件夹路径。 5. 可视化结果:ORB-SLAM2将输出相机轨迹和地图。您可以使用ORB-SLAM2提供的可视化工具(例如,rgbd_tum)来查看结果。在终端中导航到ORB-SLAM2的主目录,并执行以下命令来可视化结果: ``` ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml 数据集文件夹路径 ``` 此命令将打开一个窗口,显示相机轨迹和地图。 这些是在ORB-SLAM2中运行TUM数据集的基本步骤。请确保按照上述步骤进行操作,并根据需要进行相应的配置和参数调整。祝您成功运行ORB-SLAM2!如果您有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值