|
ご指摘ありがとうございます。
>関数の設計を間違えているのですから,関数のインターフェースを変更すべきです。
>根本的に「できない」ものはいくら頑張っても「できない」ままです。
何かうまくいく方法があるのかと思ってお聞きしたのですが、やはり駄目なものは駄目なのですか。
FILEポインタを関数の引数に加えて、リダイレクトを使わないという方向で何とか許してもらおうかと思います。(課題より引数の数が増えてしまいましたが)
ということで私がコレで許してもらおうかと思ってるソースです。最後なので長いですがマナー(?)として張ります。
#include<stdio.h>
#include<stdlib.h>
#define N 2500
struct student{
int num;
char name[18];
int score;
}A[N];
void exe00(struct student A[],int n,FILE *fp); /* 引数が増えてしまいました */
void exe03(struct student A[],int n);
main(int argc,char *argv[])
{
int n;
FILE *fp;
fp=fopen(argv[1],"r");
printf("\nデータ数nを入力せよ\nn=");
scanf("%d",&n);
exe00(A,n,fp);
printf("\nデータを単純選択整列(得点で降順)\n");
printf("同点の場合は学籍番号順(昇順)\n\n");
printf("以下単純選択整列の様子を示す\n\n");
exe03(A,n);
return 0;
}
void exe00(struct student A[],int n,FILE *fp)
{
int i,j;
char a[29],b[4],c[3];
for(i=0;i<n;i++){
fgets(a,30,fp);
for(j=0;j<4;j++)
b[j]=a[j];
A[i].num=atoi(b);
for(j=5;j<23;j++)
A[i].name[j-5]=a[j];
for(j=24;j<27;j++)
c[j-24]=a[j];
A[i].score=atoi(c);
}
for(i=0;i<n;i++)
printf("%4d %18s %3d\n",A[i].num,A[i].name,A[i].score);
}
void exe03(struct student A[],int n)
{
int i,j,hikaku=0,irekae=0;
char a[N]="|12345678",b;
struct student B;
puts(a);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++,hikaku++)
if(A[j].score>A[i].score){
B=A[i];
A[i]=A[j];
A[j]=B;
irekae++;
b=a[i+1];
a[i+1]=a[j+1];
a[j+1]=b;
printf("%s %d番と%d番のデータを入れ換え\n",a,A[i].num,A[j].num);
}
else if(A[j].score==A[i].score&&A[j].num<A[i].num){
B=A[i];
A[i]=A[j];
A[j]=B;
irekae++;
b=a[i+1];
a[i+1]=a[j+1];
a[j+1]=b;
printf("%s %d番と%d番のデータを入れ換え\n",a,A[i].num,A[j].num);
}
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
puts(a);
}
putchar('\n');
for(i=0;i<n;i++)
printf("%4d %18s %3d\n",A[i].num,A[i].name,A[i].score);
printf("\n●比較回数=%d\n●入れ換え回数=%d\n",hikaku,irekae);
}
次は入力ファイルの一つです。一行に一人の情報が記述されており、各行は
1〜4 文字目 学籍番号(右詰め)
5文字目 空白
6〜23文字目 氏名(左詰め)
24文字目 空白
25〜27文字目 成績(右詰め)
となっています。
1 安室_奈美恵 56
2 一色_紗英 82
3 小沢_真珠 56
4 菅野_美穂 56
5 佐藤_藍子 82
6 鈴木_沙理奈 26
7 松_たか子 100
8 山口_リエ 90
ソースは突っ込みどころ満載かも知れませんがw
レス下さったお二方ともありがとうございましたm(_ _)m
|