C言語の入門課題について

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

C言語の入門課題について

#1

投稿記事 by 雛苺 » 17年前

初めまして。
C言語を学んで2ヶ月ほどの学生です。
前回の授業でテストがあり、そのテスト直しが課題という事なのですが、友人に聞いても友人もわからなく、今回アドバイスを頂けたらと思い投稿させていただきました。
まず問題の方を記載させて頂きますね。

問題1
文字型、整数型、単精度浮動小数点型、倍精度浮動小数点型の変数をそれぞれ宣言して使用できる最大の値を代入して書き出してください。変数名は型名の最初のアルファベットを使用してください。
ヒント
文字型:1バイトデータ(8ビット):-128~127
整数型:4バイトデータ(32ビット):-2147483648~2147483647
単精度浮動小数点型:4バイトデータ(32ビット):3.4E-38~3.4E+38
倍精度浮動小数点型:8バイトデータ(64ビット):1.7E-308~1.7E+308
      
アスキーコード表:http://www.cppll.jp/cppreference/ascii.html を調べること。


問題2 文字型の変数を宣言して文字Aを代入してください。


問題3 整数型の任意の変数を宣言して初期化してください。


問題4 定数 \n を宣言するコードを記述して表示してください。
ヒント:エスケープシーケンス一覧
\\ バックスラッシュそのもの
\a 「警告」文字。通常は ASCII BEL 文字である。
\b バックスペース
\f 改ページ
\n 改行
\r 復帰(キャリッジリターン)
\t 水平タブ
\v 垂直タブ
\x[0-9a-f]+ \xに続く16進数で表現された文字。"\x41"は大文字のAである。
\ddd 1桁か2桁か3桁の8進数で表現された文字。"\101"は大文字のAである。
\c 文字 c そのもの。


問題5 問題4のヒントをヒントにタブを入力してから文字をひとつ表示しましょう。文字は何でもよいです。


問題6 データ用整数型変数a,bを宣言して、aをbで割り算した値をcに、余りをdに代入して表示しなさい。必要な変数は適宜、宣言すること。


問題7 int型どうしの割り算の結果をdouble型に代入して表示しなさい。

とういうものです。


自分で分かった範囲というのは・・・恥ずかしながら問題1の途中までしかわかりませんでした。。
合っているか分かりませんが、
#include <stdio.h>

main()
{

  char c;
int i;
float f;
double d;

c=127;
i=2147483647;
f=3.4E+38;
d=1.7E+308;

printf("%c");
printf("%i");
printf("%f");
printf("%d");

return 0;
}
です。

それぞれのプログラム文と実行結果を知りたいのですが、勉強不足で問題1から後ろは教科書を読み直したり、何時間も考えましたがどうしても分かりませんでした。どうかアドバイスを頂けたらと思います。
実行結果ですが、コマンドプロンプトに、どういった文を入力したら結果が表示できるのかも、どうか教えていただけたらと思います。
よろしくお願いいたします。

*物分りが悪いため、文書のところどころでおかしい箇所がありましたらすみません。

管理人

Re:C言語の課題について

#2

投稿記事 by 管理人 » 17年前

こんにちは。管理人です。

教科書を読み直して、何時間も考えた。という事ですが、
printf文というのはHello Worldで有名な、C言語の基本中の基本で、どの参考書にも
第1章に書いてあるような事なので、しっかり覚えてください。
これを覚えないと、C言語の勉強が始まりません。

もし教科書でわからないなら

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

ここや

http://homepage1.nifty.com/toshio-k/prog/c/basic.html

ここや

http://wisdom.sakura.ne.jp/programming/c/c3.html

ここなどに、printf文の使い方が書いてあります。

C言語入門系のサイトは山ほどあるので、ウェブでも勉強できます。

http://www.google.co.jp/search?hl=ja&q= ... %96%80&lr=

このように検索すれば、沢山出てきます。
自分が読みやすいサイトを見つけて勉強してください。

