今、生年月日から年齢と曜日を出すプログラムを作成していますが年齢は表示できるのですが曜日を出力のやり方が分かりません。
文字なので「%c」だと思って試すと「@」になってしまいます。
曜日の計算式は聞きましたが、それが何曜日になるのかが分からないのでご教授いただけないでしょうか
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Leap_Year(int);
int Last_Day(int yy,int mm);
int Day_of_the_Week(int yy,int mm,int dd);
int main(void){
int Today=20100401;
int yy,mm,dd,Birth,nen;
int Ld[/url]={0,31,28,31,30,31,30,31,31,30,31,30,31};
do{
printf("生年=");
rewind(stdin);
scanf("%d",&yy);
}while(yy<1 || yy>(Today/10000));
do{
printf("生月=");
rewind(stdin);
scanf("%d",&mm);
}while(mm<1 || mm>12);
if(Leap_Year(yy)==1) Ld[2]=29;
else Ld[2]=28;
do{
printf("生日=");
rewind(stdin);
scanf("%d",&dd);
}while(dd<1 || dd>Ld[mm]);
Birth=yy*10000+mm*100+dd;
nen=(Today-Birth)/10000;
printf("年齢=%d\n",nen);
printf("曜日=%c\n",Day_of_the_Week);
rewind(stdin);
getchar();
return 0;
}
int Day_of_the_Week(int yy,int mm,int dd)
{
if(mm<3) {yy--; mm+=10;}
else {mm-=2;}
return((yy+(yy/4)-(yy/100)+(yy/400)+(13*mm+34)/5+dd)%7);
}
int Leap_Year(int);
int Last_Day(int yy,int mm)
{
if(mm==2) return(28+Leap_Year(yy));
else return((mm<8)? 30+mm%2:31-mm%2);
}
int Leap_Year(int yy)
{
if((yy%4)!=0) return(0);
if((yy%100)!=0) return(1);
if((yy%400)!=0) return(0);
return(1);
}
生年月日から(年齢)、(曜日)を出力
Re:生年月日から(年齢)、(曜日)を出力
printf("曜日=%c\n",Day_of_the_Week);
int Day_of_the_Week(int yy,int mm,int dd);
int Day_of_the_Week(int yy,int mm,int dd);
Re:生年月日から(年齢)、(曜日)を出力
何故か解決したらしいけど気持ち悪いのでコメント。
> printf("曜日=%c\n",Day_of_the_Week);
この書き方では関数Day_of_the_Weekは呼ばれません。
関数のアドレスを取得し、それを文字として出力しようとしています。
正しく呼び出して表示するためには、まず次のように書きましょう。
戻り値は整数ですので、printfの書式指定は%dです。
printf("曜日=%d\n", Day_of_the_Week(yy, mm, dd));
次にこの戻り値は整数で、0が日曜日、1が月曜日、、、という意味です。
曜日に変換する標準関数はないので、次のような方法があります。
今度は文字列を表示しているので、%sです。
const char str[/url][7] = { "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日" };
int dow = Day_of_the_Week(yy, mm, dd);
printf("曜日=%s\n", str[dow]);
> printf("曜日=%c\n",Day_of_the_Week);
この書き方では関数Day_of_the_Weekは呼ばれません。
関数のアドレスを取得し、それを文字として出力しようとしています。
正しく呼び出して表示するためには、まず次のように書きましょう。
戻り値は整数ですので、printfの書式指定は%dです。
printf("曜日=%d\n", Day_of_the_Week(yy, mm, dd));
次にこの戻り値は整数で、0が日曜日、1が月曜日、、、という意味です。
曜日に変換する標準関数はないので、次のような方法があります。
今度は文字列を表示しているので、%sです。
const char str[/url][7] = { "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日" };
int dow = Day_of_the_Week(yy, mm, dd);
printf("曜日=%s\n", str[dow]);
Re:生年月日から(年齢)、(曜日)を出力
蛇足ですが、一週間の曜日を表示するサンプルプログラムを作って見ました。
----------------------------------------------------------------------
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
/**
* ロケールの設定。
*/
void mysetlocale()
{
int category;
char *locale;
category = LC_ALL;
locale = "japanese";
setlocale(category, locale);
}
/**
* 一週間の曜日を表示。
*/
void print_wdays()
{
struct tm date;
char string[256];
size_t maxsize;
char *format;
const int sunday = 0;
const int saturday = 6;
memset(&date, 0, sizeof(date));
for (date.tm_wday = sunday; date.tm_wday <= saturday; date.tm_wday++)
{
maxsize = 255;
format = "%A";
strftime(string, maxsize, format, &date);
printf("%s\n", string);
}
}
/**
* メイン関数。
* @param[in] argc argv の数
* @param[in] argv コマンドライン引数
*/
int main(int argc, char *argv[/url])
{
mysetlocale();
print_wdays();
return 0;
}
----------------------------------------------------------------------
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
/**
* ロケールの設定。
*/
void mysetlocale()
{
int category;
char *locale;
category = LC_ALL;
locale = "japanese";
setlocale(category, locale);
}
/**
* 一週間の曜日を表示。
*/
void print_wdays()
{
struct tm date;
char string[256];
size_t maxsize;
char *format;
const int sunday = 0;
const int saturday = 6;
memset(&date, 0, sizeof(date));
for (date.tm_wday = sunday; date.tm_wday <= saturday; date.tm_wday++)
{
maxsize = 255;
format = "%A";
strftime(string, maxsize, format, &date);
printf("%s\n", string);
}
}
/**
* メイン関数。
* @param[in] argc argv の数
* @param[in] argv コマンドライン引数
*/
int main(int argc, char *argv[/url])
{
mysetlocale();
print_wdays();
return 0;
}
Re:生年月日から(年齢)、(曜日)を出力
横槍ですが
>Title: Re:生年月日から(年齢)、(曜日)を出力
> 蛇足ですが、一週間の曜日を表示するサンプルプログラムを作って見ました。
>やんちさん
エラーが出ました。。
>Title: Re:生年月日から(年齢)、(曜日)を出力
> 蛇足ですが、一週間の曜日を表示するサンプルプログラムを作って見ました。
>やんちさん
エラーが出ました。。
Re:生年月日から(年齢)、(曜日)を出力
>横槍ですが
>>Title: Re:生年月日から(年齢)、(曜日)を出力
>> 蛇足ですが、一週間の曜日を表示するサンプルプログラムを作って見ました。
>>やんちさん
>
> エラーが出ました。。
画像が潰れてて見難いですが、
Win32アプリケーションとかで、プロジェクト作ってませんか?
コンソールアプリケーションですよ。
>>Title: Re:生年月日から(年齢)、(曜日)を出力
>> 蛇足ですが、一週間の曜日を表示するサンプルプログラムを作って見ました。
>>やんちさん
>
> エラーが出ました。。
画像が潰れてて見難いですが、
Win32アプリケーションとかで、プロジェクト作ってませんか?
コンソールアプリケーションですよ。