【总结】PTA习题9-4
9-4![9-4题面](https://img-blog.csdnimg.cn/20200201200108242.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjA4Mjg0NQ==,size_16,color_FFFFFF,t_70)
在习题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#
由此可见区别。