сама задача такая:
Задана строка, содержащая вещественные числа (максимум 20 чисел).
Упорядочить целые числа в строке по убыванию.
ну вот, если вводить так:
{char str[6];
float a[20];
int i=0;
while(1) {
printf("vvedite cislo"); gets(str);
if (str[0]==0) break;
float c;
sscanf(str,"%lf",&c);
if ... и здесь должно быть условие, что число целое, наверное
Стоп... Ты выделение неправильно сделала
как я понимаю, не целые должны на местах остаться, а целые нужно упорядочить. только можно ли упорядочить их прямо в строке?
если их отдельно записывать в массив, то мы же уже не будем потом знать на какое место их вставлять в строку.
а как определить, что у числа нулевая дробная часть?
double x;
if(x == (int)x) ...
{double a[20];
int i=0;
int n=0;
while (1){
char str[6];
printf("vvedite cislo");
gets(str);
if(str[0]==0) break;
double c;
sscanf(str, "%lf", &c);
a[i]=c;
i+=i;
}
n=i;
for (int j=0; j<=n; j++) {printf("%lf ", a[j]);}
return 0;
}
Чтение неправильное. Все проще гораздо:
int n, size = 0;
// Вводишь всю строку s, а потом ее разбираешь:
p = s; // Чтоб не портить основную строку
while((i = sscanf(p, "%lf%n", &a[size], &n)) == 1)
{
size += 1;
p += n;
}
В общем, добрался я до компилятора, наконец, поборол свою лень запустить Code::Blocks
Вот какой бред вышел у меня:
#include <stdio.h>
#include <string.h>
typedef struct _pair
{
unsigned start, finish;
} PAIR;
int main()
{
double arr[20];
PAIR data[20];
unsigned i, j, k, n, counter = 0;
char *p, t[128] = {0}, s[128] = "12.3 11 5.75 42 7.12 14 12 5.77";
p = s;
while((i = sscanf(p, "%lf%n", &arr[counter], &n)) == 1)
{
if(arr[counter] == (int)arr[counter])
{
data[counter].finish = (data[counter].start = p - s) + n;
counter += 1;
}
p += n;
}
data[counter].start = strlen(s);
// Банальный "пузырек"
for(i = 0; i < counter; i++)
{
for(j = counter - 1; j > i; j--)
{
if(arr[j-1] < arr[j])
{
double x;
x = arr[j-1]; arr[j-1] = arr[j]; arr[j] = x;
}
}
}
i = k = 0; p = t;
do
{
while(i <= data[k].start)
{
*p++ = s[i];
i += 1;
}
if(i < strlen(s))
{
int nprint;
nprint = sprintf(p, "%d", (int)arr[k]);
while(i < data[k].finish) i += 1;
p += nprint;
k += 1;
}
else break;
} while(1);
printf("Before: %s\n", s);
printf("After: %s\n", t);
return 0;
}
Before: 12.3 11 5.75 42 7.12 14 12 5.77
After: 12.3 42 5.75 14 7.12 12 11 5.77
Process returned 0 (0x0) execution time : 0.000 s
Press any key to continue.
хм, интересное решение))
я хорошо подумаю, и тогда напишу )) комментарии не нужны, сейчас разберусь, спасибо!))