2018/2/11
区切りの為に書きます
この投稿にもう私が投稿するころはありません
皆さん質問ありがとうございました
回答者の方々どうしで議論するために使ってください
よろしければこちらのアイデアについて
ご意見がうかがえると嬉しいです
https://togetter.com/li/1198124
学業を収めることが卒業するために必要なんだから
趣味よりもそちらを最優先したほうがいいのではないかと思いました。
なので、こちらでの質問の返信は一時停止します。
せっかく答えてくださったのに、すぐに返信できずすみません
前提・実現したいこと
プログラミング作法
問題1-2(21p、新版)の解法
発生している問題・エラーメッセージ
問題の解答がこれで正しいのか自信がないです。
該当のソースコード
次の関数を改良せよという問題です
c
10#include <string.h> 21 int smaller(char *s, char *t){ 32 if (strcmp(s, t) < 1) 43 return 1; 54 else 65 return 0;}
試したこと・解答例
この問題は関数名と実装を適切に作成しようという内容の章で出題された問題です
関数名がsmallerでstrcmpを使用しているから数字の文字列二つ(例("12345","12345678"))を引数にとって、1番目の引数が2番目の引数より小さいかを比較する関数であることがわかります。
http://hitorilife.com/strcmp.php
によれば
int strcmp( const char *str1 , const char *str2 ); の場合
■戻り値:
str1とstr2が等しいならば0、
str1>str2ならば正の値、
str1<str2ならば負の値を返す。
なので前述のコードだとstr1とstr2が等しい場合にも1が返ってくる
"smaller than"は「より小さい」と訳す、これは「未満」とも言い換えられるが、比較対象と自分自身が等しい場合も含める「以下」とは訳せない。
よって二つの引数が等しい場合に0を返すようにに2行目だけ次のように書き換える。
c
1 if (strcmp(s, t) < 0)
補足情報
cのif文の条件分岐では数値の0以外が真になるので1が真、0が偽であることを自明として扱ったが
c
1#define TRUE 1 2#define FALSE 0
みたいな文を付け加えて真偽を明示すべきかということと
関数名smallerの名前の変え方、「引数1番目は引数2番目より短いか」と「引数2番目は引数1番目より短いか」の二重の解釈ができるが、これは引数1番目を主語とするのが普通(?)で、文脈も読み取った解釈だと普通(?)は前者を選択するからsmallerのままでいいのではないかと思えて、自分はあまりこの関数の名前を修正する必要を感じない
それともそのことを明示した関数名にしたほうがいいか。
例えば
「最初の変数が次の変数より小さいか」をgoogle翻訳した
「Whether the first variable is smaller than the next variable」
を圧縮したような変数名すべきか。
その場合どのような変数名にしたらわかりやすく短くできるか
それ以外に自分の気が付いてない改善点や解答にミスがないか
初投稿で勢いで投稿しているところがあるので
おかしいところがあったら指摘してください
回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/02/02 07:08
2018/02/02 07:21
退会済みユーザー
2018/02/02 11:35 編集
2018/02/02 09:15
退会済みユーザー
2018/02/03 06:29 編集
2018/02/05 01:43
2018/02/07 05:28