ママのスキンケアのお悩みにおすすめアイテム

こんばんは、大学1年生です。
授業で、C言語を勉強しているのですが原理などもよく分からず困ってます。
質問なのですが、C秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示したいのですが参考書などを見てもサッパリです。ソースを教えていただくと助かります。ちなみに、与えられた値を時分秒に変換する部分は関数でお願いします。

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

A 回答 (6件)

No.2です。



一応手順を示しておきます。

秒数 = C
とするとき、
C / 3600 = h時間を求められます。
(3600秒は1時間)
C / 3600 の余りが残りの秒数です。
C - (C / 3600) * 3600 差を求めることで余りを出します。
あとは、この秒数を分と秒に分けます。
s = C - (C / 3600) * 3600 とすると
s / 60 = m分が求められます。
(1分は60秒)
s / 60 の余りが変換後の秒数部分なので、差を求めて余りを得ます。
s - (s / 60) * 60 = 秒数部分の、s秒です。

入力数値 C が、3725(秒)だったとします。
※データが整数型なので割り算はすべて切捨て整数になります。

3725 / 3600 = 1時間
余りが秒なので
3725 - (3725 / 3600) * 3600 = 3725 - 1 * 3600 = 125
つまり、1時間125秒です。
さらに、125秒を分・秒にするので
125 / 60 = 2分
余りが最終的な秒なので
125 - (125 / 60) * 60 = 125 - 2 * 60 = 5

1時間2分5秒となります。

尚、A ÷ B の余りを説明上わかりやすく、
A - (A / B) * B としていますが
C言語ではご存知、A % B でも求められます。
    • good
    • 0
この回答へのお礼

丁寧に解説していただいてありがとうございます。
とても分かりやすいです。
ありがとうございました。

お礼日時:2008/01/13 00:16

<訂正>



【フローチャートその1】

STRAT(左右が弧である長方形図内に書く)
int n(長方形図内に左の4つを書く)
int h
int m
int s
n 入力(平行四辺形図内に書く)
jiRimbyo(n,[h],[m],[s])(左右二重線の長方形図に書く)
n 出力(長方形図内に左の4つを書く)
h 出力
m 出力
s 出力
END(左右が弧である長方形図内に書く)

【フローチャートその2】

jiRimbyo(左右が弧である長方形図内に書く)
n / 3600 → [h](平行四辺形図内に左3つを書く)
(n MOD 3600) / 60 → [m]
(n MOD 3600) MOD 60 → [s]
return(左右が弧である長方形図内に書く)

※[?]は値のアドレスを示します。
    • good
    • 1
この回答へのお礼

私のために時間を割いていただき、感謝です。
専門の方ではないのですか?

お礼日時:2008/01/13 00:58

No.4です。


リストとフローチャートを以下に載せますので
参考になさって下さい。


void jiRimbyo(int n,int* h,int* m,int* s)
{
*h = n / 3600;
*m = (n % 3600) / 60;
*s = (n % 3600) % 60;
return;
}

int main(void)
{
int n,h,m,s;

printf("秒数?");
scanf("%d",&C);
jiRimbyo(n);
printf("\n%d=%d時間%d分%d秒\n",n,h,m,s);
return 0;
}


【フローチャートその1】


STRAT(左右が弧である長方形図内に書く)
int n(長方形図内に左の4つを書く)
int h
int m
int s
0→C(平行四辺形図内に書く)
jiRimbyo(n,[h],[m],[s])(左右二重線の長方形図に書く)
n 出力(長方形図内に左の4つを書く)
h 出力
m 出力
s 出力
END(左右が弧である長方形図内に書く)


【フローチャートその2】


jiRimbyo(左右が弧である長方形図内に書く)
n / 3600 → [h](平行四辺形図内に左3つを書く)
(n % 3600) / 60 → [m]
(n % 3600) % 60 → [s]
return(左右が弧である長方形図内に書く)

※[?]は値のアドレスを示します。
    • good
    • 0
この回答へのお礼

参考にさせていただきます。
ありがとうございました。

お礼日時:2008/01/13 00:57

>ちなみに、与えられた値を時分秒に変換する部分は関数でお願いします


課題のにおいがプンプンしますね。
本当に大学1年生?
秒を時分秒に直す、なんてのは小学生でもできる問題だと思うのですが。
もっとブレイクダウンして質問しようよ。
・秒を時分秒に変換するアルゴリズムがわからない(小学生の問題だけど)
・数値(秒)を入力してプログラムで受け取る方法がわからない
・計算はできるけれども、表示の方法がわからない
「参考書など」とは、具体的に何を参考にされているのでしょうか?

