c언어 함수구현문제2

문제7

最长单词

编写一个自己的函数,能够将一个字符串中最长的单词查找出来。
编写主程序,功能是能够由键盘输入一行字符,并能调用自己编写的最长单词查找函数,输出这个单词。

#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;
}

문제8

最长公共子串

编写一个函数,求两个字符串s和t的一个最长公共子串。
编写主程序,输入两个字符串,调用自己编写的最长公共子串函数,在主程序中输出最长公共子串。

#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;

}


문제9

成绩排名

期中考试快要结束了,老师需要进行年级成绩排名。排名的规则如下:
以期中考试的平均成绩为排名依据(满分为100分);
对学生A,如果一共有K个学生的平均成绩比A的平均成绩高,则学生A的年级排名为K+1;
如果学生A和学生B的平均成绩相同,则他们的排名相同。
要求编写几个函数,分别实现以下的功能:
函数1:输入N个同学的学号、姓名、平均成绩
函数2:按平均成绩由大到小的顺序进行排序,学号、姓名也随之调整,并请按照上述规则进行排名
函数3:输入一个同学的学号,能够用折半查找法找出该同学的姓名、平均成绩、排名等信息
编写一个程序来使用验证上述函数。
输入、输出格式要求:
(1) 第一行为一个整数N(1 < N < 200),表示学生的人数。随后有N行,每行有两个非负整数和字符串描述一个学生的信息,依次为学号、姓名和平均成绩。
(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);
       
        
    }
}

좋은 웹페이지 즐겨찾기