ただいま、C言語に苦戦中です。教えてください
2001年の月日の入力データから、曜日を求めるプログラム。
(実行結果例)
月を入力してください: 9↓
日を入力して下さい : 15↓

9月15日は土曜日です。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

またまたarthurです。



1月~12月までの各月の日数を12コの配列に入れ、
1月から入力してもらった月の1つ前の月までの日数を合計します。
例)9月と入力された場合
1月の日数(31日)+2月の日数(28日)+・・・+8月の日数(31日)
さらに入力された日にち分を加算します。
例)15日と入力された場合
1月~8月の合計日数+15日
その合計の値をさらに7(1週間=7日)で割ります。
7で割った余りの数字によって曜日を割り当てます。
1月1日(月)が最初なので、余りが1の時月曜日とすると、余りが2の時は・・・

と、まぁ、ヒントはここまでです^^;
後は自分の力でがんばってください。
    • good
    • 0
この回答へのお礼

ヒントありがとうございます。只今製作中です。しかしエラーが多くなかなか進みませんがarturさんのおかげで
ずいぶん進むことができました。

お礼日時:2001/01/24 20:31

月と日だけではわかりませんので、年(西暦)も入力できるようにして


以下のURLを見てください。
EXCELで確認したところ完璧でした。

参考URL:http://www.top.or.jp/~cpop/sitiyo.htm
    • good
    • 0
この回答へのお礼

ホームページ参考にさせていただきました!

お礼日時:2001/01/24 20:37

宿題の回答としては、



1.ある基準日(例えば1900/01/01)の曜日を調べておいて、その日から何日たっているかを閏年も考慮して計算して、7で割って計算する。

2.Zellerの公式を利用する。

の2つがあります。
演習問題としては、1が正しいアプローチのような気がしますが、Zellerの公式も紹介しておきます。

式は下記のようになります。intは、小数点以下切り捨てmodは剰余を求めます。

( [日] + int( ( [月] + 1 ) * 26 / 10 )
+ [年の下2桁] + int([年の下2桁]/4) + int([年の上2桁]/4) - 2*[年の上2桁] ) mod 7

※但し[月]が1月,2月の場合は「前年の13月、14月」として計算します。

むかし、むかし買ったPascalの自習書に乗っていました。

そうそう、Zellerの公式の結果は、土曜日が0になります。
    • good
    • 0
この回答へのお礼

7で割るやり方でやってみます(^o^)。これで完成に近づきそうです。

お礼日時:2001/01/24 20:36

【ヒント】


time.h関連を探してみましょう。

課題は極力自力で調査しましょう!
    • good
    • 0
この回答へのお礼

そのとおりです。皆さんにいただいたヒントを元に、だいぶ進みました、あと1歩というところです。

お礼日時:2001/01/25 13:40

あまり良い方法とは思っていませんが私は次のような方法を使っています。


これはWindowsでしか使えないのでご了承あれ。

SYSTEMTIME構造体の年、月、日その他もろもろを、代入ます。
それでSystemTimeToFileTime関数に渡してFILETIMEに変換します。
そのとき、曜日を指定してあっても無視されます。
得られたFILETIMEをFileTimeToSystemTime関数に渡して、再度SYSTEMTIMEに変換すれば、正しい曜日が入っていると言うわけです。
詳しくはSystemTimeToFileTime関数とFileTimeToSystemTime関数のヘルプを見ましょう。
    • good
    • 0
この回答へのお礼

細かく書いてくださりありがとうございます。なんだかとても高度なものに思われますが、ヘルプを参照してみます。

お礼日時:2001/01/25 14:21

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで日報を作成時に指定曜日のセルの色を変える

エクセルで日報を作成しておりBに曜日を入力しております。
土曜日と日曜日だけセルの色を変更したいです。
条件書式で「土」と入力したら入力したセルの色を変更することは
できたのですが列全体の色を変更したいです。
A列には日付でB列には曜日を入力した状態でA列からZ列まで指定した
色に変えるのにはどうすれば宜しいでしょうか?
曜日は短くして土曜日→土、日曜日→日と入力します。

エクセルは2010を使用しております。

以上、宜しくお願いします。

Aベストアンサー

こんばんは!

>Bに曜日を入力しております
とありますが、B列が文字列だとしての一例です。

A~Z列すべてを範囲指定 → 条件付き書式 → 新しいルール → 数式を使用して・・・ → 数式欄に
=$B1="土"
として → 書式 → 塗りつぶしから好みの色を選択しOK
同様に「日」も設定します。

※ $マークの位置に注意してください。

