プログラミングの授業レポートで困っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しがない4回生

プログラミングの授業レポートで困っています。

#1

投稿記事 by しがない4回生 » 12年前

はじめまして。こんばんは。しがない四回生と申します。
このたびプログラミングの授業レポートが全く分からず、困り果てて投稿いたしました。
レポートの課題で二つのプログラムを作る事になっています。

問題は下記のようになっております。

問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回生

だんごさん
記事: 273
登録日時: 12年前

Re: プログラミングの授業レポートで困っています。

#2

投稿記事 by だんごさん » 12年前

丸投げは禁止されています。フォーラムルールを読んでください。

その問題のプログラミング言語、あなたの基礎知識が明確ではありません。プログラムはあなたができる範囲で作ってみてください。それを掲示してくれれば、回答者さんは的確なヒントを出してくれます。
 Dango San

しがない4回生

Re: プログラミングの授業レポートで困っています。

#3

投稿記事 by しがない4回生 » 12年前

ご返信ありがとうございます。
提出期限が明日までだったもので焦って投稿してしまいました。すみません。
私の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については全く持って理解できませんでした。ヒントでもよいので、ご教授いただければ幸いです。

だんごさん
記事: 273
登録日時: 12年前

Re: プログラミングの授業レポートで困っています。

#4

投稿記事 by だんごさん » 12年前

ソースはcodeタグで囲んでください。
そのプログラムは正常に作動しますが、もっと便利に関数を使用されてはどうですか?

関数を使うと長いプログラムが一行で済んだりします。ctype.hの最後の行あたり、「toupper(c) 文字c が小文字なら、大文字に変換した値を返す。 小文字以外なら、そのままの値を返す。 」という関数です。使い方は説明すると長々となるので、C言語超入門で確認してください。・・・提出が明日でこの知識だとちょっと時間が限界かもです。
 Dango San

だんごさん
記事: 273
登録日時: 12年前

Re: プログラミングの授業レポートで困っています。

#5

投稿記事 by だんごさん » 12年前

問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

アバター
asd
記事: 319
登録日時: 13年前

Re: プログラミングの授業レポートで困っています。

#6

投稿記事 by asd » 12年前

きちんとcodeタグを使い、インデントをしっかりしておくと、
意図しないカッコの閉じ忘れなどを見つけやすくなりますよ。

コード:

#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です。
(表示後プログラムを終了する場合にはその命令も追加する必要がありますが)
しがない4回生 さんが書きました: また問2については全く持って理解できませんでした。ヒントでもよいので、ご教授いただければ幸いです。
問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
無理やりこじつけ(ぉ

初級者
記事: 200
登録日時: 13年前

Re: プログラミングの授業レポートで困っています。

#7

投稿記事 by 初級者 » 12年前

コード:

/*
 * プログラムを終了するときに「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;
}

初級者
記事: 200
登録日時: 13年前

Re: プログラミングの授業レポートで困っています。

#8

投稿記事 by 初級者 » 12年前

コード:

/*
 * グレゴリオ暦の話とか、月・日の範囲とかはノーチェック
 * 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;
}

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: プログラミングの授業レポートで困っています。

#9

投稿記事 by 沖 滉均 » 12年前

マルチポストではないでしょうか?

「プログラミングの授業レポートで困っています。 はじめまして。こんばんは。しが... - Yahoo!知恵袋:」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1291276967

フォーラムルールに記載されている通り相互リンクが必要ですので、フォーラムルールを読んでみてください。
フォーラムルール:http://dixq.net/board/board.html

--
リンクが間違えていたので修正
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
asd
記事: 319
登録日時: 13年前

Re: プログラミングの授業レポートで困っています。

#10

投稿記事 by asd » 12年前

すでに指摘されていますが、フォーラムルールにもあるとおり、
マルチポストを行っている場合は相互リンクを貼るルールになっています。

相互リンクが貼られるまではこれ以上の回答は避けます。
Advanced Supporting Developer
無理やりこじつけ(ぉ

かずま

Re: プログラミングの授業レポートで困っています。

#11

投稿記事 by かずま » 12年前

初級者 さんが書きました:

コード:

/*
 * グレゴリオ暦の話とか、月・日の範囲とかはノーチェック
 * 2012年3月1日や2012年3月2日の曜日を正しく出力できない。
 * 適当に修正してください。
 */

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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る