dポイントプレゼントキャンペーン実施中!

static int a[] = { 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 };

↓問題です
https://drive.google.com/file/d/1-AvNNIoOZ8s9hK3 …

質問者からの補足コメント

  • 標準関数のみ使用
    (1) 配列データの作成
    順位・番号・成績をまとめるため全てのデータを格納できる配列を用意すること.
    はじめの段階では全データ数が分かっていないため,以下のように十分な配列を用意すること.
    int b[1000][3]配列番号 を iとした場合, b[i][0]を順位, b[i][1]を番号, b[i][2]を成績とすると分かりやすい.
    (2) 全データ数を数えるプログラム
    総数を数えるためにはwhile文を用いてカウントを数えると良い. .-999は終了を表す値なので求めるのは 1個前の 94までとなる.

      補足日時:2022/01/13 17:37

A 回答 (3件)

#include <stdio.h>


#include <stdlib.h>
#include <stdbool.h>

typedef struct _DATA {
 int num;
 int id;
 int score;
} DATA;

int cmpDescScore(const void* n1, const void* n2) {
 if (((DATA*)n1)->score > ((DATA*)n2)->score) {
  return -1;
 } else if (((DATA*)n1)->score < ((DATA*)n2)->score) {
  return 1;
 } else {
  return 0;
 }
}

int main(void) {
 static int a[] = { 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 };
 int n = sizeof(a)/sizeof(*a) - 1;
 DATA data[n];
 for (int i = 0; i < n; i++) {
  data[i].id = i + 1;
  data[i].score = a[i];
 }
 qsort(data, sizeof(data)/sizeof(*data), sizeof(DATA), cmpDescScore);
 /* ここから① */
 char s[5];
 puts("上位何名までを確認しますか?(キーボードで入力)");
 scanf("%4s%*[^\n]", s);
 getchar();
 int m = strtol(s, NULL, 10);
 printf("成績上位%d位まで(全%d名中)\n順位\t番号\t成績\n", m, n);
 int save = data[0].score;
 int no = 1;
 for(int i = 0; i < n; i++) {
  no = (save == data[i].score ? no : i + 1);
  data[i].num = no;
  if (i < m) {
   printf("%3d\t%3d\t%3d\n", data[i].num, data[i].id, data[i].score);
  }
  save = data[i].score;
 }
 /* ここから② */
 puts("検索する順位を入力してください(キーボードで入力)");
 scanf("%4s%*[^\n]", s);
 getchar();
 m = strtol(s, NULL, 10);
 bool flag = false;
 for (int i = 0; i < n; i++) {
  if (m == data[i].num) {
   flag = true;
   break;
  }
 }
 if (flag) {
  printf("全%d中%d位の該当者は\n", n , m);
  for (int i = 0; i < n; i++) {
   if (m == data[i].num) {
    printf("%d番\n", data[i].id);
   }
  }
 } else {
  /* ソート済みデータに対しては試行(ループ)回数は高々1回 */
  /* (どういう検索を想定してるか仕様が不確定) */
  puts("該当する順位は存在しません(検索回数1回)");
 }
 return EXIT_SUCCESS;
}
    • good
    • 0

本当に「標準関数のみ」にしちゃうと main も使えないので何もできない.



さておき, 何がわからない? どこまでできていて, どこで何に困っている? 自分で考えてる?
    • good
    • 0

malloc関数は使用して良いのでしょうか。


試行回数は全データ数の半分未満という制約がありますが、
テーブルを複数作成すれば1発で完了も考えられます。
試行回数は全データ数の半分未満というのは、何か特定のテーブルに対してのことなのでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!