一度、上記サイトを読んできてください。

keichan

Re:C言語の課題について

#3

投稿記事 by keichan » 17年前

疑問点があれば、何でもどうぞ。
/**
 問題1:回答例
 */
#include <stdio.h>

int main()
{
    char    c = 127;
    long    l = 2147483647;
    float   f = 3.4e+38f;
    double  d = 1.7e+308;

    printf("c = %d\n", c);
    printf("l = %d\n", l);
    printf("f = %f\n", f);
    printf("d = %f\n", d);

    return 0;
}

/**
 問題2:回答例
 */
int main()
{
    /// 文字の代入は''(シングルクォーテーション)で囲む

    char c = 'A';
    return 0;
}

/**
 問題3:回答例
 */
int main()
{
    /// 宣言と同時に代入。これが初期化。

    int i = 0;
    return 0;
}

/**
 問題4:回答例
 */
int main()
{
    const char n = '\x0A';
    return 0;
}

/**
 問題5:回答例
 */
#include <stdio.h>

int main()
{
    printf("\tprint");
    return 0;
}

/**
 問題6:回答例
 */
#include <stdio.h>

int main()
{
    int a = 10, b = 3;
    double c = a/b;
    int d = a%b;

    printf("c = %f\n", c);
    printf("d = %d\n", d);
    return 0;
}


/**
 問題7:回答例
 */
#include <stdio.h>

int main()
{
    int a = 10, b = 3;
    double div = a/b;

    printf("div = %f\n", div);
    return 0;
}

雛苺

Re:C言語の課題について

#4

投稿記事 by 雛苺 » 17年前

丁寧にサイト等も教えていただきありがとうございます。
教科書というのは教えて下さっている先生がオリジナルで作成したものだったので、他にも読んで見ますね、
サイトの方もこれから伺い勉強してきます。
サイトを見終わった後、教えて下さったプログラムを考え、もしも疑問が生じてしましたら、申し訳ないですがまたこちらから質問させて頂きますね。
理解出来た場合も書き込みさせて頂きます。
正直授業に一度ついていけなくなってからすべてがこんがらがってしまい悩んでいたので、回答だけでなくこのようなHPまで教えて頂けてうれしいです。
本当にありがとうございます。
それでは勉強して参りますね。

管理人

Re:C言語の課題について

#5

投稿記事 by 管理人 » 17年前

表現指示文字について、わかりましたか?

printf文でデータを表示する時は、その変数にあった表現指示文字を使用する必要があります。

以下の表を見てください。
型   データ範囲       表現指示文字

char   -127~128(文字)         %cまたは%d 
int    -32768~32767           %d 
float  有効桁数6桁の実数       %f 
double 有効桁数15桁の実数      %f
例えば、今int型変数の中身を表示させたい時は%dを使えと書いてありますね。

int i=10;

と宣言したとします。int型変数であるiには10が入っています。
これを表示してみましょう。

printf("%d",i);

このように書きます。
ダブルコーテーションの中に表現指示文字を書き、それに対応した変数を「,」の後に書きます。


int i=10, j=20;

とi,jの2つの変数を用意したならば、

printf("%d %d",i,j);

このように書くことで連続して書くことが出来ます。

%dの数と、後ろに書く変数の数は一緒でなければなりません。
左から書いた順番どおりに表示されます。
最初の%dがiの中身を表示させ、次の%dがjの中身を表示させているわけです。
型   データ範囲       表現指示文字

char   -127~128(文字)         %cまたは%d 
int    -32768~32767           %d 
float  有効桁数6桁の実数       %f 
double 有効桁数15桁の実数      %f
ですから、今回この表をもとに、どのように表示させようか考えて見ます。

そのまま書けばいいですね。

1番の答え考えてみてください。

管理人

Re:C言語の課題について

#6

投稿記事 by 管理人 » 17年前

