ページ 1 / 1
よくわかりません
Posted: 2017年5月16日(火) 15:54
by tennga
アルファベットの小文字を渡すと大文字に変換して返す void 型の関数を作成せよ.こ
の関数を用いて,標準入力から入力された小文字 1 文字を大文字に変換して出力するプログラム
を作成せよ.なお,アルファベットの小文字のみ入力されると仮定してよい。の問題ですが、、、
小文字を渡すと大文字に変換して返す void 型の関数を作成方法がわかりません。
よろしくお願いします。
Re: よくわかりません
Posted: 2017年5月16日(火) 16:45
by purin52002
まずvoid型の関数を作ります。関数名はここではFuncとします。あとで自分の好きな名前にしてください。
つぎに引数をchar型にします。引数名をcとします。あとで自分の好きな名前にしてください。
コード:
void Func(char c) {}
つぎに関数の中身を作っていきます。
ASCIIコードはご存知ですか?知ってても知らなくてもとりあえずググります。
ASCIIコードを眺めてると、なんとなく規則性が見えてくるような、、、そうでもないような、、、
多分関数の中身を考えることがキモだと思いますのでここは自分で考えてみてください^^
オフトピック
ヒント
aのascii->97
Aのascii->65
bのascii->98
Bのascii->?
Re: よくわかりません
Posted: 2017年5月16日(火) 16:52
by tennga
これもしかしてc++ですよね?
ぼくが扱っているプログラミングCなんですよ、、、
Re: よくわかりません
Posted: 2017年5月16日(火) 17:46
by だんごさん
tennga さんが書きました:これもしかしてc++ですよね?
ぼくが扱っているプログラミングCなんですよ、、、
C言語ですよ。表示形式がC++なだけです。
Re: よくわかりません
Posted: 2017年5月16日(火) 21:59
by みけCAT
tennga さんが書きました:小文字を渡すと大文字に変換して返す void 型の関数を作成方法がわかりません。
確かに、データを返さないといけないのにvoid型というのはよくわかりませんね。
出題者に確認したほうがいいかもしれません。
Re: よくわかりません
Posted: 2017年5月16日(火) 22:39
by inemaru
void型の関数を作る条件の問題なのだとしたら、引数はポインタになりそうですね。
Re: よくわかりません
Posted: 2017年5月17日(水) 14:53
by tennga
ポインタですか?
どういう風に書けばいいですかね、、、
Re: よくわかりません
Posted: 2017年5月17日(水) 17:11
by かずま
標準入力から入力された小文字を、そのまま出力するプログラムを書いて
codeタグを付けて貼り付けてください。
main の中で、関数を呼ばずに大文字に変換して出力することはできますか?
void ではなく、変換した大文字を返却値として返す関数は書けますか?
上記に回答していただければ、ポインタを使った方法を示します。
「よくわかりません」などという不適切な件名を付けないでください。
「void型の関数で値を返す方法」などとしてほしかった。
フォーラムルールは読んでいますか?
Re: よくわかりません
Posted: 2017年5月19日(金) 01:13
by tennga
たぶんできないですね、、、
教えてほしいです。
すいません読んでないです、、、
Re: よくわかりません
Posted: 2017年5月19日(金) 02:11
by 超初級者
コード:
#include <stdio.h>
#include <ctype.h>
void lowToUp(int *c)
{
*c = toupper(*c);
}
int main(void)
{
int c;
printf("英小文字を入力:"), scanf("%c", &c);
printf("%cを大文字に変換すると", c);
lowToUp(&c);
printf("%c\n", c);
return 0;
}
Re: よくわかりません
Posted: 2017年5月19日(金) 02:20
by みけCAT
超初級者 さんが書きました:コード:
int c;
printf("英小文字を入力:"), scanf("%c", &c);
scanfの書式%cはchar*型のデータが対応することを要求し、int*型のデータを渡してしまうと
未定義動作になります。
さらに、char型よりint型のサイズが大きい環境では、int型の一部(リトルエンディアンでは上位)のビットが初期化されないことが考えられ、よくないでしょう。
Re: よくわかりません
Posted: 2017年5月19日(金) 14:24
by 白い変人
出力の定義が「値を返却する事」のみとは言いきれませんからね。
入力されたchar型の変数に格納された小文字のデータを大文字に変換して「コンソール上に出力」する関数と考えれば、値を返却する必要が無いという意味で妥当な解釈だと思えます。
以下、回答例。
コード:
void func(char c){
if(c>='a' && c<='z') c='A'+c-'a';
printf("%c",c);
}
Re: よくわかりません
Posted: 2017年5月19日(金) 17:16
by かずま
tennga さんが書きました:たぶんできないですね、、、
回答として不満ですが、ポインタを使った方法を示します。
コード:
#include <stdio.h>
double conv(double x)
{
return x * 1.61;
}
int main(void)
{
double a, b;
scanf("%lf", &a);
b = conv(a);
printf("%g\n", b);
return 0;
}
conv は、double の値を渡すと、1.61倍の値に変換して返す関数です。
main は、conv を用いて、標準入力から入力された値を 1.61倍の値に
変換して出力するプログラムです。
通常、関数は、上の例のように返却値として値を返しますが、ポインタ
を使用すると、次の例のように引数を用いて値を返すことができます。
コード:
#include <stdio.h>
void conv2(double x, double *p)
{
*p = x * 1.61;
}
int main(void)
{
double a, b;
scanf("%lf", &a);
conv2(a, &b);
printf("%g\n", b);
return 0;
}
p は「double へのポインタ」です。
&b は、変数 b のアドレスです。アドレスは「ポインタの値」です。
conv2 を呼び出すと、p は、その値を受け取るので、b を指します。
「*p =」は「b =」と同じ意味になります。
以上、理解できましたか?
Re: よくわかりません
Posted: 2017年5月20日(土) 02:40
by かずま
一つのポインタで、値をもらうことも返すこともできるという例です。
コード:
#include <stdio.h>
double conv(double x)
{
return x * 1.61;
}
int main(void)
{
double a;
scanf("%lf", &a);
a = conv(a);
printf("%g\n", a);
return 0;
}
conv は、double の値を渡すと、1.61倍の値に変換して返す関数です。
main は、conv を用いて、標準入力から入力された値を 1.61倍の値に
変換して出力するプログラムで、変数は a だけです。
通常、関数は、上の例のように返却値として値を返しますが、ポインタ
を使用すると、次の例のように引数を用いて値を受け取ることも返す
こともできます。
コード:
#include <stdio.h>
void conv1(double *p)
{
*p *= 1.61; // *p = *p * 1.61; でも同じ
}
int main(void)
{
double a;
scanf("%lf", &a);
conv1(&a);
printf("%g\n", a);
return 0;
}
p は「double へのポインタ」です。
&a は、変数 a のアドレスです。アドレスは「ポインタの値」です。
conv1 を呼び出すと、p は、その値を受け取るので、a を指します。
「*p *=」は「a *=」と同じ意味になり、
「a = a * 1.61」と同じ意味になります。
小文字を大文字に変換する関数は、double * の代わりに char * の
引数を使えばよいでしょうお。
コード:
void conv0(char *p)
{
*p -= ' '; // *p ^= ' '; でもよい
}
さあ、main はどう書けばよいでしょうか?