#1さんの問いかけに対して、
>恥ずかしながら全く分かりません。
と答えるあたり、自分で少しでもなんとかしようという意気込みが全く伝わってこんのですが。

>学校があと少しで春休みになるので、基礎から勉強してみます。
勉強してから質問しましょう。失礼ながら、門前払いレベルです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
計算は分かりますが、どのように入力していいかが分かりません。
参考書は、学校で買ったC言語ビギナー偏というものと、図書館でかりている本です。
勉強します。

お礼日時:2008/01/13 00:13

▽まずソースから。



#include <stdio.h>

int main(void)
{
int C,h,m,s; ・・・ 1

printf("秒数?"); ・・・ 2
scanf("%d",&C); ・・・ 3
if (C <= 0){ ・・・ 4
printf("有効な値ではありません\n");
return 0;
}
s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60; ・・・ 5
printf("\n%d秒=%d時間%d分%d秒\n",C,h,m,s); ・・・ 6
return 0; ・・・ 7
}

▽【説明】

(1)
C = 入力秒数 / h = 時間 / m = 分 / s = 秒

(2,3,4)
秒数 C を入力して、(C > 0秒)文字列や負数はエラーとする

(5)
s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60
は以下に展開します。
h = C/3600 ・・・ 時間
s = (C - (h = C / 3600) * 3600)
・・・ 分も秒とした時の総秒数
m = (s = (C - (h = C / 3600) * 3600)) / 60
・・・ 秒から分を抽出
s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60
・・・ 先程の秒数の差を求めることで残りの秒数桁を算出

こういうことでよろしいのでしょうか…?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。せっかく回答していただいたのですが、
C秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示ではなく、秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示の間違いでした。申し訳ありません。大変、お手数お掛けしますがもう一度ご返事いただけますか?

ちなみにフローチャートも提出しないといけないのですが、例だと
START→秒を入力n→関数jiRimbyo(n)→n,時,分,秒の表示→stop
です。この場合のソースを教えていただいたほがありがたいです。
何度も申し訳ありません。

お礼日時:2008/01/12 23:26

ご確認させていただきたいのですが、C言語のソースでは表現することはできないとしても、どのような処理手順にすれば良いかを、普通の言葉

で表現することはできますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。恥ずかしながら全く分かりません。
学校があと少しで春休みになるので、基礎から勉強してみます。

お礼日時:2008/01/12 22:37

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

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

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

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

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

Q秒数を入力すると○時間○分○秒と計算するプログラム

はじめまして、Javaのプログラムの問題で
プログラム実行後に秒数を入力すると○時間○分○秒と計算するプログラムを作成しろとでました。
例 何秒を変換しますか?
  3856(キーボードから入力)
  3856秒は1時間4分16秒です。

for文を使うらしいのですが調べても全く分からない状態です。
学校でJavaを習ってまだ半年です。教科書はやさしいJava第3版です。
回答のほうお願いいたします。

Aベストアンサー

Javaだと課題の丸投げになっちゃいますから、C言語で回答してみる。

#include "stdio.h"

int main(void)
{
int s,s2,m,h;

printf("何秒を変換しますか?:");
scanf("%d", &s);

m = s / 60;
s2 = s % 60;

h = m / 60;
m = m % 60;

printf("%dは%d時間%d分%d秒です。\n",s,h,m,s2);
}

QC言語 ミリ秒を日付に変換には

初心者です orz
ただいまC言語勉強中です。(仕事で必要になりそう・・・)

やりたいことは、タイトルの通り
「C言語 ミリ秒を日付に変換」です。
1298616934703→yyyyMMddhhmmddssSSS
↑こういう感じのことがしたいです!

ログにミリ秒で吐き出された時間から日付を求めたいのですが、
やり方が、いまいちわかりません(泣)

どなたか参考サイトや変換方法をご教授願えると助かります。

Aベストアンサー

その「ミリ秒で吐き出された時間」という数値が、
単純にエポック秒を1000倍したものだったら、
1000で割った商と余りでに「秒単位の数値(エポック秒)」と「ミリ秒部分」に分けてから、
エポック秒を年月日時分秒に変換するだけでしょう。

---ここから---
#include <stdio.h>
#include <time.h>

