質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

7回答

682閲覧

無料のC言語問題サイトの別解を教えて欲しい。

Watanuki.

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2024/04/24 23:15

教材やネットを使いC言語を勉強しているものです。
初心者で伝わりにくいとは思いますがお願い致します。

無料のサイトに乗っていた関数を作るという問題なのですが、問題を見た友人曰く、toupperを使わずに行えるとのことでした。(友人曰くifとかforとか…との事でした…)C言語は始めたばかりで、3日ほど自力で考えましたが想像がつきません。解説とともに教えていただけると幸いです。

下記の様な問題です。

1文字を引数とする。
その文字がアルファベット小文字であれば大文字に変換して返す関数を作成すること。
小文字でなければそのまま返すこと。
入力された文字列を大文字に変換して出力。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/04/24 23:36

> 無料のC言語問題サイトの別解を教えて欲しい。 ... > 3日ほど自力で考えましたが想像がつきません。解説とともに教えていただけると幸いです。 このようなサイトで手取り足取り教えてもらうのは難しいかもしれません。(<質問自体を非難しているのではありません) [質問するときのヒント] https://teratail.com/help/question-tips まったく想像がつかない場合、前提とする知識が圧倒的に少ない可能性があります。考える為の材料が少ないと、すぐに行き詰まります。 ヒントは文字コードのASCIIコード(アスキーコード)です。それで調べると進展があるかもしれません。 また、AIに「C言語で、toupper関数を使わずに小文字から大文字に変換するコードを教えてください。その際、コードの解説も付けてください。」など訊ねると充分な説明を得られる場合があります。ブラウザーにもよりますが、上記質問そのままで検索をかけると関連する情報も得られます。
dodox86

2024/04/24 23:38

