为整数编号

使用以下结构
struct nn
{
   int no;
   int num;
};

建立一个结构数组,从键盘输入若干个整数,保存在数组元素的num成员中,并根据输入的数按从小到大进行编号,将编号保存在no成员中。按整数的输入顺序输出整数及其编号。输入的整数不超过100个,每个整数的绝对值不大于1000,输入时以空格分隔整数。
例如输入:4 3 6 8 2 3 9
输出:
      4 4
      3 2
      6 5
      8 6
      2 1
      3 3
      9 7
要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第2个整数为3,第6个整数也为3,则将先输入的整数3的编号在前,后输入的整数3的编号在后。编写函数完成为整数编号。

函数原型:int number( char *str, struct nn a[] );
其中:str:保存以字符串方式接收的键盘输入,
          a: 保存整数及编号的结构数组的首地址,
函数返回值:已输入的整数的个数。 

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3. struct nn  
  4. {  int no;     
  5.    int num;     
  6. };  
  7.   
  8. typedef struct nn DATA;  
  9.   
  10. int number( char * , DATA []);  
  11.   
  12. int main( )  
  13. {     
  14.    DATA b[100];    
  15.    char sa[500];    
  16.    int i, n;    
  17.    gets( sa );   
  18.    n = number( sa, b );   
  19.    for ( i=0; i<n; i++ )   
  20.        printf("%d %d\n", b[i].num, b[i].no );   
  21.    return 0;  
  22. }  
  23.   
  24. /* Here is waiting for you  
  25.   int number( char * str, DATA a[] ) 
  26.   { 
  27.       .... 
  28.   } 
  29. */  
  30.   
  31. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */  

#include <stdio.h>
#include <math.h>
struct nn  
{  int no;     
   int num;     
};  
  
typedef struct nn DATA;  
  
int number( char * , DATA []);  
  
int main( )  
{     
   DATA b[100];    
   static char sa[500];    
   int i, n;    
   gets( sa );   
   n = number( sa, b );   
   for ( i=0; i<n; i++ )   
       printf("%d %d\n", b[i].num, b[i].no );   
   return 0;  
}  
  
int number( char * str, DATA a[] ) 
{ 
    int v[5],i=0,j=0,k,sum,x,deposit,min=1000,bottom=-1000,flag,store=0;
    while(*str)     //*str=='\0'时,跳出内循环,仍有str++,所以再判断时*str不一定为'\0',加static 
    {
    	sum=0;
    	while(*str!=' '&&*str)     //数的结尾可能是'\0'而非' ' 
    	v[i++]=*str++ -48;x=i-1;
    	while(i--)
    	sum+=v[i]*pow(10,x-i);
    	a[j++].num=sum;str++;i++;     //while(i--)结束时i=-1
	}
	for(i=1;i<=j;i++)
	{
		flag=1;
		for(k=0;k<j;k++)
		if(a[k].num<min&&a[k].num>bottom)
		{ deposit=k;min=a[k].num;}
		else if(a[k].num==bottom&&k>store)     //不在上一轮的位置存
		{ flag=0;deposit=k;break;}
		if(flag) bottom=min;
		a[deposit].no=i;min=1000;store=deposit;     //store存的是上一个数的位置,不为k,此时k=j
	}
	return j;
} 

while(i--)结束时i=-1

数的结尾可能是'\0'而非' ',结尾是'\0'时检查逻辑

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值