0

私は C を初めて使用しますが、両方のスキャン関数で型の競合エラーが発生する理由がわかりません。私のコードを改善するための解決策または提案をいただければ幸いです。割り当て方向を以下に示します。

あなたのプログラムは、臓器の順番待ちリストと、提供のために受け取った一連の臓器で構成されるファイルの情報を読み込む必要があります。受け取った臓器ごとに、プログラムは人の名前と受け取った臓器を出力する必要があります。オルガンは、オルガンに匹敵する、最も長く順番待ちリストに載っている人に渡されるべきです。この割り当てでは、ドナーの臓器が同じであり、ドナーの血液型がレシピエントと同じである場合に一致が発生します。臓器の一致が見つかったら、再度一致させるべきではありません。

入力ファイル形式

入力ファイルの最初の行には、待機リストにある臓器の数を表す単一の正の整数 n (n ≤ 120000) が含まれます。次の n 行には、それぞれ 1 つの臓器に関する情報が含まれます。これらの各行には、人の名前、交換が必要な臓器、血液型、臓器データベースに追加された日付、および臓器データベースに追加された時刻が含まれます。これらの各項目は、スペースで区切られます。すべての名前は文字とアンダースコアのみで構成され、すべての臓器名は小文字で比較され、すべての血液型は前述の 8 つの文字列のいずれかになり、すべての日付は m/d/y の形式になります。ここで、m, d 、および +y は、患者が臓器提供リスト (この特定の臓器) に追加された年月日を表します。ついに、時刻は hr:min の形式になります。ここで、hr(0 ≤ hr ≤ 23) と min(0 ≤ min ≤ 59) は、患者が臓器提供リストに追加された時間と分を表します。同じ日時に 2 つのオルガンがリストに追加されていないこと、および名前またはオルガン名が 19 文字を超えないことが保証されます。

入力ファイルの次の行 (行番号 n+2) には、特定の期間に受け取った臓器の数を表す 1 つの正の整数 k (k ≤ 1000) が含まれます。次の k 行には、受け取った臓器に関する情報が、受け取った順に含まれます。これらの各行には、スペースで区切られた 2 つの文字列 (臓器の名前とドナーの血液型) が含まれます。これらは両方とも、前述の仕様に準拠します。

出力仕様

受信した臓器ごとに 1 行を出力します。まだ臓器を受け取っていない一致する受信者がデータベースに存在する場合は、受信者の名前を出力し、その後に受信した臓器を出力します。データベースに一致するものが存在しない場合は、次を 1 行で出力します。

No match found

サンプル出力:

Adam_Smith kidney
Jessica_Arte liver
Shelly_Zenith liver
No match found
No match found
John_Lynch kidney

サンプル入力:

10
John_Lynch kidney A- 12/13/2007 14:43
Beth_Silva lung O+ 1/23/2009 13:10
Adam_Smith kidney A- 12/13/2007 9:59
Jenn_Gray liver AB+ 9/9/1999 1:23
Sylvia_Maria lung O+ 1/24/2009 0:09
Sean_Stark heart AB- 8/23/2000 9:13
Shelly_Zenith liver AB- 9/10/1999 1:13
Jessica_Arte liver AB+ 8/31/1999 23:38
Bill_Muse heart O+ 3/23/2013 3:12
Samantha_Bogedon intestine B- 6/30/2012 17:08
6
kidney A-
liver AB+
liver AB-
heart O-
intestine A+
kidney A-

コード:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 20
#define BLOODTYPESIZE 4

//Structure to store month day and year
typedef struct {
    int month;
    int day;
    int year;
} dateT;
// Structure to stores hour and minute
typedef struct {
    int hour;
    int minute;
} timeT;
// structure to store name organname bloodtype dateadded time added and whether or not it was received
typedef struct {
    char name[SIZE];
    char organname[SIZE];
    char bloodtype[BLOODTYPESIZE];
    dateT dateAdded;
    timeT timeAdded;
    int received;
} organT;