void conv_time(char *dst, long long t)
{
time_t clock = t / 1000LL;
int millisec = t % 1000LL;
struct tm *local = localtime(&clock);
sprintf(dst, "%04d%02d%02d%02d%02d%02d%03d",
local->tm_year + 1900,
local->tm_mon+1,
local->tm_mday,
local->tm_hour,
local->tm_min,
local->tm_sec,
millisec);
}


int main(int argc, char *argv[])
{
long long t = 1298616934703LL;
char s[18];
conv_time(s, t);
printf("%lld -> %s\n", t, s);
}
---ここまで---

その「ミリ秒で吐き出された時間」という数値が、
単純にエポック秒を1000倍したものだったら、
1000で割った商と余りでに「秒単位の数値(エポック秒)」と「ミリ秒部分」に分けてから、
エポック秒を年月日時分秒に変換するだけでしょう。

---ここから---
#include <stdio.h>
#include <time.h>

void conv_time(char *dst, long long t)
{
time_t clock = t / 1000LL;
int millisec = t % 1000LL;
struct tm *local = localtime(&clock);
sprintf(dst, "%04d%02d%02d%02d%02d%02d%03d",
local->tm_year + 1900,
...続きを読む

Q秒を時分秒に変換する

EXCELで秒を時分秒に変換することは可能でしょうか?
19827635秒を何時間何分何秒に変換するもの

Aベストアンサー

A1に19827635秒が入っているとして
別のセルに
=TEXT(A1/24/60/60,"[h]時間mm分ss秒")
とすれば出きそうです。
5507時間40分35秒

Q【C言語教えてください】sin波について

【C言語教えてください】sin波について

角度を0度から360度の範囲におけるsin(x)のグラフを'*'を使って表示するプログラムを書きたいのですがどなたか教えてください。

角度は10度刻み、正弦波の振幅は10でお願いします。

Aベストアンサー

#include <stdio.h>
#include <memory.h>
#include <math.h>
#define PI 3.1415

void main()
{
int x, y;
int ival;
double dval;
char graph[21][38];

memset(graph, ' ', sizeof(graph));
for (x=0; x<=36; x++) {
dval = 10.0 * sin(((double)x * 10.0 * PI) / 180.0);
if (dval < 0)
ival = (int)(dval - 0.5);
else
ival = (int)(dval + 0.5);
graph[ival+10][x] = '*';
}
for (y=20; y>=0; y--) {
graph[y][37]='\0';
puts(graph[y]);
}
}

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む

QC言語で、入力された、文字列を逆に並べるプログラム。

タイトルのとおりのプログラムをつくりたいんです。
例えば、abcと入力したら、cbaと返してくれるものです。
条件として、ポインタを使えと言われています。
自分で書いたソースは、

0: #include<stdio.h>
1: char re(char *s);
2: main()
3: {
4:char s[10];
5:gets(s);
6:re(s);
7:printf("%s\n",s);
8: }
9:
10: char re(char *s){
11:char c[10];
12:
13:c[9]=s[0];
14:c[8]=s[1];
15:c[7]=s[2];
16:c[6]=s[3];
17:c[5]=s[4];
18:c[4]=s[5];
19:c[3]=s[6];
20:c[2]=s[7];
21:c[1]=s[8];
22:c[0]=s[9];
23:
24:return c[10];
}

C言語を勉強し始めたばかりで、なかなか思うようにかけないでいます。
文字列を入力するのは、4行目~7行目で大丈夫だと思うんですよ。
文字列を逆に並べる、関数 re(char *s)を作れずにいます。
配列s[10]に入っている、文字を最後から取り出して、c[10]にいれていけば、ひっくり返ると思っているんですが、作れません。
13行~21行目の作業も、whileかforでループさせるべきなのもわかってるんですが、条件をどうしたらいいか分からずに作れずにいます。今のソースのまま実行しても、入力したまま出力してしまいます。
さらに、ポインタも今日はじめて勉強して、うっすらと知ってるくらいなので、アドレスとかが、イメージできないでいます。
ながくなってすいません。アドバイスいただきたいです。よろしくおねがいします。

タイトルのとおりのプログラムをつくりたいんです。
例えば、abcと入力したら、cbaと返してくれるものです。
条件として、ポインタを使えと言われています。
自分で書いたソースは、

0: #include<stdio.h>
1: char re(char *s);
2: main()
3: {
4:char s[10];
5:gets(s);
6:re(s);
7:printf("%s\n",s);
8: }
9:
10: char re(char *s){
11:char c[10];
12:
13:c[9]=s[0];
14:c[8]=s[1];
15:c[7]=s[2];
16:c[6]=s[3];
17:c[5]=s[4];
18:c[4]=s[5];
19:c[3]=s[6];
20:c[2]=s[7];...続きを読む

Aベストアンサー

char re(char *s) → void re(char *s)に変更して。

void re(char *s)
{
 char *p;
 p=s+strlen(s)-1;
 while(s<p){
  c=*s;
  *s=*p;
  *p=c;
  s++;
  p--;
 }
}

これでどうでしょうか? pの初期値は末尾の文字の位置です。
先頭と末尾の文字を順番に入れ替えながら内側に進めます。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q秒数を時間、分、秒に変換して表示するには?教えてください。

7000秒をエクセル関数を使用して、時間、分、秒に(00:00:00)表示したいのですが、何方か教えてください。当方まだエクセル関数初心者です。よろしくお願いいたします。

Aベストアンサー

A1に7000と入っており、B1に時間表示させたいとすると、B1に
=A1/(24*3600)
という式を入れて、セルの表示形式をユーザー定義で
[hh]":"mm":"ss
にすればいいかと思います。

Qカレンダープログラム、曜日の出力について。

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio.h>
#include<stdlib.h>

int main(void)

{
char ss[9],cop1[5],cop2[3],cop3[3];

int year,manth,day,aa,cc,i,f;

gets(ss);

ss[8] = 0;
cop1[4] = 0;
cop2[2] = 0;
cop3[2] = 0;

for(i = 0;i <= 3;i++){
cop1[i] = ss[i];
}
for(i = 0;i <= 1;i++){
cop2[i] = ss[i+4];
}
for(i = 0;i <= 1;i++){
cop3[i] = ss[i+6];
}
year = atoi(cop1);
manth = atoi(cop2);
day = atoi(cop3);

printf("%d年%d月%d日",year,manth,day);

for(f = 1900; f <= year; f++){  //閏年か平年で日数を変える
if((year%4) == 0 && year != 1900){
aa += 366;
}
else{
aa += 365;
}
}
if((year%4) == 0 && manth >= 3 ){//閏年かつ3月以降日数+1
aa += 1;
}

switch(manth){
case 1:
cc = (aa + day)%7;
break;
case 2:
cc = (aa + 31 +day)%7;
break;
case 3:
cc = (aa + 59 +day)%7;
break;
case 4:
cc = (aa + 90 +day)%7;
break;
case 5:
cc = (aa + 120 +day)%7;
break;
case 6:
cc = (aa + 151 +day)%7;
break;
case 7:
cc = (aa + 181 +day)%7;
break;
case 8:
cc = (aa + 212 +day)%7;
break;
case 9:
cc = (aa + 243 +day)%7;
break;
case 10:
cc = (aa + 273 +day)%7;
break;
case 11:
cc = (aa + 304 +day)%7;
break;
case 12:
cc = (aa + 334 +day)%7;
break;
}
switch(cc){
case 1:
printf(" (月)");
break;
case 2:
printf(" (火)");
break;
case 3:
printf(" (水)");
break;
case 4:
printf(" (木)");
break;
case 5:
printf(" (金)");
break;
case 6:
printf(" (土)");
break;
case 0:
printf(" (日)");
break;
}

return 0;

}

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio...続きを読む

Aベストアンサー

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // 閏年(4で割れる年)
 return 0;       // 平年(それ以外の年)
}

// メイン関数
int main( void )
{
 static const char *table[] = { "日", "月", "火", "水", "木", "金", "土" };
 // 宣言
 int year = 0;
 int month = 0;
 int day = 0;
 int week = 0;
 // カウンタ
 int days;
 int i;
 
 // 年月日の入力
 scanf( "%04d/%02d/%02d", &year, &month, &day );
 // 1900年以降の日数を数える
 for ( days = 0, i = 1900 ; i < year ; i++ ){
  days += (FuncIsLeapYear(i) ? 366 : 365);
 }
 // 1月1日から日数を加える
 switch ( month ){
  CASE 1: days += 0;
  CASE 2: days += 31;
  CASE 3: days += 31 + 28;
  CASE 4: days += 31 + 28 + 31;
  CASE 5: days += 31 + 28 + 31 + 30;
  CASE 6: days += 31 + 28 + 31 + 30 + 31;
  CASE 7: days += 31 + 28 + 31 + 30 + 31 + 30;
  CASE 8: days += 31 + 28 + 31 + 30 + 31 + 30 + 31;
  CASE 9: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
  CASE 10: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
  CASE 11: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
  CASE 12: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
 }
 // 3月以降で閏年なら+1日
 if ( (month >= 3) && FuncIsLeapYear(year) ){
  days++;
 }
 // 入力した日付を加える
 days += day;
 // 曜日の計算
 week = (days % 7);
 // 表示
 printf( "year = %d\n", year );
 printf( "month = %d\n", month );
 printf( "day = %d\n", day );
 printf( "week = %s\n", table[week] );
 return 0;
}
以上。

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // ...続きを読む

QC言語プログラミングで「コマンドラインから3つの整数を入力し、大きい順に並べる

C言語プログラミングで「コマンドラインから3つの整数を入力し、大きい順に並べるプログラムの作成」なのですが,どなたかわかる人はいらっしゃりますか?

C言語初心者です.


if else文を使って作成するのですが,整数の入力において、同じ数字を認める方法と認めない方法がありますが,両方教えていただけると助かります.

例えば
10、5、21の数字をコマンドラインから入力したときに 出力結果は21、10、5と並ぶ.

同じ数字を認めるとき、例えば 10、10、30と入力したとき出力結果は30、10、10となる

同じ数字を認めないときは、コマンドラインからの入力時に、もし同じ数字が入力されたらエラーメッセージを返して終了

といった具合です.どなたかお願い致します.

Aベストアンサー

おしい!
いいところまでいってるんですが...

>if( a>b && b>=c)
重複をみとめるなら、a=b (>c)の場合があります。よって

if ( a >=b && b >=c )
です。以下同様

> printf("a>b>c%c",a>b>c);
まずはprintfの「書式」というのが解説書にあるはずです。その%cをみれば、「指定した文字コードを持つ文字」とあるはずです(言いまわしは違うでしょうが)
例えば、 printf("%c",65); だと、一般的なPCなら、ASCIIコード65番にあたる「A」という文字が表示されます。
その 文字コードにあたるのが a>b>c になります。
ちょっと話がそれますが、 a>b>cはC言語では(a>b)>cと解釈されます。
( a>b )は a>bなら真を表わす1,そうでないなら偽を表わす 0 という数値になります。(a>b)>cはその0か1と cの値 とを比較して、 同様に1か0の値になります。よって、ここれでは、ASCIIコード0か1の文字が表示されることになります。これらは特殊なコードなので、画面にはなにも表示されていないように見えるかもしれません。

a,b,cのそれぞれの値を表示したいので、10進の整数に変換される「%d」を使います。値が3つあるので、3つ指定します

printf("%d, %d, %d\n",a,b,c);

以下同様。


重複不可版ですが
・>=を>にする:重複が無いので=になることはありえない。
・最後のelseを
else if (c > b && b > a )
{
printf("%d,%d,%d\n",c,b,a);
}
とする。
すると、どのifにも該当しない→どこかに=になっているものがあった、ということなので
else
{
printf("同じ値があります%d,%d,%d\n",c,b,a);
}
となります。他に、これらのifにの前に重複チェックをいれてもいいです。その方法は考えてみてください。

あと細かいことを言えば
> main(int argc,char *argv[])
main関数の型が指定されていません。デフォルトでintになるのですが、自分で指定しておいた方が無難です。(コンパイラによっては、指定しないとエラーになります)
また、intを指定したら、終了の前に retrun 0; と戻り値を指定しましょう。

>a=atoi(argv[1]); //atoi関数
コマンドライン引数が足りなかった場合、致命的なエラーになる可能性が大きいです。argvを使うまえに、argcの値を確認して、数が足りているかどうかを調べるようにしましょう。例えば、今回なら
if ( argc != 4 ) {
printf("引数の数が違います\n");
return 1;
}
a=atoi(argv[1]); //atoi関数
というように

おしい!
いいところまでいってるんですが...

>if( a>b && b>=c)
重複をみとめるなら、a=b (>c)の場合があります。よって

if ( a >=b && b >=c )
です。以下同様

> printf("a>b>c%c",a>b>c);
まずはprintfの「書式」というのが解説書にあるはずです。その%cをみれば、「指定した文字コードを持つ文字」とあるはずです(言いまわしは違うでしょうが)
例えば、 printf("%c",65); だと、一般的なPCなら、ASCIIコード65番にあたる「A」という文字が表示されます。
その 文字コードにあたるのが a>b>c に...続きを読む


人気Q&Aランキング