1番の回答を考える前に、
とりあえず、文字型と、浮動小数点型で宣言された変数の表示について考えます。

文字型であるchar型で宣言したcは%cで表示するんだったですね。

つまり

printf("%c",c);

こういうことになります。

しかし、このままではよろしくありません。

int i=11;

printf("%d",i);
printf("%d",i);

このように書いた時、実行結果はこうなります。

1111

どこまでが前の表示で、どこからが次の表示かわからなくなりますね。
ですからこんな時は、行の終わりに\n改行コードを入れましょう。

printf("%d\n",i);
printf("%d\n",i);

こうすることで、実行結果は

11
11

となり、きちんと区切って見えてわかりやすくなりますね。
プログラムソースコードないでいくら改行しようが、printfで出力される文字にはなんら影響しませんので
ちゃんと改行コードを書いてやることが必要です。

ですから、文字型の表示はこうします。

printf("%c\n",c);

これで、文字を表示し、改行が出来ます。

先ほどの表では
文字型は%cでも%dでもいいかのように、書いてありましたね。
しかし両者では、表示されるものが違います。

文字というものは、全て文字コードで管理されています。

「文字」といういみの「1」と「数字」という意味の「1」では意味が異なります。

コンピュータの中でデータは全て0と1の信号で計算されています。
それにもかかわらず「文字」というあいまいなデータがあっては困りますね。
ですから「141」という信号がきたら「a」という文字にあたる
「142」という信号がきたら「b」という文字にあたる
と決めているんですね。
それが先ほどのアスキーコードです。

%cでは、その対応する「文字」を表示します。
%dでは、その対応する「文字コード」を表示します。

自分で両方表示してみて、どう違うか実際にみてみてください。


これらをふまえれば、回答はもうわかりますね。

回答のサンプルを書いておきます。
#include <stdio.h>

int main(){
    char    c = 127;
    int     i = 2147483647;
    float   f = 3.4e+38f;
    double  d = 1.7e+308;

    printf("c = %d\n", c);
    printf("i = %d\n", i);
    printf("f = %f\n", f);
    printf("d = %f\n", d);

    return 0;
}

管理人

Re:C言語の課題について

#7

投稿記事 by 管理人 » 17年前

では、続いて回答2にはいります。

char c;

と宣言すると、どのような意味をもつでしょうか。

変数を宣言すると「領域が確保」されます。
データは全て0と1の信号で管理されています。
ビットとバイトの事は知っていますか?
0か1をあらわす物が一つあるとしましょう。

これは1つで何種類の信号が識別できますか?

0か1   つまり2種類ですね。

これが2つ集まると何種類の信号が識別できますか?
00
01
10
11
数学の順列組合わせのように、2*2=4種類ですね。

これが3つ集まると何種類の信号が識別できますか?
000
001
010
011
100
101
110
111
2*2*2=8種類ですね。
このように、8個並べると
2*2*2*2*2*2*2*2=256種類の信号が識別出来ます。

この8個というのを8ビットといいます。
1と0の識別できる1つのものを1ビットといいます。

ビットが8個あつまったもの、
これが1バイトです。パソコンのHDDとかによくギガバイトなんてかいてある単位はこれです。

つまり1バイトでは256種類の信号が識別出来るんですね。

これが俗に言う「半角文字」です。半角文字では漢字や平かなはかけませんね?
何故でしょうか。
そうです。漢字は256種類の識別では表現し切れません。
漢字は何千とあり、もっともっと沢山の識別が必要です。

では先ほど8ビットで計算しましたが、1バイトを2つ並べて2バイトにすると
16ビットで計算できます。
つまり
2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2=65536
ですから、6万通り以上の識別が出来ます。
こなれば、漢字も平かなもカタカナも色んな記号もなんでも表現できますね。

