【更友好的用户交互】从一个小程序谈起

来源:互联网 发布:数控线切割编程3b代码 编辑:程序博客网 时间:2024/05/16 11:47

引例:从输入的m个数中找出最小的n个数

//作者 戚凡 时间2017-5-7 
//题目3:查找最小的k个元素(笔试题)
// 输入n个整数,输出其中最小的k个。
// 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4


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


void smallest(const int *n,int size,int k);


int main() 
{
int g = 0;


printf("how many numbers would you wanna input?_____\n"
 "and how many smaller numbers would you wanna find?_____\n"
 "this program will be in a infinite loop,enter q to quit!\n"); 
int m,n;
while(g=scanf("%d%d",&m,&n)==2)//这一行使得程序在有两个合法的输入时,不断循环
{
if(m<1||m<n)
printf("wrong input!\n");
else
{
 
printf("I get it.You wanna find %d smallest numbers in total %d numbers\n",n,m);
int *p=(int *)malloc(sizeof(int)*m);
printf("now you can input %d numbers\n",m);
int i = 0;
for(i = 0; i < m; i++)
scanf("%d",p+i);


// for(i = 0; i <m; i++)//至此 m个数读取正常 
// printf("%d ",*(p+i));


char garbage[100];//清空缓冲区,防止用户输入过量 
fgets(garbage,100,stdin);        //清空缓冲区,防止用户输入过量 


smallest(p,m,n); 
}
}
return 0;
}


void smallest(const int *n,int size,int k)
{
int i = 0;
int tmp;
int * pt=(int *)malloc(sizeof(int)*size);
for(i = 0; i < size; i++)
{
*(pt+i) =*(n+i);
}
// for(i = 0; i <size; i++)//至此 m个数拷贝正常 
// printf("%d ",*(pt+i));


//block start:insertion-sort the array and print the seveal smallest ones


int  j;
int key;

for(j = 1; j < size; j++)
{
key = *(pt+j);
i = j - 1;
while(i >= 0 && *(pt+i) > key)
{
*(pt+i+1) = *(pt + i);
i = i - 1;
}
*(pt + i+1) = key;
}

for( i = 0; i < k; i++)
printf("%d  ", *(pt+i));

printf("\n");
//block end:insertion-sort the array and print the seveal smallest ones


}


这是最终实现的代码。

1.首先值得注意的时,如果不加循环执行的代码,程序执行一次就退出,不太方便多次使用,也不方便进行测试。

2.如果用户输入参数过多,如何清除缓冲区?


于是可以添加一段代码,再用fgets()读取缓冲区的无效输入:


解决后是这样的


3.不过这个程序依然有个问题。当一开始就读到的是字符(不够两个合法参数),程序直接结束了。这怎么办?


如果读取不到两个合法参数怎么办?一开始读到非数值数据。因此可以再加一段代码

while(g!=1)

     scanf("*s");    //处理非整数输入

//这个程序没有实现这一功能

1 0