大学の課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
p4rom

大学の課題

#1

投稿記事 by p4rom » 1年前

[1.1]
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:


#include<stdio.h>
#define N 328

void main(void) {
    int i, input, rank, num, count,n;
	int* b[N];
    static int a[N] = { 99, 21, 10, 94, 56, 3, 44, 12, 51, 33, 84, 81, 36, 99, 11, 76, 26, 99, 50, 51, 69, 98, 4, 83, 13, 21, 30, 23, 93, 49, 40, 51, 58, 59, 83, 68, 7, 80, 85, 17, 33, 58, 78, 2, 99, 20, 87, 5, 100, 97, 54, 95, 57, 48, 2, 52, 81, 18, 29, 10, 50, 10, 67, 5, 56, 15, 57, 41, 100, 19, 30, 95, 2, 78, 70, 81, 91, 96, 69, 22, 96, 46, 2, 97, 26, 22, 75, 73, 8, 33, 67, 94, 35, 25, 72, 84, 63, 62, 44, 88, 28, 92, 62, 46, 12, 86, 56, 89, 36, 94, 7, 94, 94, 79, 31, 45, 1, 69, 67, 49, 70, 13, 7, 27, 1, 33, 34, 4, 42, 87, 37, 33, 60, 16, 38, 87, 81, 20, 4, 37, 6, 85, 54, 79, 69, 37, 60, 23, 98, 57, 97, 68, 68, 44, 58, 20, 62, 22, 22, 66, 25, 8, 6, 19, 66, 21, 65, 54, 28, 79, 98, 79, 17, 46, 23, 57, 72, 88, 48, 38, 83, 29, 70, 65, 54, 65, 61, 34, 76, 87, 12, 51, 66, 24, 35, 3, 45, 84, 39, 96, 72, 78, 80, 78, 0, 40, 57, 44, 12, 42, 86, 77, 57, 8, 7, 73, 57, 90, 4, 26, 57, 39, 75, 45, 95, 41, 34, 27, 49, 61, 83, 14, 77, 95, 30, 1, 81, 18, 44, 27, 39, 98, 44, 45, 16, 1, 67, 37, 65, 58, 63, 86, 1, 95, 67, 22, 85, 24, 2, 45, 85, 100, 12, 96, 16, 85, 6, 45, 26, 16, 80, 37, 52, 35, 4, 89, 87, 97, 68, 75, 6, 56, 86, 70, 64, 41, 98, 44, 49, 16, 5, 89, 59, 72, 10, 25, 92, 98, 70, 36, 39, 39, 77, 9, 58, 95, 37, 49, 90, 90, 33, 89, 86, 44, 21, 95, 0, 99, 78, 1, 16, 77, 29, 85, 55, 83, 94, -999 };

    printf_s("検索する順位を入力してください\n");
    scanf_s("%d", &rank);
    printf_s("全327人中%d位の該当者は\n",rank);

	//番号づけ
	for (int i = 0; i < rank; i++) 
	{
		b[i] = &a[0];
		for (int j = 0; j < i; j++)
		{
			for (int* p = a; *p != -999; p++) 
			{
				if (b[j] != p)
					b[i] = p;
			}
		}
		//同じ値を格納しないように
		for (int* p = a; *p != -999; ++p) 
		{
			if (*b[i] < *p) {
				int dabli = 0;
				for (int j = 0; j < i; ++j) 
				{
					if (b[j] == p)
						dabli = 1;
				}
				if (!dabli)
					b[i] = p;
			}
		}
	}
	//降順ソート
	rank = 1;
	for (int i = 0; i < rank; i++)
	{
		if (i != 0 && *b[i - 1] != *b[i])
			rank = i + 1;
	}
}
 [1.4] 今何がわからないのか、知りたいのか
大学の課題の問題文です。
上記のデータの中から入力した順位になる番号を検索し,試行回数(検索に要したループ数),データが何番目かを求めるプログラムを作成せよ.また,どの場合でも試行回数は全データ数の半分未満にし,見つからない場合でも結果を表示させること.
<stdio.h>のみだそうです。
またヒントとして二分探索法を用いるみたいなことが書いてありました。


完成すると例えばscanf_sで1を入力したとき

ー----------------
検索する順位を入力してください
1
全327人中1位の該当者は
49番
69番
262番
ー----------------
該当する順位がないとき(今回は2)
ー----------------
検索する順位を入力してください
2
該当する順位は存在しません(検索回数8回)
ー----------------
となるそうです


[2] 環境  
 [2.1] OS : windous

[3] その他
 ・どの程度C言語を理解しているか
簡単な文字を出力させる程度で、あとはテキストなどをみてやっていてあまり、理解はできていないです。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#2

投稿記事 by usao » 1年前

> [1.4] 今何がわからないのか、知りたいのか

が述べられていないように見えます.
(単に,問題文を書いているだけであり,具体的に何が 不明点/困っている事柄 なのかは書かれていないように見受ける)

また,状況に関する確認ですが,

> [1.2] どのように取り組んだか(プログラムコードがある場合記載)

のところで提示されたコードの中で【あなたが取り組んだところ】とはどこなのですか?

提示コード全てですか?(すなわち,問題文は データ値=配列aの内容 しか指定していない,という話?)
それとも,何らかの未完成のコードが用意されていてそこから出発せよ的な話ですか?(…という場合もあるかな,と思ったので「あなたが取り組んだ範囲はどこか?」と問うている)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#3

投稿記事 by usao » 1年前

あと

> 試行回数(検索に要したループ数)

というのは,一体何のことなのか…?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#4

投稿記事 by usao » 1年前

見た感じ,データ値の有効な値域に関する前提が存在する物と思われ,その点も明示されると良いのかもしれません.
(0~100 とかそんな値? とりあえず -999 という値が有効なデータ値ではないものとされているようではあるが)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#5

投稿記事 by usao » 1年前

> 試行回数(検索に要したループ数)

について:
例えば仮にデータの有効値が 0~100 なのだとして…

「各データ値が何個存在したか?」を数えるための 101 個のカウンタを(配列として)用意することを考えるとしたら,
このカウンタ群の値を確定させる処理の実装としては,データ値たる配列 a に関するループを書くことになるだろう.
for( aの全要素 ){ ++カウンタ配列のデータ値番目の要素; }
みたいな.

この場合,このループのことを 何回 と数えるのだろうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#6

投稿記事 by usao » 1年前

「ループ回数」と言われたならば,
普通は(?)上記のループに関しては,データの個数がNならば「N回」と言うと思う(そしたらこの時点でもう指定回数を超えてしまっているからNGとなるのかな?).

でも
「ループ数」と言われると,これは何のことなのか…?
日本語的に素直に捉えると 【ループ の 個数】 という意味になりそうだが,それだとその個数を制限するというのは意味不明な指定と思えるし…

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

Re: 大学の課題

#7

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

もしかして、検索する順位を読み込む前に「検索に要したループ数」に含まれない前処理をすることが許されるのかな…?

(そうでないと、そもそもデータがソートされていないので二分探索法は使えないはずですし…)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 大学の課題

#8

投稿記事 by usao » 1年前

問題文の日本語が不自由すぎてイミフ! というパターンは困りますね.

まぁ,「データ数の半分」と「二分探索法」という話から,なんとなく二分探索の探索処理の回数的な事柄を示しているんだろうな的な気はしないでもないですが,不明瞭すぎる.

返信

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