Помощь - Поиск - Пользователи - Календарь
Полная версия: Упорядочить целые числа в строке
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
*оля*
сама задача такая:
Задана строка, содержащая вещественные числа (максимум 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 ... и здесь должно быть условие, что число целое, наверное


а дальше что делать? создавать массив с этими числами и там сортировать или как?

видела в Интернете решение этой задачи, но что-то там все непонятно.
спасибо)
volvo
Стоп... Ты выделение неправильно сделала smile.gif
Цитата
Задана строка, содержащая вещественные числа (максимум 20 чисел).
Упорядочить целые числа в строке по убыванию.
Так что в строке и что сортировать?
Lapp
Цитата(volvo @ 17.12.2010 1:32) *
Стоп... Ты выделение неправильно сделала smile.gif
Так что в строке и что сортировать?
Ну, целые - тоже вещественные. Можно предположить, что сртировать нужно те, у которых нулевая дробная часть. Но все равно неясно - что делать с остальными? оставить на местах?.. blink.gif
*оля*
как я понимаю, не целые должны на местах остаться, а целые нужно упорядочить. только можно ли упорядочить их прямо в строке?
если их отдельно записывать в массив, то мы же уже не будем потом знать на какое место их вставлять в строку.



а как определить, что у числа нулевая дробная часть?
volvo
Цитата
можно ли упорядочить их прямо в строке?
Скорее всего - можно. Надо попробовать. А если нельзя, то придется хранить числа в отдельном массиве, а также хранить где-то позицию начала того или иного числа (чтобы потом восстановить исходную строку)...

Цитата
а как определить, что у числа нулевая дробная часть?

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;
}



а что здесь неправильно? почему-то не не присваиваются элементам массива вводимые числа.

ой, что-то я c типами напутала, сейчас исправлю
volvo
smile.gif Чтение неправильное. Все проще гораздо:

int n, size = 0;
// Вводишь всю строку s, а потом ее разбираешь:

p = s; // Чтоб не портить основную строку
while((i = sscanf(p, "%lf%n", &a[size], &n)) == 1)
{
size += 1;
p += n;
}

volvo
В общем, добрался я до компилятора, наконец, поборол свою лень запустить Code::Blocks smile.gif

Вот какой бред вышел у меня:
#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.



Но у этого коде есть один недостаток. Попробуй догадаться, что именно я имею в виду. Если нужны комментарии - добавлю...
*оля*
хм, интересное решение))
я хорошо подумаю, и тогда напишу smile.gif )) комментарии не нужны, сейчас разберусь, спасибо!))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.