c言語関数実装問題2


質問です。


最長単語


独自の関数を作成し、文字列の中で最も長い単語を検索することができます.
メインプログラムを作成し、キーボードから1行の文字を入力し、自分で作成した最長単語検索関数を呼び出して、この単語を出力する機能です.
#include<stdio.h>
#include<string.h>
void f_lw(char* s) {
    int l;
    char word[20] ={0};
    l = strlen(s);
    int ml = 0;
    int sp = 0;
    for (int i = 0; i < l - 1; i++) {
        int t = 0;
        if (s[i] != ' ') {
            t = i;
            while (s[i] != ' ') {
                i++;
                if (s[i] == '\n') break;
            }
        }
        if (ml < i - t ){
            ml = i - t;
        sp = t;
        }
    }
    for (int j = 0; j < ml; j++) word[j] = s[sp + j];
    printf("word:%s", word);
}
int main(void) {
    char s[100];
    printf("input str:");
    fgets(s, 100, stdin);
    f_lw(s);
    return 0;
}

質問です。


最長共通サブストリング


1つの関数を記述して、2つの文字列sとtの1つの最も長い共通のサブ列を求めます.
メインプログラムを作成し、2つの文字列を入力し、自分で作成した最長共通サブストリング関数を呼び出し、メインプログラムに最長共通サブストリングを出力します.
#include<stdio.h>
#include<string.h>

char* l_str(char* s, char* t) {
    static char answer[50];
    int ls = strlen(s);
    int lt = strlen(t);
    int a = 0, b = 0;
    int ml = 0, sp = 0, ep = 0;
    for (int i = 0; i < ls - 1; i++) {
        for (int j = 0; j < lt - 1; j++) {
            if (s[i] == t[j]) {
                a = i, b = j;
                while (s[a] ==t[b]){
                    a++;
                    b++;
                    if (s[a] == '\n') break;
                    else if (t[b] == '\n')break;
                }

            }
            if (ml < a - i) {
                ml = a - i;
                sp = i;
                ep = a;
            }
        }
    }
    for (int i = 0; i < a - i + 1; i++) {
        answer[i] = s[sp + i];
    }
    return answer;
}
int main(void) {
    char s[100];
    char t[100];
    printf("input s:");
    fgets(s, 100, stdin);
    fflush(stdin);
    printf("input t:");
    fgets(t, 100, stdin);
    printf("%s", l_str(s, t));
    return 0;

}



質問です。


成績ランキング


中間試験はもうすぐ終わります.先生は学年の成績ランキングを行う必要があります.ランキングのルールは以下の通りです.
中間試験の平均成績をランキングの根拠とする(満点は100点).
学生Aに対して、K人の平均成績がAの平均成績より高い場合、学生Aの学年順位はK+1となる.
学生Aと学生Bの平均成績が同じなら、彼らの順位は同じだ.
いくつかの関数を作成し、それぞれ以下の機能を実現する必要があります.
関数1:N個の学友の学号、姓名、平均成績を入力します
関数2:平均成績が大きい順、小さい順に並べ替え、学号、氏名も調整し、上記の規則に従って順位付けを行ってください
関数3:1つの学友の学号を入力して、半分の検索法でその学友の名前、平均成績、順位などの情報を探し出すことができます
上記の関数を検証するためのプログラムを作成します.
入力、出力フォーマットの要件:
(1)第1の行為は、学生の人数を表す整数N(1(2)ランダムに学生の学号を入力し、その学生の名前、平均成績、ランキングなどの情報を出力してください.学号が存在しない場合は、エラーメッセージを出力します.
(3)入力学号が0000000000である場合,プログラムは終了する.
#include<stdio.h>
#include<string.h>

void input_infor(int n, char number[][11], char name[][15], int score[]) {
    for (int i = 0; i < n; i++) {
        scanf_s("%s %s %d", number[i],11,name[i],15, &score[i]);
    }

}

void sort(int n, int score[], int rank[]) {
    int s[101] = { 0 };
    for (int i = 0; i < n; i++) {
        s[score[i]]++;
    }
    
    for (int i = 0; i < n; i++) {
        int r = 1;
        for (int j = 100; j >= 0; j--) {
            if (j == score[i]) {
                rank[i] = r;
                break;
            }
            if (s[j] != 0) {
                r+=s[j];
            }

        }
    }
}
int search(int n,char s_number[],char name[][15],char number[][11],int score[],int rank[]){
    for (int i = 0; i < n; i++)
    {
        printf("%s %s", number[i], s_number);
        if (strcmp(number[i],s_number)) {
            printf("number:%s name:%s score:%d rank:%d", number[i], name[i], score[i], rank[i]);
            break;
        }
    }
    return 0;

}

int main(void) {
    int n;
    char number[200][11] = { 0,0 };
    char name[200][15] = { 0,0 };
    int score[200] = { 0 };
    int rank[200] = { 0 };
    printf("input n:");
    scanf_s("%d", &n);
    input_infor(n, number, name, score);
    sort(n, score, rank);
    while (1) {
        char s_number[11];

        printf("input search number:");
        scanf_s("%s", s_number,11);
        if (s_number == "0000000000") break;
        search(n,s_number, name,number,score,rank);
       
        
    }
}