コメントした後に思いつきましたが、 > 問題を見た友人曰く、toupperを使わずに行えるとのことでした。( その友人に聞くのが一番早い気がします...
Watanuki.

2024/04/25 00:02

現在友人は海外旅行に行っており、連絡するのにも申し訳ないかなと(((( '-' )))) ありがとうございます。 ASCIIコード表見てみます。 もう少し考えてみます…。
fana

2024/04/25 02:09

> 無料のC言語問題サイトの別解 という話をするのであれば,何はともあれ,その「無料のサイトで示されている解」がどんなものなのかを示す必要があるのでは? そのサイトの解と同じ内容が回答されることは避けるべきでしょうから.
jimbe

2024/04/25 04:31

というか、意訳すれば「toupper(と同じモノ)を作れ」という問に toupper を使った答を出したんでしょうか。
ikedas

2024/04/25 11:14

> 無料のC言語問題サイトの別解 では、そのサイトに載っている解を見られるようにしてください (URLを明記してください)。その解以外の解を「別解」というのではありませんか。
guest

回答7

0

質問内容から推測すると・・・
・質問者さんはこの問題の回答としてtoupper()を使った答えを考えた?
・それを見た友人はtoupper()を使わないでもifとかforでできる…と言った
ということのようですが、そもそも「どういう答えを考えたのか」がないと、アドバイスできないところではあります。
この問題は
1.「1文字を引数としてアルファベット小文字なら大文字にしてそれ以外はそのまま返す関数を作る」
2.「作った関数を呼び出して、入力した文字列を大文字に変換して出力する」
に分けられます。
で、考え方ですが、
・1文字を引数とする関数を作る (全部書くと勉強にならないのでテキストで...)

C

1 char lowerToUpper(char ch) { 2 if (引数chが文字'a'から'z'の範囲内) { 3 引数ch から (文字'a'と文字'A'のコードの差分)を引く; // 'a'のコードは0x61(97)で'A'は0x41(65)だから 4 } 5 return 引数ch; 6 }

・作成した関数を呼び出して出力

C

1#include <stdio.h> 2#include <string.h> 3void main( void ) { 4 char str[1024]; // 何文字までという指定はないけど練習だから適当に... 5 int len; // 文字列の長さ 6 int i; // 文字数のカウンタ 7 8 標準入力から文字列の入力を得る("%s", str); // scanfですね 9 10 int len = strlen(str); // 入力された文字列の長さを求める 11 // 入力されたすべての文字のアルファベット小文字を大文字に変換する 12 for ( i = 0 ; i < len ; i++ ) { 13 str[i] = lowerToUpper( str[i] ); // 作った変換用の関数を呼び出して変換 14 } 15 標準出力に変換結果文字列を出力( "%s\n", str ); // printfですね 16}

以上、参考まで...

投稿2024/05/01 05:02

schi_heil

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

'a'~'z'であれば、if文と足し算でいけます。
'a'~'z'であれば、'a'の文字コードを引く、その引いた結果を大文字'A'コードを足すだけです。

int itextupper(int c) { if (c >= 'a' && c <= 'z') { c = (c - (int)'a') + 'A'; } return c; }

投稿2024/05/01 00:20

red_bb

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c のコードは大体どこかに公開されていて、探すと見つかったりします。

古めの openbsd の ctype.h らしぃ
https://github.com/openbsd/src/blob/master/include/ctype.h

apple 製品の? ctype.h
https://opensource.apple.com/source/Libc/Libc-1158.1.2/include/ctype.h.auto.html

どこぞの linux の? ctype.h
https://github.com/torvalds/linux/blob/master/include/linux/ctype.h

投稿2024/04/25 18:32

jimbe

総合スコア12659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

表を引くのもありです。1バイトの文字を全部並べる。

C

1int my_toupper(int c){ 2 return "\0\1\2\3(中略) !\"#$(中略)@ABC(中略)Z[\\]^_`ABC(中略)Z{|}~\x7F(中略)\xFE\xFF"[c&0xFF]; 3}

(0~255を超える値の時にどうするかによってはifで判断が必要。本物のtoupperの仕様に合わせるならEOFだけif判断が必要)

昔見たisupper(英大文字かどうかチェック)とかisdigit(数字かどうかチェック)は、ifを使わず表を引くマクロでした。今の実装は見たこと無いですがマクロじゃなくて関数ですね。

投稿2024/04/25 04:11

otn

総合スコア84661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

3日ほど自力で考えましたが想像がつきません。

本当ですか?
「ものすごく簡単な/当たり前な/もうちょっとやりようがあるだろと言いたくなるような/etc...」方法であれば想像が付くのはありませんか?

アルファベットの小文字って26種類ですよね,きっと.であれば,

  • もし入力が a だったら → A を返す
  • もし入力が b だったら → B を返す
  • もし入力が c だったら → C を返す

っていうのを26個書き並べて

C

1if( input=='a' )return 'A'; 2if( input=='b' )return 'B'; 3/* …略… */ 4if( input=='z' )return 'Z'; 5return input; //小文字じゃなかった場合は入力された文字を返す

とかすれば,

アルファベット小文字であれば大文字に変換して返す

というのを達成できますよね.とりあえず.

きっと,この状態に 何かしら不満があるから,もっとマシな方法を探している 的な話なのでしょうけども,何はともあれこれでも所望の動作をできるでしょうし,実装面では友人が言う「for」も要りませんし「ASCIIコードがどうのこうの」いう話ももちろん不要です.

  • (私の想像とは違って)「コレが思いつかない」という話だったならば,とりあえず上記が「回答」のひとつになるでしょう.
  • (私の想像通りに)「コレよりもマシな何かを考えている」という話なのであれば,そういう意味合いのわかる質問をするべきです.
    そうすれば「ifをたくさん書くのが不満であれば,この26連装 if を for のループでまとめてはどうか」だとか「ASCIIコードを利用してやればどうの」いう方向の話が,その話に沿った形で提示されることになるでしょう.

(友人曰くifとかforとか…との事でした…)

おそらく,友人が述べているのは,上記の

「ifをたくさん書くのが不満であれば,この26連装 if を for のループでまとめてはどうか」

に相当するような話であり,例えば下記のような感じなのかな,と想像します.

C

1//「 if を 26個書くってのはさすがにどうかなー,とか思うから,26回ループする for を用いてやる」的な 2char MyToUpper( char input ) 3{ 4 const char *Lower = "abcdefghijklmnopqrstuvwxyz"; 5 const char *Upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 6 7 for( int i=0; i<26; ++i ) 8 { 9 if( input == Lower[i] )return Upper[i]; 10 } 11 return input; 12}

投稿2024/04/25 01:38

編集2024/04/25 01:53
fana

総合スコア11663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/04/25 02:02

おそらく,他の回答等に出ている「ASCIIコード云々」な方法の方が,何らかの意味で良いように見えることと思います. 私だって,本当にこれを実装して使う必要がある場面であればそっち側の方法を採ります. しかし,それはそれ. > 勉強している という状況下での話なのであれば, なんというか,このような あきれるほどに愚直すぎる方法 みたいなのを一蹴しないことも大切なのではないかな,とか何とか思ったり.
guest

0

引数がアルファベット1文字限定として、char型の文字を引数として、
その引数が'a'から'z'までは、引数から'a'を引いて、'A'を足す。
それ以外の文字はそのまま返す。

ASCIIコード表を見ると何をしているのか分かると思います。

投稿2024/04/25 00:38

ardin

総合スコア546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その一文字がアルファベットであることが約束されているかどうかで前処理が変わりますが
約束されているとして a & 223 でできるのではないかな

投稿2024/04/24 23:51

winterboum

総合スコア23364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Watanuki.

2024/04/25 00:03

ありがとうございます! 試してみます!
jimbe

2024/04/25 18:09

さすがに >1文字を引数とする。 >その文字がアルファベット小文字であれば大文字に変換して返す関数を作成すること。 >小文字でなければそのまま返すこと。 で『入力はアルファベットのみと限定されている』と仮定するのは無理そうに感じますが。
winterboum

2024/04/26 09:03

はい ですのでそこは前処理でおこなうことに
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問