はじめまして。こんばんは。しがない四回生と申します。
このたびプログラミングの授業レポートが全く分からず、困り果てて投稿いたしました。
レポートの課題で二つのプログラムを作る事になっています。
問題は下記のようになっております。
問1.キーボードから入力された文字がアルファベットの小文字である時は大文字を出力し、アルファベットの大文字で入力された場合は小文字で出力するプログラムを作りなさい。
ただし、アルファベット以外の文字が入力された場合には画面に「アルファベットではありません」とメッセージが表示されるようにしなさい。
問2.ツェラーの公式とは西暦の年y,月m,日d,からその日が何曜日であるかを算出する公式です。この公式を用いて、西暦年y,月m,日d,からその日が何曜日であるかを求める
プログラムを作りなさい。
計算手順は以下の通りです。
(1)求めたい日の月が1月,2月の場合はそれぞれ前年の13月,14月とする。 例)2007年1月1日なら、2006年13月1日とします。
(2)まず西暦年 y から、上2ケタ j と下2ケタ k を求める。 例) y=2310年ならば j=23,k=10となる。
(3)〝式” k+(kを4で割った商)+(jを4で割った商)-(jの2倍) の値を計算する。この値をpとする。
(4) (m+1)の26倍を10で割った商を計算する。この値を q とする。
(5)p+q+dを7で割った余りを計算する。これがhの値である。
(6)〝h”が0なら土曜日、1なら日曜日、2なら月曜日、3なら火曜日、4なら水曜日、5なら木曜日、6なら金曜日を表すものとします。
以上が問題です。回答を心待ちにしております。よろしくお願いします。
しがない4回生
プログラミングの授業レポートで困っています。
Re: プログラミングの授業レポートで困っています。
丸投げは禁止されています。フォーラムルールを読んでください。
その問題のプログラミング言語、あなたの基礎知識が明確ではありません。プログラムはあなたができる範囲で作ってみてください。それを掲示してくれれば、回答者さんは的確なヒントを出してくれます。
その問題のプログラミング言語、あなたの基礎知識が明確ではありません。プログラムはあなたができる範囲で作ってみてください。それを掲示してくれれば、回答者さんは的確なヒントを出してくれます。
Dango San
Re: プログラミングの授業レポートで困っています。
ご返信ありがとうございます。
提出期限が明日までだったもので焦って投稿してしまいました。すみません。
私のC言語に対する理解度ですが、恥ずかしながら #include <stdio.h>を文頭につける位しか理解できていません。
1問目は、他所様のサイトで例題が出ており。多少なり文字に起こせましたので掲載いたします。
#include<stdio.h>
main(){
int i,j=0;
char c;
char string[1000];
while((c=getchar())!=EOF){
string[j]=c;
j++;
}
for(i=0;i<=j;i++){
if(string>='A'&&string<='Z'){
string+='a'-'A';
}else if(string>='a'&&string<='z'){
string-='a'-'A';
}
}
printf("\n");
for(i=0;i<=j;i++)printf("%c",string);
printf("\n");
}
問1はこれに"if"文で、アルファベット以外の文字が入力された場合には画面に「アルファベットではありません」とメッセージが表示されるようにしなさい。に対応すればいいと思うのですが、やり方がわかりません。
どうかご教授お願いいたします。
また問2については全く持って理解できませんでした。ヒントでもよいので、ご教授いただければ幸いです。
提出期限が明日までだったもので焦って投稿してしまいました。すみません。
私のC言語に対する理解度ですが、恥ずかしながら #include <stdio.h>を文頭につける位しか理解できていません。
1問目は、他所様のサイトで例題が出ており。多少なり文字に起こせましたので掲載いたします。
#include<stdio.h>
main(){
int i,j=0;
char c;
char string[1000];
while((c=getchar())!=EOF){
string[j]=c;
j++;
}
for(i=0;i<=j;i++){
if(string>='A'&&string<='Z'){
string+='a'-'A';
}else if(string>='a'&&string<='z'){
string-='a'-'A';
}
}
printf("\n");
for(i=0;i<=j;i++)printf("%c",string);
printf("\n");
}
問1はこれに"if"文で、アルファベット以外の文字が入力された場合には画面に「アルファベットではありません」とメッセージが表示されるようにしなさい。に対応すればいいと思うのですが、やり方がわかりません。
どうかご教授お願いいたします。
また問2については全く持って理解できませんでした。ヒントでもよいので、ご教授いただければ幸いです。
Re: プログラミングの授業レポートで困っています。
問2を作ってみましたがそのまま載せると学習にならないので構図を。
①西暦、月、日を入力してもらう。
②計算する。
③曜日を表示。
西暦を上2ケタ、下2ケタを取りだすにはちょっとした工夫が必要です。私は整数と小数点に分けて関数で取り出しました。
int main(){
printf("西暦は?");
gets(xxx);
sscanf(xxx,"%d",&y); //入力
・・・
//計算
p = ○ + (○ / 4) + (× / 4) - (2 * ×); //pの値
q = ((m + 1) * 26 ) / 10; //qの値
h = (int)(p + q + d) % 7; //hの値
//出力
printf("その日は○曜日です");
}
②計算する。
③曜日を表示。
西暦を上2ケタ、下2ケタを取りだすにはちょっとした工夫が必要です。私は整数と小数点に分けて関数で取り出しました。
Dango San
Re: プログラミングの授業レポートで困っています。
きちんとcodeタグを使い、インデントをしっかりしておくと、
意図しないカッコの閉じ忘れなどを見つけやすくなりますよ。
すでにあなたが入力したプログラムにて、
1.入力された文字が大文字アルファベットの場合
2.1ではなく小文字アルファベットの場合
の2つの場合分けはできています。
これに、
3.1でも2でもなくそれ以外の場合
を追加して「アルファベットではありません」と表示できればそれでOKです。
(表示後プログラムを終了する場合にはその命令も追加する必要がありますが)
1.年、月、日をそれぞれ入力する処理を作る
→scanf関数でint型変数y(年)、m(月)、d(日)をそれぞれ入力してもらう
2.計算手順に従って曜日を求める
(1)求めたい日の月が1月,2月の場合はそれぞれ前年の13月,14月とする。
→mが1または2の場合は1.で入力してもらったyから1を引き(前年にする)、mに12を加算(これでmが1なら13に、2なら14になります)
(2)まず西暦年 y から、上2ケタ j と下2ケタ k を求める。 例) y=2310年ならば j=23,k=10となる。
→ヒント1 int型同士の計算では小数点以下は切り捨てられます。また、ある数値を10で割ると下一桁を削った数値を取得できます。同様に100で割ると下二桁を削った数値を取得できます。
→ヒント2 ある数値を10で割った余り(剰余)を求めると1の位以下の数値のみが取り出せます。同様に100で割った余りを求めると10の位以下の数値のみが取り出せます。
ここでもやはりint型同士の計算では小数点以下は切り捨てられます
※先にだんごさんが書きこんでいるように、整数部と小数部に分けて取り出す方法もありますね
(3)〝式” k+(kを4で割った商)+(jを4で割った商)-(jの2倍) の値を計算する。この値をpとする。
→日本語にあった計算式を作り、その結果を変数pに格納すればいいです
(4) (m+1)の26倍を10で割った商を計算する。この値を q とする。
→日本語にあった計算式を作り、その結果を変数qに格納すればいいです
(5)p+q+dを7で割った余りを計算する。これがhの値である。
→日本語にあった計算式を作り、その結果を変数hに格納すればいいです
(6)〝h”が0なら土曜日、1なら日曜日、2なら月曜日、3なら火曜日、4なら水曜日、5なら木曜日、6なら金曜日を表すものとします。
→hの値による多分岐構文が使えそうです。hの値によって、○曜日かを表示すればOKです
最初の年月日の入力処理さえできてしまえば、あとは計算手順に従って日本語の説明通りに式を書けばほぼ完成すると思います。
年の上位二桁と下位二桁を取り出すのもちょっと工夫がいりますが^^
確認ですが、
・Hello,Worldと表示するプログラムは書けますか?
・文字を入力してもらい、その文字を画面に出力するプログラムは書けますか?
期日が明日(日付的には今日ですが)の状態で、上記のプログラムが書けないとなると相当厳しいと思います。
意図しないカッコの閉じ忘れなどを見つけやすくなりますよ。
#include<stdio.h>
main(){
int i,j=0;
char c;
char string[1000];
while((c=getchar())!=EOF){
string[j]=c;
j++;
}
for(i=0;i<=j;i++){
if(string[i]>='A'&&string[i]<='Z'){
string[i]+='a'-'A';
}else if(string[i]>='a'&&string[i]<='z'){
string[i]-='a'-'A';
}
}
printf("\n");
for(i=0;i<=j;i++)printf("%c",string[i]);
printf("\n");
}
えぇと、ご自分で入力されたプログラムがどういう処理をしているのかを理解していないということでしょうか?しがない4回生 さんが書きました: 問1はこれに"if"文で、アルファベット以外の文字が入力された場合には画面に「アルファベットではありません」とメッセージが表示されるようにしなさい。に対応すればいいと思うのですが、やり方がわかりません。
すでにあなたが入力したプログラムにて、
1.入力された文字が大文字アルファベットの場合
2.1ではなく小文字アルファベットの場合
の2つの場合分けはできています。
これに、
3.1でも2でもなくそれ以外の場合
を追加して「アルファベットではありません」と表示できればそれでOKです。
(表示後プログラムを終了する場合にはその命令も追加する必要がありますが)
問2については、しがない4回生 さんが書きました: また問2については全く持って理解できませんでした。ヒントでもよいので、ご教授いただければ幸いです。
1.年、月、日をそれぞれ入力する処理を作る
→scanf関数でint型変数y(年)、m(月)、d(日)をそれぞれ入力してもらう
2.計算手順に従って曜日を求める
(1)求めたい日の月が1月,2月の場合はそれぞれ前年の13月,14月とする。
→mが1または2の場合は1.で入力してもらったyから1を引き(前年にする)、mに12を加算(これでmが1なら13に、2なら14になります)
(2)まず西暦年 y から、上2ケタ j と下2ケタ k を求める。 例) y=2310年ならば j=23,k=10となる。
→ヒント1 int型同士の計算では小数点以下は切り捨てられます。また、ある数値を10で割ると下一桁を削った数値を取得できます。同様に100で割ると下二桁を削った数値を取得できます。
→ヒント2 ある数値を10で割った余り(剰余)を求めると1の位以下の数値のみが取り出せます。同様に100で割った余りを求めると10の位以下の数値のみが取り出せます。
ここでもやはりint型同士の計算では小数点以下は切り捨てられます
※先にだんごさんが書きこんでいるように、整数部と小数部に分けて取り出す方法もありますね
(3)〝式” k+(kを4で割った商)+(jを4で割った商)-(jの2倍) の値を計算する。この値をpとする。
→日本語にあった計算式を作り、その結果を変数pに格納すればいいです
(4) (m+1)の26倍を10で割った商を計算する。この値を q とする。
→日本語にあった計算式を作り、その結果を変数qに格納すればいいです
(5)p+q+dを7で割った余りを計算する。これがhの値である。
→日本語にあった計算式を作り、その結果を変数hに格納すればいいです
(6)〝h”が0なら土曜日、1なら日曜日、2なら月曜日、3なら火曜日、4なら水曜日、5なら木曜日、6なら金曜日を表すものとします。
→hの値による多分岐構文が使えそうです。hの値によって、○曜日かを表示すればOKです
最初の年月日の入力処理さえできてしまえば、あとは計算手順に従って日本語の説明通りに式を書けばほぼ完成すると思います。
年の上位二桁と下位二桁を取り出すのもちょっと工夫がいりますが^^
確認ですが、
・Hello,Worldと表示するプログラムは書けますか?
・文字を入力してもらい、その文字を画面に出力するプログラムは書けますか?
期日が明日(日付的には今日ですが)の状態で、上記のプログラムが書けないとなると相当厳しいと思います。
オフトピック
何で期日ぎりぎりまでやらなかったのでしょうか(ノ∀`)
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: プログラミングの授業レポートで困っています。
/*
* プログラムを終了するときに「Ctrl+Z、改行」を2回押す必要があるのはいまいち。
* 適当に修正してください。
*/
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int c;
while ((c = getchar(), getchar(), c) != EOF) { // 後のgetchar()は改行の読み飛ばし
if (islower(c)) {
putchar(toupper(c));
}
else if (isupper(c)) {
putchar(tolower(c));
}
else {
printf("アルファベットではありません");
}
putchar('\n');
}
return 0;
}
Re: プログラミングの授業レポートで困っています。
/*
* グレゴリオ暦の話とか、月・日の範囲とかはノーチェック
* 2012年3月1日や2012年3月2日の曜日を正しく出力できない。
* 適当に修正してください。
*/
#include <stdio.h>
int main(void)
{
int y, m, d, j, k, p, q, h, yy, mm;
char *w[] = { "土", "日", "月", "火", "水", "木", "金" };
while (1) {
printf("年(0以下を入力すると終了):"), scanf("%d", &y);
if (y <= 0) break;
printf("月:"), scanf("%d", &m);
printf("日:"), scanf("%d", &d);
yy = y, mm = m;
if (m <= 2) y--, m += 12;
j = y / 100, k = y % 100;
p = k + k / 4 + j / 4 - 2 * j;
q = (m + 1) * 26 / 10;
h = (p + q + d) % 7;
printf("%d年%d月%d日は%s曜日\n", yy, mm, d, w[h]);
}
return 0;
}
Re: プログラミングの授業レポートで困っています。
マルチポストではないでしょうか?
「プログラミングの授業レポートで困っています。 はじめまして。こんばんは。しが... - Yahoo!知恵袋:」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1291276967
フォーラムルールに記載されている通り相互リンクが必要ですので、フォーラムルールを読んでみてください。
フォーラムルール:http://dixq.net/board/board.html
--
リンクが間違えていたので修正
「プログラミングの授業レポートで困っています。 はじめまして。こんばんは。しが... - Yahoo!知恵袋:」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1291276967
フォーラムルールに記載されている通り相互リンクが必要ですので、フォーラムルールを読んでみてください。
フォーラムルール:http://dixq.net/board/board.html
--
リンクが間違えていたので修正
Re: プログラミングの授業レポートで困っています。
すでに指摘されていますが、フォーラムルールにもあるとおり、
マルチポストを行っている場合は相互リンクを貼るルールになっています。
相互リンクが貼られるまではこれ以上の回答は避けます。
マルチポストを行っている場合は相互リンクを貼るルールになっています。
相互リンクが貼られるまではこれ以上の回答は避けます。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: プログラミングの授業レポートで困っています。
2012年3月1日も OK ですが、レポートには不適切なプログラムです。
#include <stdio.h>
int dow(int y, int m, int d) // day of week
{
return y -= m<3, (y + y/4 - y/100 + y/400 + "#[^](*-/+_):."[m] + d) % 7;
}
int main(void)
{
static char *w[] = { "日", "月", "火", "水", "木", "金", "土" };
int y, m, d;
while (printf("年 月 日 (数字以外で終了) ? "),
scanf("%d%d%d", &y, &m, &d) == 3 && m >= 1 && m <= 12)
printf("%d年%d月%d日は%s曜日\n", y, m, d, w[dow(y, m, d)]);
return 0;
}