これらを全角文字といいます。
よく携帯でメールをうっていると
右端のあたりに「残り9872」とかって出ていますよね。
あれは「残り9872バイト」という意味です。
あれって全角文字をうつと2ずつへり、半角文字をうつと1ずつへりますよね。
あれは半角文字が1バイト、全角文字が2バイトだからです。


・・・とかなり脱線しましたけど、
char c;

と宣言すると、半角文字分である1バイトが確保されます。

そして、シングルコーテーション「'」で文字を囲むとそれは文字コードをあらわします。
cにAの文字コードを代入したければ

c = 'A';

と書けばよいのです。
半角1文字がはいる1バイトにA 1文字がはいって丁度いいですね。

ですから、答えはこうなります。
#include <stdio.h>

void main(){
	char c;
	c = 'A';
}
簡単ですね。
これは、printf文がないので、実行しても何も見えません。
#include <stdio.h>

void main(){
	char c;
	c = 'A';
	printf("%c",c);
}
このように書くと、実行時に代入された文字が表示されます。

管理人

Re:C言語の課題について

#8

投稿記事 by 管理人 » 17年前

続いて問題3です。

変数は

int i;

このようにすると整数型であるint型のiという名前の変数が用意されますね。
実は先ほども断り無くやってしまいましたが、
宣言と同時に初期化できるんです。

初期化というのは、聴きなれない言葉かもしれませんが、
一般的には最初に0を代入することを言います。

変数は宣言しただけでは、その中身に何が入っているかわからないのです。
ですから、何の値も代入せずに表示したりすると変な値が出たり、
エラーになったりすることがあります。

そんなことを防ぐために、あらかじめ何かの値をいれておくことを
初期化といいます。別に0でなくてもいいですが、0が一般的です。

変数は宣言と同時に初期化出来、このように書きます。

int i=0;

こうすると、宣言と同時にiに0がはいります。
ですから解答はこうなります。
#include <stdio.h>

void main(){
	int i=0;
}
しかし、例によってこのプログラムにはprintf文がないので実行しても何も表示されませんから
本当にできたのか確認できません。
#include <stdio.h>

void main(){
	int i=0;
	printf("%d",i);
}
このようにprintf文を書くことで確認が出来るようになります。

管理人

Re:C言語の課題について

#9

投稿記事 by 管理人 » 17年前

文字コードは先ほどのアスキーコード表を見てください。

文字と文字コードについては上でお話しましたね。

あの表から見てみると改行コードは「10」だとわかります。
16進数で10を書けば「0A」ですね。
C言語で16進数を書く時は0xを最初に書きます。

char c;

で宣言したcに10を代入したらいいだけです。
#include <stdio.h>

void main(){
	char c = 10;
}
こうですね。
例によってprintfを付けると
#include <stdio.h>

void main(){
	char n = 10;
	printf("%c",n);
}
こうなります。
16進数で代入するなら
#include <stdio.h>

void main(){
	char n = 0x0A;
	printf("%c",n);
}
こうなります。

管理人

Re:C言語の課題について

#10

投稿記事 by 管理人 » 17年前

これで大分波に乗れたのではないでしょうか?

あんまり解説が長すぎても読むのがダルクなるでしょうからこの辺で。

自分でも問題をといてみてください。
もしわからなかったらまた聞いてください。

雛苺

Re:C言語の課題について

#11

投稿記事 by 雛苺 » 17年前

こんにちは。
問題に対する丁寧な解説もありがとうございました。
教えて頂いたHPも見ています。
プログラムの最初から分からなくなっているようなので、はじめから勉強することにしました。

今日も教えていただきたい問題があるのですがよろしいでしょうか;;
授業にはまだついていけないので、こちらもどういったプログラムの文になるのかアドバイスを頂けたら嬉しいです。
プログラムの実行の仕方は昨日教えて頂いたHPを見て理解出来ました。
その問題は昨日の問題の続きになるのですが、まだ昨日の問題3までしか理解できていないので、プログラム文を作るのに苦戦しております;;


