A. 实验10_9_指针数组进阶

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

已知正整数n,n的范围是1—100。你要从键盘读入n个字符串,每个字符串的长度不确定,但是n个字符串的总长度不超过100000。你要利用字符指针数组将这n个字符串按照ASCII码顺序进行升序排序,然后再打印到屏幕上。字符串中可能包含ASCII码中的任意字符,每个字符串以换行符结束输入。
要求:不允许定义如char str[100][100000];这样的二维数组,因为会极大的浪费内存空间。你应定义char str[100000];这样的存储空间,将n个字符串连续的存储在一维字符空间内,然后将这n个字符串的起始位置保存在字符指针数组中,再进行排序操作。
输入与输出要求:输入一个正整数n,代表待排序字符串的个数,n不超过100,然后是n个字符串,每个字符串的长度不确定,但至少包含1个字符。n个字符串的总长度不会超过100000。输出排序后的n个字符串,每个字符串占一行。

输入样例

4
Where there is hope ,there is a way.
Welcome Beijing.
Nice idea.
Have fun.

输出样例

Have fun.
Nice idea.
Welcome Beijing.
Where there is hope ,there is a way.

示例代码

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

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    f(n);
    //system("pause");
    return 0;
}

void f(int n)
{
    char *strptr[n];
    char x[100001];
    int i, j = 0, jixu;
    for (i = 0; i < n; i++)
    {
        strptr[i] = &x[j];
        char tmp;
        tmp = getchar();
        while (tmp != '\n')
        {
            x[j] = tmp;
            tmp = getchar();
            j++;
        }
        x[j] = '\0';
        j++;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (strcmp(strptr[j], strptr[j + 1]) > 0)
            {
                char *tmp = strptr[j + 1];
                strptr[j + 1] = strptr[j];
                strptr[j] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        puts(strptr[i]);
    }
}

B. 实验10_10_动态数组进阶

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

已知正整数n,n的范围不确定。从键盘读入n个字符串,每个字符串的长度小于1000,要保存到动态数组中。为了能访问到所有的字符串,需要建立一个长度为n的动态指针数组,用于保存n个字符数组的内存地址。在读入每个字符串时,用一个长度为1000的字符数组作为缓冲数组,将字符串读入并求出长度后,再动态分配空间,将缓冲数组中的字符串复制到新分配的动态空间中,并将动态空间的首地址保存到指针数组中。读完n个字符串后你要将这n个字符串按照ASCII码顺序升序排序,然后再打印到屏幕上。字符串中可能包含大小写字母“A-Z”、“a—z”与空格字符。每个字符串以换行符结束输入。
输入与输出要求:输入一个正整数n,代表待排序字符串的个数。然后输入n个字符串,每个字符串至少包含一个字符,占一行。输出排序后的n个字符串,每个字符串占一行。

输入样例

10
Bb b
zzz zzz
aab bbccc
aaabbaaa
abb bbb
ccidfjD
Aidj idj
Ccidf jD
sidfjijE EE
kkkkkk

输出样例

Aidj idj
Bb b
Ccidf jD
aaabbaaa
aab bbccc
abb bbb
ccidfjD
kkkkkk
sidfjijE EE
zzz zzz

示例代码

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

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    f(n);
    //system("pause");
    return 0;
}

void f(int n)
{
    int i, j;
    char *strptr[n];
    for (i = 0; i < n; i++)
    {
        char *tmp = (char *)malloc(sizeof(char) * 1001);
        gets(tmp);
        strptr[i] = tmp;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (strcmp(strptr[j], strptr[j + 1]) > 0)
            {
                char *tmp;
                tmp = strptr[j + 1];
                strptr[j + 1] = strptr[j];
                strptr[j] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        puts(strptr[i]);
    }
    for (i = 0; i < n; i++)
    {
        free(strptr[i]);
    }
}

C. 实验11_1_初识结构

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

学生的属性包括姓名、学号、5门课程的成绩、平均成绩与总成绩。已知一个学生的姓名、学号与5门课程的成绩,你的任务是计算该学生的平均成绩与总成绩,并将该学生的5门课程成绩按照从高到底进行排序,最后将这个同学的完整信息输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。
要求:
1.在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。
2.在对结构变量的成员进行赋值与排序的时候,你要使用“结构变量名+‘.’+结构成员名”这种方式访问变量,如“student.score”;而在输出学生信息时,你要用一个结构指针指向该结构,然后用结构指针访问结构中的变量,即“结构指针名+‘->’+结构成员名”,如“ptr->score”。
输入与输出要求:学生信息的输入按照姓名、学号、5门课程成绩的顺序输入,共占三行。学生信息的输出:姓名占一行;学号占一行;5门成绩中间用空格分开,最后一个成绩后是换行符,从高到底进行排序,占一行;平均成绩与总成绩用空格分隔,占一行,平均成绩保留两位小数。输入具体格式见样例。

输入样例

Liu Mengmeng
0821131666666
88 90 93 91 85

输出样例

Name:Liu Mengmeng
ID:0821131666666
Score:93 91 90 88 85
average:89.40 total:447

示例代码

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

struct student
{
    char name[30];
    char id[30];
    int score[5];
    double average;
    int sum;
};

int main()
{
    struct student x;
    x.sum = 0;
    gets(x.name);
    gets(x.id);
    int i, j;
    for (i = 0; i < 5; i++)
    {
        scanf("%d", &x.score[i]);
        x.sum += x.score[i];
    }
    x.average = (double)x.sum / 5;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5 - i - 1; j++)
        {
            if (x.score[j] < x.score[j + 1])
            {
                int tmp = x.score[j + 1];
                x.score[j + 1] = x.score[j];
                x.score[j] = tmp;
            }
        }
    }
    printf("Name:");
    puts(x.name);
    printf("ID:");
    puts(x.id);
    printf("Score:%d %d %d %d %d\n", x.score[0], x.score[1], x.score[2], x.score[3], x.score[4]);
    printf("average:%.2lf total:%d", x.average, x.sum);
    //system("pause");
    return 0;
}