余計なお世話かもしれませんが、A列がシリアル値の場合はそれを利用する方法もあります。
範囲指定 → 条件付き書式 →数式を使用して・・・ → 数式欄に
土曜の場合
=AND($A1<>"",WEEKDAY($A1)=7)
日曜の場合
=WEEKDAY($A1)=1
としれそれぞれ好みの色を選択します。

注意点として空白セルの場合、Excelは「土曜」と判断してしまいますので、
条件に「空白以外」を追加しておきます。m(_ _)m

Qコンパイルエラー: LNK2001

今、ベクトル計算を簡単にするクラスを作ってみようとしています。

//vector3.h
template<class TT> class vector3{
public:
  enum{NUM=3};
  TT x[NUM];
  void set(const TT *vv)void set(const TT *vv){
    int i;
    for(i=0;i<NUM;i++){
      x[i]=vv[i];
    }
  }
};

のように、set関数をクラスの中に書いていると問題無いのですが、以下のように、

//vector3.h
template<class TT> class vector3{
public:
  enum{NUM=3};
  TT x[NUM];
  void set(const TT *vv);
};

//test.cpp
#include"vector3.h"
template<class TT> void vector3<TT>::set(const TT *vv){
  int i;
  for(i=0;i<NUM;i++){
    x[i]=vv[i];
  }
}

と、cppファイルの中に書き換えると以下のようにエラーが出るようになります。

error LNK2001: 外部シンボル ""public: void __thiscall vector3<double>::set(double const *)" (?set@?$vector3@N@@QAEXPBN@Z)" は未解決です。
fatal error LNK1120: 外部参照 1 が未解決です。

これはいったい何故なのでしょうか?
使用しているのはVisualC++2008ExpressEditionです
宜しくお願いします。

今、ベクトル計算を簡単にするクラスを作ってみようとしています。

//vector3.h
template<class TT> class vector3{
public:
  enum{NUM=3};
  TT x[NUM];
  void set(const TT *vv)void set(const TT *vv){
    int i;
    for(i=0;i<NUM;i++){
      x[i]=vv[i];
    }
  }
};

のように、set関数をクラスの中に書いていると問題無いのですが、以下のように、

//vector3.h
template<class TT> class vector3{
public:
  enum{NUM=3};
  TT x[NUM];
  v...続きを読む

Aベストアンサー

コンパイル時、test.cpp で実装されたメンバ・テンプレートの
テンプレート引数 TT の具体的な型が不明なのでコンパイルしようが
ありません。コンパイルされませんからリンク時にも見つかりません。

Qエクセルで指定曜日の縦の列のセルに色をつける

いつもお世話になっています。エクセルに関して質問いたします。
前回の質問(見ていない方は申し訳ありません)で管理表で横列に曜日と日付を自動で
出力させたいの件はおかげさまで解決しました。
次に特定の曜日(土日)の縦の列の選択した範囲でセルに自動で色付けを行いたいと思い各HPを
参考にさせていただていたのですが、今度は横の色付けはあったのですが、縦方向の色付けが
見つかりません。そこでまた皆様のお力をお借りいたします。

例)A1のセルに土B1に日と表示されている場合A1~A10までのセルの色を青、B1~B10までのセルを赤の様に自動で表示させたい。

どうかご教授お願いいたします。

Aベストアンサー

>説明が足りずに申し訳ありません。エクセルのバージョンは2003です。

えっと? それはやり方が判らないのでまた教えて欲しいって事でしょうか。
でしたら,A1とかじゃなくてキチンと「どこの番地」に「何を」計算しているのかから,ご相談で情報提供すべきですね。


再掲:
A1(1行目)に年/月/日を計算し,右に並べておく
1行目の表示は「日」だけ表示にしておくのでかまわない
A2(2行目)に =TEXT(A1,"aaa") を記入して曜日を表示し,右にコピーして並べておく

A1からB10を選択
A1がアクティブセルになっている(選択範囲の中で逆反転状態になっている)ことを確認してから
書式メニューの条件付き書式で
セルの値が → 数式が に変更し
右の空欄に
=OR(A$2="土",A$2="日")
として,書式ボタンで色を塗る。

Qerror LNK2001: 外部シンボル "_main" は未解決です

VisualC++6.0で、新規作成→win32 Dinamic-Link Libraryでプロジェクト
を作成し、dllファイルを作っています。
今までは、上手くコンパイル出来て、dllを作れていました。
友人の作ったライブラリにリンクして、ソースファイルで
そのライブラリの関数を使って、コンパイルすると、

LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。

というエラーが出て困っています。
今、プロジェクトの設定→リンク→アウトプットの
エントリポイントシンボルはDllEntryPoint@12となっています。
どうしたら良いでしょうか?
どなたかご教授くださると助かります。

