• 締切済み

プログラミングでわからないところがります。

C言語でどうしても分からない問題があります。 最近Cに興味を持ちテキストを購入し勉強していますが、どうしても分からない問題があるので教えてください。 テキストには簡単な解説しかなくソースも載っていませんので、よろしくお願いします。 [問題1] 複数の整数(最大100)を平均値に近い順にソートするプログラムを作成せよ。平気値は切り捨てて整数値で求めるものとして、平均値との距離が等しい場合は値の小さい整数が優先される。 [問題2] 入力された二つの文字列を比較するプログラムを作成せよ。大文字小文字は区別しない、タブ・連続したスペースは単独のものと区別しない 以上の2門です。よろしくお願いします

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

どんな問題もそうですが、まず、わかるところと、わからないところをはっきりさせましょう。 その過程でわかってくることもあります。 [問題1] 問題は大きく2つに分解できます。 1)複数の整数を用意する 2)平均を求める 3)順番に並び換える(ソート) 1)はこれまでの学習で出てきているのではないでしょうか? 2)もわかりますよね?切り捨ての整数値なので、単純にintを使った計算をすればいいです。 3)は ソートは理解していますか? まだなら、まず、ソートについて学習しなおしてください。 ソートを理解しているのならば、ソートでは、昇順/降順を決めるのに、<や>で配列の2つの数値を大小比較している箇所があったはずです。 この比較方法を換えることで、いろんな順番で並び換えることができます。 問題1の条件でaの方が「小さい」とはどうなるでしょうか? 平均値をmとした場合 ・aとmの距離ってどう書けるでしょうか?同様に bとmの距離は? ・上がわかれば「(aとmの距離)が(bとmの距離)より小さい」というのはどう書くか、わかりますね? ・もう一つ「距離等しいなら値の小さい方」という条件が付きます。 距離が等しいはどう書けますか? 値が小さいとはどう書けますか? 整数の絶対値は abs関数が使えます。(#include <stdlib.h>が必要です) 答えは ( abs(a-m) < abs(b-m ) || ( ( abs(a-m) == abs(b-m ) && ( a < b ) ) です。 そのまま書いてもいいですが、常套手段として、比較結果を返す関数を定義して、ソート部の変更を極力減らす、というのがあります。 よくある比較関数は int mycmp(a,b) (a,bは任意の型)みたいにして a<b なら 負, a==bなら0, a>b なら正を返す、というものです。 a<b → cmp(a,b) < 0 と不等号の向きが一緒なのでわかりやすいです。 [問題2] 単純な文字列比較はできるとします→できないなら、前に出ているはずなので学習しなおしてください 簡単なやりかたとしては、入力された二つの文を一旦別の文字列に変換しながらコピーして、その変換した文字列同士を比較する、というものでしょう。 変換方法は次の通りです。 大文字小文字は区別しない →どちらかに統一する(小文字→大文字 か 大文字→小文字) タブ・連続したスペースは単独のものと区別しない →これがちょっと不明なのですが、タブもスペースもスペースだと解釈する、とします。 一つ前の文字がタブかスペースならなにもせず次の文字へ そうでないならスペースとしてコピーする。 #include <ctype.h>で使えるようになる isupper/islower関数で大文字小文字の判定ができますし、toupper/tolower関数で大文字小文字変換できます。 応用すれば、コピーしなくても比較できます。

関連するQ&A