合計 昨日 今日

よくわかりません

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: tennga
[URL]
ぴよぴよ(427 ポイント)
Date: 2017年5月16日(火) 15:54
No: 1
(OFFLINE)

 よくわかりません

アルファベットの小文字を渡すと大文字に変換して返す void 型の関数を作成せよ.こ
の関数を用いて,標準入力から入力された小文字 1 文字を大文字に変換して出力するプログラム
を作成せよ.なお,アルファベットの小文字のみ入力されると仮定してよい。の問題ですが、、、

小文字を渡すと大文字に変換して返す void 型の関数を作成方法がわかりません。
よろしくお願いします。

Name: purin52002
[URL]
中級者(14,070 ポイント)
Date: 2017年5月16日(火) 16:45
No: 2
(OFFLINE)

 Re: よくわかりません

まずvoid型の関数を作ります。関数名はここではFuncとします。あとで自分の好きな名前にしてください。

コード[C++]: 全て選択
1
void Func(void) {}


つぎに引数をchar型にします。引数名をcとします。あとで自分の好きな名前にしてください。

コード[C++]: 全て選択
1
void Func(char c) {}


つぎに関数の中身を作っていきます。
ASCIIコードはご存知ですか?知ってても知らなくてもとりあえずググります。
ASCIIコードを眺めてると、なんとなく規則性が見えてくるような、、、そうでもないような、、、

多分関数の中身を考えることがキモだと思いますのでここは自分で考えてみてください^^
Offtopic :
ヒント
aのascii->97
Aのascii->65

bのascii->98
Bのascii->?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Name: tennga
[URL]
ぴよぴよ(427 ポイント)
Date: 2017年5月16日(火) 16:52
No: 3
(OFFLINE)

 Re: よくわかりません

これもしかしてc++ですよね?
ぼくが扱っているプログラミングCなんですよ、、、

Name: だんごさん
[URL]
上級者(23,220 ポイント)
Date: 2017年5月16日(火) 17:46
No: 4
(OFFLINE)

 Re: よくわかりません

tennga さんが書きました:これもしかしてc++ですよね?
ぼくが扱っているプログラミングCなんですよ、、、

C言語ですよ。表示形式がC++なだけです。
 Dango San

Name: みけCAT
[URL]
伝説なるハッカー(655,393 ポイント)
Date: 2017年5月16日(火) 21:59
No: 5
(OFFLINE)

 Re: よくわかりません

tennga さんが書きました:小文字を渡すと大文字に変換して返す void 型の関数を作成方法がわかりません。

確かに、データを返さないといけないのにvoid型というのはよくわかりませんね。
出題者に確認したほうがいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: inemaru
[URL]
上級者(15,871 ポイント)
Date: 2017年5月16日(火) 22:39
No: 6
(OFFLINE)

 Re: よくわかりません

void型の関数を作る条件の問題なのだとしたら、引数はポインタになりそうですね。

Name: tennga
[URL]
ぴよぴよ(427 ポイント)
Date: 2017年5月17日(水) 14:53
No: 7
(OFFLINE)

 Re: よくわかりません

ポインタですか?
どういう風に書けばいいですかね、、、

Name: かずま
[URL]
Date: 2017年5月17日(水) 17:11
No: 8
(OFFLINE)

 Re: よくわかりません

標準入力から入力された小文字を、そのまま出力するプログラムを書いて
codeタグを付けて貼り付けてください。

main の中で、関数を呼ばずに大文字に変換して出力することはできますか?
void ではなく、変換した大文字を返却値として返す関数は書けますか?

上記に回答していただければ、ポインタを使った方法を示します。

「よくわかりません」などという不適切な件名を付けないでください。
「void型の関数で値を返す方法」などとしてほしかった。
フォーラムルールは読んでいますか?

Name: tennga
[URL]
ぴよぴよ(427 ポイント)
Date: 2017年5月19日(金) 01:13
No: 9
(OFFLINE)

 Re: よくわかりません

たぶんできないですね、、、

教えてほしいです。

すいません読んでないです、、、

Name: 超初級者
[URL]
かけだし(1,650 ポイント)
Date: 2017年5月19日(金) 02:11
No: 10
(OFFLINE)

 Re: よくわかりません

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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;
}

Name: みけCAT
[URL]
伝説なるハッカー(655,393 ポイント)
Date: 2017年5月19日(金) 02:20
No: 11
(OFFLINE)

 Re: よくわかりません

超初級者 さんが書きました:
コード[C]: 全て選択
1
2
3
    int c;
 
    printf("英小文字を入力:"), scanf("%c", &c);

scanfの書式%cはchar*型のデータが対応することを要求し、int*型のデータを渡してしまうと未定義動作になります。
さらに、char型よりint型のサイズが大きい環境では、int型の一部(リトルエンディアンでは上位)のビットが初期化されないことが考えられ、よくないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: 白い変人
[URL]
Date: 2017年5月19日(金) 14:24
No: 12
(OFFLINE)

 Re: よくわかりません

出力の定義が「値を返却する事」のみとは言いきれませんからね。

入力されたchar型の変数に格納された小文字のデータを大文字に変換して「コンソール上に出力」する関数と考えれば、値を返却する必要が無いという意味で妥当な解釈だと思えます。

以下、回答例。

コード[C++]: 全て選択
1
2
3
4
5
void func(char c){
    if(c>='a' && c<='z') c='A'+c-'a';
 
    printf("%c",c);
}

Name: かずま
[URL]
Date: 2017年5月19日(金) 17:16
No: 13
(OFFLINE)

 Re: よくわかりません

tennga さんが書きました:たぶんできないですね、、、

回答として不満ですが、ポインタを使った方法を示します。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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倍の値に
変換して出力するプログラムです。

通常、関数は、上の例のように返却値として値を返しますが、ポインタ
を使用すると、次の例のように引数を用いて値を返すことができます。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 =」と同じ意味になります。

以上、理解できましたか?

Name: かずま
[URL]
Date: 2017年5月20日(土) 02:40
No: 14
(OFFLINE)

 Re: よくわかりません

一つのポインタで、値をもらうことも返すこともできるという例です。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 だけです。

通常、関数は、上の例のように返却値として値を返しますが、ポインタ
を使用すると、次の例のように引数を用いて値を受け取ることも返す
こともできます。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 * の
引数を使えばよいでしょうお。
コード[C]: 全て選択
1
2
3
4
void conv0(char *p)
{
    *p -= ' ';  // *p ^= ' '; でもよい
}

さあ、main はどう書けばよいでしょうか?


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[6人]