• ベストアンサー

プログラムにくわしいかた教えてください!!

構造体Timeを定義し、この構造体型を持つ変数time1,time2,time3を用意します。この変数time1,time2に時間、分、秒のデータを入力し, 合計値をtime3の各メンバに代入し、time3に含まれる、時間、分、秒を表示したいのですが、どうすればよいのでしょうか。 (分、秒の表示は0から59の数値で行う) (時間はint hour 分は int minute 秒は int second) (これは学校の課題なのですが、最近授業についていけなくてかなり悪戦苦闘しています。授業に追いつくためがんばっているのですが、かなりきついです。) このプログラムを組むのに必要な知識とか、わかる方はついでに教えていただけるとうれしいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Kaone
  • ベストアンサー率60% (33/55)
回答No.1

構造体Timeを定義しってことは、標準の構造体ではなくて自分で作るって事ですよね。 まず構造体を定義します。 typedef struct _Time{ int hour; int minute; int second; }Time; で変数time1,time2,time3を用意しますので Time time1, time2, time3; とします。 下のように分けても良いです。 Time time1; Time time2; Time time3; 代入は、そのままメンバにアクセスして代入します。 time1.hour = 6; time1.minute = 24; time1.second = 7; のようにします。 2も一緒です。 計算方法は、 time3.second = time1.second + time2.second; とします。 ただし、60秒を超えるかもしれないので、 60をこえたら分に1を加えて、time3.second は、60を引いた値を入れます。 同じように、分も60を超えたら、時間に1を加えて、分に、60を引いた値を挿入します。 式にすると time3.second = time1.second + time2.second; if( time3.second >= 60 ){ time3.second=-60; /* time3.second = time3.second - 60; */ time3.minute=1; }else{ time3.minute=0; } time3.minute = time3.minute + time1.minute + time2.minute; if( time3.minute >= 60 ){ time3.minute=-60; /* time3.minute = time3.minute - 60; */ time3.hour=1; }else{ time3.hour=0; } time3.hour= time3.hour+ time1.hour+ time2.hour; という感じです。 素数tを使用して以下のような方法もあります。 以下の方法の場合、time1とtime2の和が180秒以上でも計算可能ですね int t; time3.second = time1.second + time2.second; t = time3.second % 60; time3.minute = time1.minute + time2.minute + ((time3.second - t)/60); time3.second = t; t = time3.minute % 60; time3.hour= time1.hour + time2.hour + ((time3.minute - t)/60); time3.minute = t;

lilillili
質問者

お礼

