结构体题目(educoder的练习题)

本关任务:编写一个完整的程序,对输入的nn(n < 100n<100)本书进行排序并输出。

测试:
输入:3
Programming in C
21.5
数据结构与算法
18.5
三体(一)
28.0
输出:
18.5, 数据结构与算法
21.5, Programming in C
28, 三体(一)

测试
输入:5
Programming in C
21.5
数据结构与算法
18.5
三体(一)
28.0
三国志
56.9
第一滴血
22.3
输出:
18.5, 数据结构与算法
21.5, Programming in C
22.3, 第一滴血
28, 三体(一)
56.9, 三国志

#include 
#include 
#include 

// 说明:gets因为安全隐患,已被c11标准遗弃.
// 虽然新的c标准中增加了gets_s, 但目前各编译器支持力度不一.
// 另外的替代方案是fgets

// 但是fgets和gets有些许差异,体现在:
// (1) gets和scanf在接受用户输入时,不会将换行符记录到字符串中,且会自动添加结尾的'\0'
// (2) fgets会将换行符记录到字符串中,不会自动添加结尾的'\0'
// 为方便大家使用,自定义实现own_gets, 接受两个参数,str和num // 内部实现使用fgets,但会将换行符进行处理,替换成'\0'

void own_gets (char *str, int num)
{
     
    if (fgets (str, num, stdin) != 0)
    {
     
        size_t len = strlen (str);
        if (len > 0 && str[len - 1] == '\n')
        {
     
            str[len - 1] = '\0';
        }
    }
}
struct book 
{
     
    char name[100];     //书名
    float price;        //价格
};
int main()
{
     
    float temp;
    int n;     // 书的数量
    struct book bk[100];     // 书的数组
    int i,j,k;
    scanf("%d", &n);

    for(i=0; i<n; i++)
    {
     
        char c;
        scanf("%c", &c); ///消除输入缓冲区里的换行符
        own_gets(bk[i].name, 100);
        scanf("%f", &bk[i].price);
    } 
// 书籍排序,首先是要对价钱进行排序,在此基础上相同价钱的就调整书名
for(i=0;i<n;i++)
{
        
    for(j=i+1;j<n;j++)
    {
     
        char x[100];
            if((bk[j].price)<=(bk[i].price))  //需考虑书本价钱一样的情况。
            {
        
                temp = bk[j].price;
                bk[j].price = bk[i].price;
                bk[i].price = temp;
            for(k=0;k<100;k++)
                {
     
                 x[k] = bk[j].name[k];
                 bk[j].name[k] = bk[i].name[k];
                 bk[i].name[k] = x[k];
                }
            }
     }
}
    // 输出
    for(i=0; i<n; i++)
    {
     
        ///此处使用%g控制输出
        printf("%g, %s\n",bk[i].price, bk[i].name );
    }
    return 0;
}

跟朋友们分享下这个小程序。本人大一生,初学c语言。如果朋友们有更好的想法,欢迎和我交流哦~

你可能感兴趣的:(结构体,c语言)