使用以下结构
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: 保存整数及编号的结构数组的首地址,
函数返回值:已输入的整数的个数。
预设代码
前置代码
- /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
- #include <stdio.h>
- struct nn
- { int no;
- int num;
- };
- typedef struct nn DATA;
- int number( char * , DATA []);
- int main( )
- {
- DATA b[100];
- 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;
- }
- /* Here is waiting for you
- int number( char * str, DATA a[] )
- {
- ....
- }
- */
- /* 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'时检查逻辑