こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

C言語でどうしても分からない問題があります。

最近Cに興味を持ちテキストを購入し勉強していますが、どうしても分からない問題があるので教えてください。
テキストには簡単な解説しかなくソースも載っていませんので、よろしくお願いします。

[問題1]
複数の整数(最大100)を平均値に近い順にソートするプログラムを作成せよ。平気値は切り捨てて整数値で求めるものとして、平均値との距離が等しい場合は値の小さい整数が優先される。

[問題2]
入力された二つの文字列を比較するプログラムを作成せよ。大文字小文字は区別しない、タブ・連続したスペースは単独のものと区別しない

以上の2門です。よろしくお願いします

投稿日時 - 2010-01-26 00:43:06

QNo.5623574

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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関数で大文字小文字変換できます。

応用すれば、コピーしなくても比較できます。

投稿日時 - 2010-01-26 23:00:30

あなたにオススメの質問