投稿ありがとうございます。 おおかた理解できたのですが、 メイン関数の宣言のところがいまいちまだわかりません。 時間、分、秒を入力するには int main(void){ Time time1,time2,time3; Time time[3]; int i; for(i=0;i<3;i++){ printf("time%dの時間を入力\n",i+1); scanf("%d",time[i].hour); 以下、分・秒同様といった感じで  よいのでしょうか。

その他の回答 (1)

回答No.2

#include <stdio.h> typedef struct teime{ int h, m, s; } Time; int main(void) { Time time1 = {1, 30, 23}, time2 = {2, 23, 45}, time3; int r; printf("%d %d %d\n", time1.h, time1.m, time1.s); printf("%d %d %d\n", time2.h, time2.m, time2.s); time3.s = (r = (time1.s + time2.s)) % 60; r /= 60; time3.m = (r = (time1.m + time2.m + r)) % 60; r /= 60; time3.h = time1.h + time2.h + r; printf("%d %d %d\n", time3.h, time3.m, time3.s); return 0; }

lilillili
質問者

お礼

お返事遅れてすみません。 なんとなく構造体のコツがつかめてきました。 ありがとうございました!

関連するQ&A

  • あともうちょっで完成なのですが・・・

    うまく動作しないのですが、以下のプログラムのどこが間違っているのでしょうか? たぶん、メイン関数の宣言の部分だと思うのですが・・・。 #include<stdio.h> typedef struct Time{ int hour; int second; int minute; }Time; int main(void){ Time time1,time2,time3; Time time[3]; int i; for(i=0;i<3;i++){ printf("time%dの時間を入力\n",i+1);   scanf("%d",time[i].hour); printf("time%dの分を入力\n",i+1)   scanf("%d",time[i].minute); printf("time%dの秒を入力\n",i+1); scanf("%d",time[i].second); } time3.second = time1.second + time2.second; if( time3.second >= 60 ){ time3.second=-60; /* time3.second = time3.second - 60; */ time3.minute=1; }else{ time3.minute=0; } time3.minute = time3.minute + time1.minute + time2.minute; if( time3.minute >= 60 ){ time3.minute=-60; /* time3.minute = time3.minute - 60; */ time3.hour=1; }else{ time3.hour=0; } time3.hour= time3.hour+ time1.hour+ time2.hour; return 0; }

  • PHPでPCのローカル時刻は取得出来ますでしょうか?

    PHPでPCのローカル時刻は取得出来ますでしょうか? 現在、javascriptで取得しているのですが、これを PHPの変数として取得出来ないか考えております。 javascriptでは下記のように取得して表示させています。 <script type="text/javascript"> var nowtime = new Date(); var hour = nowtime.getHours(); var minute = nowtime.getMinutes(); var second = nowtime.getSeconds(); if(hour < 10) { hour = "0" + hour; } if(minute < 10) { minute = "0" + minute; } if(second < 10) { second = "0" + second; } document.write(hour,minute,second); </script> 例えば現在が12時34分56秒だとしたら、javascriptで 「123456」という6ケタの数字を取得出来ます。 この「123456」を、PHPの変数として使いたいです。 ($jikoku = 123456) どなたかお知恵を拝借出来ませんでしょうか? 何卒宜しくお願い致します。

    • ベストアンサー
    • PHP
  • C#のlabelの表示について

    C#のlabelの表示について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 以下の時刻を表示するプログラムを作成したのですが、        //現在の時刻を取得  DateTime dt = DateTime.Now; int Second_1 = dt.Second % 10; int Second_2 = dt.Second / 10; int Minute_1 = dt.Minute % 10; int Minute_2 = dt.Minute / 10; int Hour_1 = dt.Hour % 10; int Hour_2 = dt.Hour / 10; label1.Text = Second_1.ToString(); label2.Text = Second_2.ToString(); label3.Text = Minute_1.ToString(); label4.Text = Minute_2.ToString(); label5.Text = Hour_1.ToString(); label6.Text = Hour_2.ToString(); if (int.Parse(label1.Text) == 0 && int.Parse(label2.Text) == 0) { int a; for (a = 0; a < 10; a++) { pictureBox4.Top += 1; System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { pictureBox4.Top += 5; System.Threading.Thread.Sleep(10); } pictureBox4.Top = 12; } label1は「秒」の1の位、 label2は「秒」の10の位、 pictureBox4は「分」の1の位の画像を表示しています。 pictureBoxとlabelを重ねて、画像の上に時刻を表示しています。 秒が0になったとき(分の位が一つ上がるとき)、 分の位の画像を移動させて(forループ2つ)再び元の位置に戻しているのですが(pictureBox4.Top = 12;) そのとき秒が「00」とはならず「59」のままで、このループが終わると「00」を飛ばして「01」となります。 ちなみにこの部分はタイマーで0.2秒ごとに回しています。 原因がわかりませんので、ご教授願います。 また、ループには概算で0.8秒かかりますが、この間、タイマーの呼び出しは実行されているのでしょうか? 加えて、pictureBox4.Topの値を動かしていますが、重ねて配置しているlabelも一緒に動いてくれます。 いろいろなサイト様を参考に、 this.label3.Parent = this.pictureBox4; と親コントロールをFormから変更したのですが、このためでしょうか? 変な表現がありましたらご容赦ください。 よろしくお願いします。

  • 現在時刻をyyyymmddhhmmss形式で変数に格納する

    いつもお世話になっております。 現在時刻を取得し、yyyymmddhhmmss形式で ひとつの変数に持たせたいとおもっているのですが 可能でしょうか? ---------- 1 #include <stdio.h> 2 #include <time.h> 3 4 int main(void) 5 { 6 struct tm *date; 7 time_t now; 8 int year; 9 int month; 10 int day; 11 int hour, minute, second; 12 13 /* 現在の日時を取得 */ 14 time(&now); 15 date = localtime(&now); 16 17 year = date->tm_year + 1900; 18 month = date->tm_mon + 1; 19 day = date->tm_mday; 20 hour = date->tm_hour; 21 minute = date->tm_min; 22 second = date->tm_sec; 23 24 return 0; 25 26 } 27 --------------- yearからsecondを結合してひとつの変数に格納することは可能でしょうか??

  • 分を表す数値(int型)を、String型の”○時間○分”形式に直したい

    分(int型)を時間(String型)に直したいのですが↓ 例えば、 ----------------------------- 1. int minute = 160; 2. String time = '2時間40分' ----------------------------- 1のint型変数minuteの値を、 2のString型変数timeのような形式に直す方法を教えて下さい。

    • ベストアンサー
    • Java
  • 分を表す数字(int型)を時間形式に直しString型で返したい

    分を表す数字(int型)を時間形式に直しString型で返す 以下のようなメソッドを作成したいのですが、 実装方法を教えて頂けないでしょうか↓ /** * 分(int型) → 時間:分:秒(String型) に直して返すメソッド。 * int minute = 120; * String time = timeFormat( minute ); * この時、timeの値は、" 2:00:00 " */ public String timeFormat(int minute) { ~ 実装 ~ }

  • エクセルの日時から時間を足したいんですが…

    ※たとえば A1に 2010/4/1 7:00:00 B1には足したい時間(分) 60 としたときに C1には 2010/4/1 8:00:00 となるようにしたいのです。 さらに先ほどの足し算を連続しておこないたいのです。 C1に =TIME(HOUR(A2),MINUTE(A2)+D2,SECOND(A2)) だけですと時間のみの足し算になってしまい、日にちまで追いかけて表示してくれません。

  • 昨晩、【残業時間計算式を教えて下さい。】の質問を

    して締め切ったのですが、一つ言葉が足り無く再度のご教授を頂きたく宜しくお願い致します。 以下の関数ですと、残業時間計が1:30の表示になってしまいます。この表示を1.5に変更したいのですが、宜しくお願い致します。 =INT((D6-18.5/24)*48)/48 =TIME(HOUR(D6),INT(MINUTE(D6)/30)*30,0)-TIME(18,30,0)

  • ミリ秒までカウントできるタイマー

    「2008年12月31日まであと、1.0587秒」 のように、リアルタイムで時間が減っていく タイマーを作っているのですが、 コンマ5桁くらいつけたしたいです。 下のコードでは、秒までしか表示されません。 コンマ5桁くらい付け足すには、 どこを改造すればよいか、教えてください。 //ゴール年を設定(変更してください) goal_year = 2008; //ゴール月を設定(変更してください) goal_month = 1; //ゴール日を設定(変更してください) goal_day = 1; //ゴール日のDateオブジェクトの作成 goal_date = new Date(goal_year, goal_month-1, goal_day, 0, 0, 0); //1フレーム進む時間に1回以下を計算 this.onEnterFrame = function() { //Dateオブジェクトの作成 now_date = new Date(); //経過時間の差を求める count_time = goal_date-now_date; //経過時間(日)を求める count_day = Math.floor(count_time/(24*60*60*1000)); //経過時間(時間)を求める count_hour = Math.floor(count_time/(60*60*1000))-count_day*24; //経過時間(分)を求める count_minute = Math.floor(count_time/(60*1000))-count_day*24*60-count_hour*60; //経過時間(秒)を求める count_second = Math.floor(count_time/1000)-count_day*24*60*60-count_hour*60*60-count_minute*60; count_milisecond = Math.floor(count_time/1000)-count_day*24*60*60-count_hour*60*60-count_minute*60; //counter に表示 counter = goal_year+"年"+goal_month+"月"+goal_day+"日まであと"+count_day+"日"+count_hour+"時間"+count_minute+"分"+count_second+count_milisecond"秒"; };

  • バッチファイルのループ処理

    ffmpegを使いflvファイルからループを使いの画像を取得したいと考えております。 以下のバッチファイルを使用して起動して、5秒おきにループは10回回り、画像が10個出力されるはずですが、1枚しかできません。 --------------------- set fname=time:/=% set hour=%time:~0,2% set minute=%time:~3,2% set second=%time:~6,2% FOR /L %%i IN (1,1,10) DO ( ffmpeg -i yakei.flv -ss 1 -vframes 1 -f image2 %hour%時%minute%分%second%秒.jpg ping localhost -n 5 > null ) --------------------- どうしたら画像10個出力されますでしょうか? ご教授宜しくお願いします。

専門家に質問してみよう