問題8
先の問題1から7について、再度確認のために正解例を入力し、main関数内のすべての行にコメントをつけなさい。コメント行は/*と/*ではさむこと。

『この問題は、昨日回答して頂いたものを見させて頂き、調べながらなんとかできました。』

問題9
整数型変数a,b,cを宣言して、aとbを比較してaを代入して表示する文を記述して下さい。

問題10
年齢を整数でキーボードから入力し、12歳以下の場合には「小人料金」、それ以外の場合は「大人料金」と表示しなさい。

問題11
年齢を整数でキーボードから入力し、12歳以下の場合には「小人料金」、18歳以下の場合には「学生料金」それ以外の場合は「大人料金」と表示しなさい。

というものです。
問題8はなんとかとけたのですが、問題9からはどのようなプログラム文を作ればよいのか分かりません・・・。
よかったらアドバイスを下さい。

また、検索したのですがPC版の方のURLが分からなくなってしまったので、そちらも教えていただけないでしょうか?

よろしくお願いいたします。

box

Re:C言語の課題について

#12

投稿記事 by box » 17年前

問題9の意味がわかりません。

雛苺

Re:C言語の課題について

#13

投稿記事 by 雛苺 » 17年前

申し訳ございません。
問題9の文章を写し間違えてしまいました。

訂正させて頂きます。

問題9
整数型変数a,b,cを宣言して、aとbを比較してaが大きい場合にはcにaを代入して表示する文を記述して下さい。

です。失礼致しました。

管理人

Re:C言語の課題について

#14

投稿記事 by 管理人 » 17年前

>雛苺さん、

家に、コンパイルできる環境はありますか?
もしまだでしたら、まず、環境をそろえて、家で勉強できるようにする方がよいと思います。

>検索したのですがPC版の方のURLが分からなくなってしまったので

これはここの掲示板のURLの事ですか?
うわ、確かに携帯で投稿なさってますね。
書くの大変だったんじゃないですか?;
URLはアドレスバーに
「dixq.net」
とだけうてばここにたどり着けます。
実際のURLは
http://dixq.net/board/
こちらです。


>問題9
>整数型変数a,b,cを宣言して、aとbを比較してaを代入して表示する文を記述して下さい。

この問題も、C言語の超基本である
if文
を使って書くことが出来ます。
かなり基本なので、ここで答えを聞いてしまうのは避けたほうがいいと思います。
(明日まで期限というわけでないのでしたら)

勉強の仕方ですが、

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

例えばここにアクセスして
「if文ってどこをクリックしたら説明が出てくるんだろう」
と思いながらあちこちクリックしてください。
「基本だから項目は上のほうにあるはずだよな。しかしprintf文より後に出てくるんならprintfの解説より下にあるはずだよな」
など、色々考えて読んでみてください。

最初は調べる事も非常に大事なので。


問題の回答の考え方ですが、

問題9はif文について勉強してください。

問題10についてはscanf文とif文を勉強してください。

問題11についてはscanf文とif文(この文法の中にelse ifという物があり、これも)を勉強してください。

そうすれば解けるはずです。
もし解けなければ、ここまでコード書いたよっていうの見せてもらえないでしょうか。

管理人

Re:C言語の課題について

#15

投稿記事 by 管理人 » 17年前

>問題8はなんとかとけたのですが

プログラムは数学と同じです。
答えをみながら読んでいくとわかった気にだけなって、実際わかってないってことが
よくありますので、しっかり練習問題をしてくださいね。

よければ、わかっているか確認するためにこちらの問題をやってみてください。


問題
整数型変数a,b,cを宣言し、aには3,bには4を代入し、これらの足し算した計算結果をcに代入して表示しなさい。
その後、a×bの計算結果もcに代入して表示しなさい。
表示は以下のようになるようにしなさい

----------------
a+bの計算結果は
7

a×bの計算結果は
12
----------------

閉鎖

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