【总结】PTA习题9-4查找书籍 (20分)(有关scanf)

【总结】PTA习题9-4

9-49-4题面

在习题9-4中,明显要用struct结构去写。第一次写的代码如下:

#include <stdio.h>
struct BOOK{
	char name[35];
	double price;
};

void sort(BOOK *p,int n);

int main (void){
	struct BOOK book[10];
	int i,n;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		int k=0;
		while( (book[i].name[k] = getchar() ) != '\n' ) k++;             /*scanf中的%s遇到空格结束了*/
		book[i].name[k] = '\0';
		scanf("%lf",&book[i].price);
	}
	{
	printf("##########\n%s	%.2f\n",book[0].name,book[0].price);
	printf("%s	%.2f\n",book[1].name,book[1].price);
	printf("%s	%.2f\n",book[2].name,book[2].price);
	printf("##########\n") ;
	}                             /*调试程序段*/
	struct BOOK *p = &book[0];
	sort(p,n);
	
	return 0;
	
} 

void sort(BOOK *p,int n){
	int i,min,max,index_min,index_max;
	min=max=p[0].price;
	index_max=index_min=0;
	for(i=0;i<n;i++){
		if(p[i].price>max){
			max=p[i].price;
			index_max=i;
		}
		if(p[i].price<min){
			min=p[i].price;
			index_min=i;
		}
	}
	
	printf("%.2f, %s\n",p[index_max].price,p[index_max].name);
	printf("%.2f, %s\n",p[index_min].price,p[index_min].name);
}

但是在输入的时候会出现问题。在读入n之后,缓冲区还有个\n没有读入,这导致getchar第一个得到的就是\n。所以说读入的时候每次读入价格之后也会出现一个\n。所以出现了如下情况。
在这里插入图片描述
本来我以为是typedef出了问题,但是不用typedef后依旧出现了一样的问题,所以问题不在typedef上。
实际上是第一次的getchar得到的是’\n’所以直接跳出while循环,然后scanf("%d",&n)也没有得到正确的值。所以通过一次scanf("\n")来消除缓冲区内的’\0’。于是修改代码如下:

#include <stdio.h>
#include <string.h>
typedef struct BOOK{
	char name[35];
	double price;
}NEW;
void sort(NEW *p,int n);

int main (void){
	int n,i;
	NEW a[10];
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("\n");          /*非常重要*/
		gets(a[i].name);
		scanf("%lf",&a[i].price);
	}
	
	NEW *p = &a[0];
	sort(p,n);
	return 0;
}

void sort(NEW *p,int n){
	int i,min,max,index_min,index_max;
	min=max=p[0].price;
	index_max=index_min=0;
	for(i=0;i<n;i++){
		if(p[i].price>max){
			max=p[i].price;
			index_max=i;
		}
		if(p[i].price<min){
			min=p[i].price;
			index_min=i;
		}
	}

	
	printf("%.2f, %s\n",p[index_max].price,p[index_max].name);
	printf("%.2f, %s\n",p[index_min].price,p[index_min].name);
	}

结果通过测试。

有关scanf
/*代码1*/
#include <stdio.h>
int main (void){
	int n;
	char ch1,ch2;
	scanf("%d",&n);
	ch1=getchar();
	ch2=getchar();
	printf("#%d#%c#%c#",n,ch1,ch2);
	return 0;
} 

/*代码2*/
#include <stdio.h>
int main (void){
	int n;
	char ch1,ch2;
	scanf("%d",&n);
	scanf("\n");
	ch1=getchar();
	ch2=getchar();
	printf("#%d#%c#%c#",n,ch1,ch2);
	return 0;
}

第一段代码输入5\nef,输出为
#5#
#e#

第二段代码输入5\nef,输出为
#5#e#f#

由此可见区别。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值