ちなみに、ライブラリの関数をコメントにすると、コンパイル出来ます。

Aベストアンサー

もう一つ、書くの忘れてました。

exeを作るプロジェクトにした時、main()関数が無くて
>LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。
が出てるんなら、main()を書かないと駄目ですよ。

Qエクセル 特定の単語が入力されたときにセルの色を変える

エクセル 特定の単語が入力されたときにセルの色を変える

A1に日付を入力すると、A2に自動的に曜日が入る数式を入れています。

カレンダーのように1ヶ月分がまとめて表示されているわけではなく、入力が必要な日だけ日付を入れるような表になるのですが、土曜や日曜の場合、曜日のセルの色を変える方法を教えていただけますでしょうか。

条件付書式でやってみたのですが、曜日のセルに数式を入れて自動的に表示させている場合、うまくできませんでした。(直接、土曜や日曜と入力するときちんと色が変わったのですが)

Aベストアンサー

No.5です!
たびたびごめんなさい。
投稿した後で、No.1さんの補足を読ませてもらいました。
A2セルにどのように曜日を表示されているのか判らないので
前回同様の方法ですが、A2セルの条件付書式の
数式欄の(A2)の部分を(A1)に変更してみてください。

=WEEKDAY(A1)=7 といった具合です。

これであればA2の数式・表示形式などは関係なく色を変えることが出来ると思います。

どうも何度も失礼しました。m(__)m

Qプログラムが実行できないです↓ 初心者です↓

学校の授業でプログラミングを勉強しているのですが、いまいち理解できません。
家でも勉強できるように、学校でCDを借りてVisual studio2003をインストールしました。
しかし、家でプログラムを作って実行させようとしたら、「ビルド」
とう項目がなく、プログラムを実行できませんでした。

学校のパソコンもバージョンは2003です。
学校では、
「プログラムを作成→ファイルを保存→既存項目の追加→ビルド→デバックなしで開始」
といった感じで実行しているのですが、ビルドできなくて困っています。

何か設定しなければならないのでしょうか?

素人な質問ですみません。
知識のある方、是非助けてください。

Aベストアンサー

プロジェクトのフォルダを持ってきてファイルを開いただけではうまくいきません。

プロジェクトを適切にインポートしましたか?

Qエクセルの数式で第三水曜日に色を付ける

こんにちは、非常に困っているので知恵を貸して下さい。

エクセルのセルA1に「=NOW()」を入力し、現在の月(今で言うと2013年10月)が入力されるようになっています。

そしてセルA2からAE2までは、A1の月の初めの日付から順番に記入されるように数式を組んでいます。(今で言うと2013年10月1日~2013年10月31日)

そこで質問なのですが、第三水曜日に色を付けるたい(月が変化しても自動で第三水曜日に色を付ける)には「条件付き書式」を使用すれば良いと思うのですが、数式がわかりません。

どの様な数式もしくはVBAを組めば宜しいでしょうか、ご教授お願いします。

Aベストアンサー

A2の「条件付き書式」に

条件1:数式が =AND(DAY(A2)>=15,DAY(A2)<=21,WEEKDAY(A2)=4)=TRUE で、塗りつぶし色を指定

と設定して、A2を選択してコピー、A2が点滅したら、B2~AE2を選択して「編集」「形式を選択して貼り付け」「書式のみ」で貼り付け。

「第3○曜日」の場合、DAY(A2)は、15以上21以下です。

「水曜日」の場合、WEEKDAY(A2)は、水曜日を表す4です。

なので「DAY()が15以上、かつ、DAY()が21以下、かつ、WEEKDAY()が4、が真(TRUE)」の場合に、色を付ければ良いのです。

Q入力した日は何曜日か

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);

/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((year%100!=0))||(year%400==0)){
sum++;
i++;
}
year--;

/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}

year++;

sum=sum+day;
//曜日の出力
printf("%s曜日",cweek[sum%7]);
return 0;
}
}

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);