D. 实验11_2_初识结构数组

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

有n名学生,每个学生的信息包括姓名、学号、5门课程的成绩,平均成绩与总成绩。已知学生的姓名、学号与5门课程的成绩,你的任务是计算每个学生的平均成绩与总成绩,并将它们输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。
要求:在本题中,你要设计一个结构来存储一个学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。然后,你要设计一个结构数组来存储n名学生的信息。
输入与输出要求:输入首先是一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、学号、5门课程成绩的顺序输入,共占三行。 输出n名学生的信息:姓名占一行;学号占一行;5门课程成绩中间用空格分开,最后一个成绩后是换行符,占一行;平均与总成绩用空格分隔,占一行,平均成绩保留两位小数;每名同学的信息后都再输出一个空行。输入具体格式见样例。

输入样例

4
小王同学
0821131699999
87 98 79 90 68
Liu Mengmeng
0821131666666
88 90 93 91 85
Albert Einstein
0821131477777
75 87 100 66 64
Bill Gates
0821131588888
65 58 77 60 61

输出样例

Name:小王同学
ID:0821131699999
Score:87 98 79 90 68
average:84.40 total:422

Name:Liu Mengmeng
ID:0821131666666
Score:88 90 93 91 85
average:89.40 total:447

Name:Albert Einstein
ID:0821131477777
Score:75 87 100 66 64
average:78.40 total:392

Name:Bill Gates
ID:0821131588888
Score:65 58 77 60 61
average:64.20 total:321

示例代码

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

struct student
{
    char name[30];
    char id[30];
    int score[5];
    double average;
    int sum;
};

int main()
{
    int n;
    scanf("%d", &n);
    int ii;
    struct student x[n];
    for (ii = 0; ii < n; ii++)
    {
        getchar();
        x[ii].sum = 0;
        gets(x[ii].name);
        gets(x[ii].id);
        int i, j;
        for (i = 0; i < 5; i++)
        {
            scanf("%d", &x[ii].score[i]);
            x[ii].sum += x[ii].score[i];
        }
        x[ii].average = (double)x[ii].sum / 5;
    }
    for (ii = 0; ii < n; ii++)
    {
        printf("Name:");
        puts(x[ii].name);
        printf("ID:");
        puts(x[ii].id);
        printf("Score:%d %d %d %d %d\n", x[ii].score[0], x[ii].score[1], x[ii].score[2], x[ii].score[3], x[ii].score[4]);
        printf("average:%.2lf total:%d", x[ii].average, x[ii].sum);
        printf("\n\n");
    }
    //system("pause");
    return 0;
}

E. 实验11_3_结构排序

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

有n名学生,每个学生的属性包括姓名与总成绩。已知学生的姓名与总成绩,你的任务是将学生的信息按照以下方式排序:首先比较总成绩,总成绩高的在前面,总成绩低的在后面,当总成绩相同时,你要比较学生的姓名,姓名字典序小的同学在前面,姓名字典序大的同学在后面(ASCII码顺序)。n的范围是1—100;学生的姓名中只能包含大小写字母,不会超过20个字符;总成绩为整数。
要求:在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名,一个整型变量存储总成绩。
输入与输出要求:首先输入一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、总成绩的顺序输入(空格分开),每名学生信息占一行。输出:n名学生的信息,姓名占一行,总成绩占一行,输出顺序要按照题目的要求,每名同学的信息后都再输出一个空行。输入具体格式见样例。

输入样例

4
AlbertEinstein 1328
GeorgeWalkerBush 860
LiuMengmeng 1475
BillGates 1328

输出样例

Name:LiuMengmeng
total:1475

Name:AlbertEinstein
total:1328

Name:BillGates
total:1328

Name:GeorgeWalkerBush
total:860

示例代码

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

struct student
{
    char name[30];
    int score;
};

int main()
{
    int n;
    scanf("%d", &n);
    struct student x[n];
    int i, j;
    for (i = 0; i < n; i++)
    {
        scanf("%s %d", x[i].name, &x[i].score);
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (strcmp(x[j].name, x[j + 1].name) > 0)
            {
                struct student tmp = x[j + 1];
                x[j + 1] = x[j];
                x[j] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (x[j].score < x[j + 1].score)
            {
                struct student tmp = x[j + 1];
                x[j + 1] = x[j];
                x[j] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("Name:%s\ntotal:%d\n\n", x[i].name, x[i].score);
    }
    //system("pause");
    return 0;
}
分类: OJ代码