「ブロック機能」のリニューアルについて

パターン1
#include <stdio.h> 
#include <string.h>

struct student{
char number[50];
int array;
int score;
};

int main(void)
{
struct student data[1000];
int num = 0;
scanf("%d", &num);
for(int i = 0; i < num; i++){
scanf("%c",data[i].number);
scanf("%d",&data[i].array);
scanf("%d", &data[i].score);
}

for(int i = 0; i < num; i++){
for(int j = 0; j < num - 1 - i; j++){
if(data[j].array > data[j+1].array){
int temp = data[j+1].array;
data[j+1].array = data[j].array;
data[j].array = temp;

int flag = data[j+1].score;
data[j+1].score = data[j].score;
data[j].score = flag;
}
}
}
for(int i = 0; i < num; i++){
printf("%c%d\n%d\n",data[i].number,data[i].array,data[i].score);
}
return 0;
}
-----------------------------------
パターン2

#include <stdio.h>
#include <string.h>

struct student{
char id[50];
int score;
};

int main(void)
{
struct student data[1000];
int num = 0;
scanf("%d", &num);
for(int i = 0; i < num; i++){
scanf("%c",data[i].id);
scanf("%d", &data[i].score);
}

入力
3
D123456
50
D034567
60
D101012
90

出力
D034567
60
D101012
90
D123456
50

このように最初に何セット入力するかを入力
その後最初がアルファベット1文字で始まる(全てD)文字列を入力ご改行して点数を入力。
そして、文字列の中から数字だけを取り出し比較。数字が小さい方から並べ替える。
最後並べ替えた文字列とセットの点数を出力。

パターン1はDだけを入力できる配列と数字だけ入力できる配列を用意して、最初から数字は数字として扱えるようにしている。
パターン2はアルファベットと数字を含む文字列として入力しその後数字だけ取り出し比較したい。
どちらも試しましたが、うまく行きませんでした。どちらのパターンでもいいので教えてください。

教えて!goo グレード

A 回答 (3件)

参考資料


https://www.sejuku.net/blog/49199
です。
    • good
    • 0

#include <stdio.h>


#include <string.h>
#include <stdlib.h>

typedef struct student{
 char id[50];
 int score;
}Student_t;

int cmpStudentID(const void* n1, const void* n2) {
 if (strcoll(((Student_t*)n1)->id, (((Student_t*)n2)->id)) > 0) {
  return 1;
 } else if (strcoll(((Student_t*)n1)->id, (((Student_t*)n2)->id)) < 0) {
  return -1;
 } else {
  return 0;
 }
}

int main(void)
{
 Student_t data[1000];
 char s[50];
 int num = 0;
 scanf("%49s%*[^\n]", s);
 getchar();
 num = strtol(s, NULL, 10);
 for(int i = 0; i < num; i++){
  scanf("%49s%*[^\n]", s);
  getchar();
  strcpy(data[i].id, s);
  scanf("%49s%*[^\n]", s);
  getchar();
  data[i].score = strtol(s, NULL, 10);
 }
 qsort(data, num, sizeof(Student_t), cmpStudentID);
 for(int i = 0; i < num; i++) {
  printf("%s\n%d\n", data[i].id, data[i].score);
 }
 return EXIT_SUCCESS;
}
    • good
    • 0

並べ替えるとき、qsort関数を使うのはだめですか。

    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング