0

整数配列で最小値を見つけようとしています。次に、そのスコアを持っている人の名前でその値を表示します。どの値が最も低いかを見つけて、プレーヤー 1 やプレーヤー 2 のようなインデックスで表示できますが、そのインデックスの代わりに名前を付けることはできません。

#include <string.h>
#include <stdio.h>
#include <string.h>
#define LEN_NAME 34
#define NUM_NAMES 3
void lowest(int array[], char *fullName, int elements);
int main (void) {
    int scores[NUM_NAMES] = { 230,330,423};
    char firstName[NUM_NAMES][LEN_NAME] = {"john","james","mario"};
    char lastName[NUM_NAMES][LEN_NAME] = {"goirgi", "edison", "luca"};
    char *fullName[NUM_NAMES][LEN_NAME];
    int i;
    for (i=0; i < NUM_NAMES; i++) {
        strcpy(fullName[i], firstName[i]);
        strcat(fullName[i], " " );
        strcat(fullName[i], lastName[i]);
        printf("Your scores is %d with your full name is %s.\n",scores[i], fullName[i]);
    }

    lowest(scores,*fullName, NUM_NAMES);
    return 0;
}

void lowest (int array[], char *fullName, int elements) {
    int i,small = array[0], j;
    for (i=0; i< elements; i++) {
        if (array[i] < small) {
            small = array[i];
            j = i;
        }
    }
    printf("The lowest scored %d with score %d.\n", j , small);
}
4

3 に答える 3

1

firstName、lastName、および fullName は、(LEN_NAME x NUM_NAMES) 行列として扱われる連続したメモリ領域です。それらを周りに渡すとき、呼び出された関数は行の長さ (LEN_NAME) を知る必要があるため、i( fullName[i]) で添え字を付けると計算が行われますfullName + (i * LEN_NAME)(ここで、fullName はメモリ領域の開始アドレスです)。 i 番目の名前の先頭。

#include <string.h>
#include <stdio.h>
#include <string.h>
#define LEN_NAME 34
#define NUM_NAMES 3
void lowest(int array[], char fullName[][LEN_NAME], int elements);
int main(void)
{
    int scores[NUM_NAMES] = { 230, 330, 423 };
    char firstName[NUM_NAMES][LEN_NAME] = { "john", "james", "mario" };
    char lastName[NUM_NAMES][LEN_NAME] = { "goirgi", "edison", "luca" };
    char fullName[NUM_NAMES][LEN_NAME];
    int i;
    for (i = 0; i < NUM_NAMES; i++) {
        strcpy(fullName[i], firstName[i]);
        strcat(fullName[i], " ");
        strcat(fullName[i], lastName[i]);
        printf("Your scores is %d with your full name is %s.\n", scores[i],
               fullName[i]);
    }

    lowest(scores, fullName, NUM_NAMES);
    return 0;
}

void lowest(int array[], char fullName[][LEN_NAME], int elements)
{
    int i, small = array[0], j = 0;
    for (i = 0; i < elements; i++) {
        if (array[i] < small) {
            small = array[i];
            j = i;
        }
    }
    printf("%s scored %d.\n", fullName[j], small);
}

通常、この状況では文字へのポインターの配列を作成する方が慣用的です。

char *fullName[NUM_NAMES];
fullName[0] = malloc(LEN_NAME);
// ...

それらの長さを記憶するか、NULLポインターを最後の位置に置くことができます。これを行う場合は、次のように宣言する必要がありますlowest

void lowest(int array[], char *fullName[], int elements);
于 2013-06-25T18:36:32.037 に答える
0

簡単な解決策は、数値の配列と名前の配列を渡し、リストのインデックスが一致していることを確認することです。最小値のインデックスを見つけたら、名前のリストにインデックスを付けて、その名前を表示できます。

于 2013-06-25T18:35:28.097 に答える
0

これはタイプミスだと思います:

char *fullName[NUM_NAMES][LEN_NAME];
     ^

ここでは、ポインターの 2 次元配列を宣言していますが、ポインターは何も指していません。

于 2013-06-25T18:35:55.410 に答える