/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((ye...続きを読む

Aベストアンサー

私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはおかしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね.

Qエクセルのセルの色を任意の色の出来ますか?

エクセルのセルの色を任意の色の出来ますか?
四角形の図を使ってユーザー設定で好きな色に出来るのですが
セルの色は少ししか選べません。
何か方法は無いでしょうか?

Aベストアンサー

パソコンの出せる色RXGXBで255X255X255の1600万色ーー>パレットに載せる色をユーザーが56種選択ーー>エクセルでは、そのカラーパレットの色の中から色を選択 というしくみのようだ。
それと
エクセルで
ツールーオプションー「色」タブー変更する色の「☐」(小四角)をクリックー「変更」ボタンー変更後の色(部分)をクリック
ーー
すると書式ーセルーパターンで出るパレット色のその位置の色も変わっているはずだ。
VBAでは
Sub test01()
Cells(2, "B").Interior.ColorIndex = 1
End Sub
で設定することがあるが、同じColorIndex =1の1でもカラーパレットの色の設定状況で、セルのパターン色が別になるということ。
ーー
>セルの色は少ししか選べません。
少しとは何種類ぐらいのこと?。
何のことを言っているかわかりにくい質問。
56色は数としては少ないようだが、人間の目には10数種ぐらいしか、普通にぱっと見て、識別できないのではないですか。

Q(C言語)西暦年月日を入力して、その日の曜日を表示させるプログラムを試したのですが…

西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが…

int main(void)
{

int i,y,m,d,dy,dw;

int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

printf("Year?");

scanf("%d",&y);

printf("Month?");

scanf("%d",&m);

printf("Day?");

scanf("%d",&d);

for(i=0;i<=m-1;i++){
dy = d + D[i] ;
}

if(m>=3){
if(y % 4 == 0){
if(y % 400 == 0){
dy = dy + 1 ;
}
else if(y % 100 ==0){
dy = dy ;
}
else{
dy = dy + 1 ;
}
}

else if(y % 4 == 1 || y % 4 == 2 || y % 4 == 3 ){
dy = dy ;
}
}
dw = (dy -1 + ( y + ( y - 1 )/4 - ( y - 1 )/100 + ( y - 1 )/400))%7 ;

if (dw == 0) printf("Sunday\n");
else if (dw == 1) printf("Monday\n");
else if (dw == 2) printf("Tuesday\n");
else if (dw == 3) printf("Wednesday\n");
else if (dw == 4) printf("Thursday\n");
else if (dw == 5) printf("Friday\n");
else if (dw == 6) printf("Saturday\n");

return 0 ;

}
このプログラムを各年の1月1日~2月28日で試してみると、うまくいくのですが、3月1日に入るとなぜかうまく働いてくれません。(ちなみに2005年の11月では偶然うまくいっています。)その理由が分からないのでどなたか教えてください。ちなみに、この一連のプログラムを行うにはもっと簡単に行える関数というかコマンド?みたいなものがあるようですが、基本的に各年の1月1日を、
(y+(y-1)/4-(y-1)/100+(y-1)/400)%7で(0:Sunday~)、同年の○月○日は1月1日から△日経過しているという考え方で、曜日を割り出すプログラムにしなければならないといけないので、注文が多いですがよろしくお願いします。

西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが…

int main(void)
{

int i,y,m,d,dy,dw;

int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

printf("Year?");

scanf("%d",&y);

printf("Month?");

scanf("%d",&m);

printf("Day?");

scanf("%d",&d);

for(i=0;i<=m-1;i++){
dy = d + D[i] ;
}

if(m>=3){
if(y % 4 == 0){
if(y % 400 == 0){
dy = dy + 1 ;
}
else if(y % 100 ==0){
dy = dy ;
}
e...続きを読む

Aベストアンサー

プログラムのおかしいところについては#1の回答のとおりです。
したがって、
>int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
これを
>int D[]={0,31,59,90,120,151,181,212,243,273,304,335};
>//各月の前月までの年初からの日数
として、
>for(i=0;i<=m-1;i++){
> dy = d + D[i] ;
>}

>dy = d[m-1] + d;
とするという解法もあります。あらかじめ足しておいてはいけないということはないでしょう。

ただ、標準関数に日付の関数はあります。
もちろん制限はあって、time_tのサイズが32bit(=signed long int)の場合、1901年12月14日05:45:52~2038年1月19日12:14:07の間だけが正常に動作するようになっていますし、上記のアルゴリズムとは違って1970年1月1日00:00:00を基準とした秒数をもとにして計算しているため、今回は利用できませんね。

ところで、
> ちなみに2005年の11月では偶然うまくいっています。
の理由について回答が出ていませんが、それは、2005年1月と2005年10月がたまたま同じ曜日で始まっていてかつ、1月と10月が同じ日数(31日)だからです。

プログラムのおかしいところについては#1の回答のとおりです。
したがって、
>int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
これを
>int D[]={0,31,59,90,120,151,181,212,243,273,304,335};
>//各月の前月までの年初からの日数
として、
>for(i=0;i<=m-1;i++){
> dy = d + D[i] ;
>}

>dy = d[m-1] + d;
とするという解法もあります。あらかじめ足しておいてはいけないということはないでしょう。

ただ、標準関数に日付の関数はあります。
もちろん制限はあって、time_tのサイズが32bit...続きを読む


人気Q&Aランキング

おすすめ情報