本关任务:编写一个完整的程序,对输入的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 <string.h>
#include <stdlib.h>
#include <stdio.h>
// 说明: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语言。如果朋友们有更好的想法,欢迎和我交流哦~