よくわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tennga
記事: 13
登録日時: 7年前

よくわかりません

#1

投稿記事 by tennga » 6年前

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

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

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: よくわかりません

#2

投稿記事 by purin52002 » 6年前

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

コード:

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

コード:

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

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

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

tennga
記事: 13
登録日時: 7年前

Re: よくわかりません

#3

投稿記事 by tennga » 6年前

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

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

Re: よくわかりません

#4

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

tennga さんが書きました:これもしかしてc++ですよね?
ぼくが扱っているプログラミングCなんですよ、、、
C言語ですよ。表示形式がC++なだけです。
 Dango San

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: よくわかりません

#5

投稿記事 by みけCAT » 6年前

tennga さんが書きました:小文字を渡すと大文字に変換して返す void 型の関数を作成方法がわかりません。
確かに、データを返さないといけないのにvoid型というのはよくわかりませんね。
出題者に確認したほうがいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

inemaru
記事: 108
登録日時: 7年前

Re: よくわかりません

#6

投稿記事 by inemaru » 6年前

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

tennga
記事: 13
登録日時: 7年前

Re: よくわかりません

#7

投稿記事 by tennga » 6年前

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

かずま

Re: よくわかりません

#8

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

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

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

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

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

tennga
記事: 13
登録日時: 7年前

Re: よくわかりません

#9

投稿記事 by tennga » 6年前

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

教えてほしいです。

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

超初級者
記事: 56
登録日時: 9年前

Re: よくわかりません

#10

投稿記事 by 超初級者 » 6年前

コード:

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

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: よくわかりません

#11

投稿記事 by みけCAT » 6年前

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

コード:

    int c;

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

白い変人

Re: よくわかりません

#12

投稿記事 by 白い変人 » 6年前

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

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

以下、回答例。

コード:

void func(char c){
	if(c>='a' && c<='z') c='A'+c-'a';

	printf("%c",c);
}

かずま

Re: よくわかりません

#13

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

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: よくわかりません

#14

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

一つのポインタで、値をもらうことも返すこともできるという例です。

コード:

#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 はどう書けばよいでしょうか?

返信

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