int main(){
    //Declare variables
    int numberOfOrgans,x,numberOfDonors,y,match,possible;
// Create pointer to structure
organT* organ;
scanf("%d",&numberOfOrgans);
organ = (organT *)malloc(numberOfOrgans*sizeof(organT));
scanOrgans(numberOfOrgans,organ);
scanf("%d",&numberOfDonors);
organT* donors;
donors = (organT *)malloc(numberOfDonors*sizeof(organT));
scanDonors(numberOfDonors, donors);
for(y=0;y<numberOfDonors;y++){
    match=-1;
    possible=-1;
    for(x=0;x<numberOfOrgans;x++){
        if((strcmp(organ[x].organname, donors[y].organname)==0) && (strcmp(organ[x].bloodtype, donors[y].bloodtype)==0) && (organ[x].received!=1)){
           match++;
            if (match>0)
                possible=organCompare(organ, x, possible);
            else if (match==0)
                possible=x;

            }
        else continue;
    }
    if (possible>-1){
        organ[possible].received=1;
        printf("%s %s\n",organ[possible].name, organ[possible].organname);
    }
    else
        printf("No match found\n");
        free(organ);
        free(donors);
    }
}
void scanOrgans(int x,organT* organ){

    int i;
    char temp[256];

    for(i=0;i<x;i++){

        scanf("%s",&organ[i].name);
        scanf("%s",&organ[i].organname);
        scanf("%s",&organ[i].bloodtype);
        scanf("%s",&temp);
        sscanf(temp,"%d/%d/%d",&organ[i].dateAdded.month,&organ[i].dateAdded.day,&organ[i].dateAdded.year);
        scanf("%s",&temp);
        sscanf(temp,"%d:%d",&organ[i].timeAdded.hour,&organ[i].timeAdded.minute);
   }
}
void scanDonors(int x, organT* donors ){
    int i;
    for(i=0;i<x;i++){
    scanf("%s%s", &donors[i].organname, &donors[i].bloodtype);
    }
}

int organCompare(organT* organ, int x, int y){
    if (organ[x].dateAdded.year<organ[y].dateAdded.year)
        return x;
    else if(organ[x].dateAdded.year==organ[y].dateAdded.year){
        if (organ[x].dateAdded.month<organ[y].dateAdded.month)
            return x;
        else if(organ[x].dateAdded.month==organ[y].dateAdded.month){
            if (organ[x].dateAdded.day<organ[y].dateAdded.day)
            return x;
            else if (organ[x].dateAdded.day==organ[y].dateAdded.day){
                if (organ[x].timeAdded.hour<organ[y].timeAdded.hour)
                return x;
                else if (organ[x].timeAdded.hour==organ[y].timeAdded.hour){
                    if (organ[x].timeAdded.minute<organ[y].timeAdded.minute)
                    return x;
                    else return y;
                    }
                else return y;
            }
            else return y;

        }
        else return y;
        }
    else return y;

    }
4

4 に答える 4

2

これはあなたの問題ではありませんが、コンパレーターの構造を避けてください。代わりにこれを試してください:

int organCompare(organT* organ, int x, int y)
{
    if (organ[x].dateAdded.year < organ[y].dateAdded.year)
        return x;
    else if (organ[x].dateAdded.year > organ[y].dateAdded.year)
        return y;
    else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
        return x;
    else if (organ[x].dateAdded.month < organ[y].dateAdded.month)
        return y;
    else if (organ[x].dateAdded.day < organ[y].dateAdded.day)
        return x;
    else if (organ[x].dateAdded.day > organ[y].dateAdded.day)
        return y;
    else if (organ[x].timeAdded.hour < organ[y].timeAdded.hour)
        return x;
    else if (organ[x].timeAdded.hour > organ[y].timeAdded.hour)
        return y;
    else if (organ[x].timeAdded.minute < organ[y].timeAdded.minute)
        return x;
    else
        return y;
}
于 2013-09-09T21:26:51.073 に答える
2

次の 3 行を の前に追加しますint main()

 #include <string.h>
 void scanOrgans(int x, organT* organ);  
 void scanDonors(int x, organT* donors );
 int organCompare(organT* organ, int x, int y);
于 2013-09-09T21:18:07.273 に答える
2

を使用scanfする場合は、既にポインターがあるため、char *通常は必要ありません。&だから変更:

    scanf("%s",&organ[i].name);
    scanf("%s",&organ[i].organname);
    scanf("%s",&organ[i].bloodtype);

に:

    scanf("%s",organ[i].name);
    scanf("%s",organ[i].organname);
    scanf("%s",organ[i].bloodtype);

また、それ自体はバグではありませんが、C では malloc の結果をキャストしてはいけません。

donors = (organT *)malloc(numberOfDonors*sizeof(organT));

に:

donors = malloc(numberOfDonors*sizeof(organT));
于 2013-09-09T21:20:06.713 に答える
1

関数プロトタイプを介して明示的に定義していない関数を使用しているため、コンパイラは文句を言います。C リファレンスを職場に残したので、正確な段落を見つけることはできませんが、コンパイラは関数プロトタイプを推測し、それが「競合する型」の警告またはエラーの原因となっています。intメモリから、何も指定しない場合、C は関数が を返すと想定します。

それが私の最善の推測です。David Schwartz の修正が機能する場合、それが原因であると確信できます。

于 2013-09-09T21:37:12.783 に答える