![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
*оля* |
![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 125 Пол: Женский Репутация: ![]() ![]() ![]() |
сама задача такая:
Задана строка, содержащая вещественные числа (максимум 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 |
![]()
Сообщение
#2
|
Гость ![]() |
Стоп... Ты выделение неправильно сделала
![]() Цитата Задана строка, содержащая вещественные числа (максимум 20 чисел). Так что в строке и что сортировать?Упорядочить целые числа в строке по убыванию. |
Lapp |
![]()
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Стоп... Ты выделение неправильно сделала Ну, целые - тоже вещественные. Можно предположить, что сртировать нужно те, у которых нулевая дробная часть. Но все равно неясно - что делать с остальными? оставить на местах?.. ![]() Так что в строке и что сортировать? ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
*оля* |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 125 Пол: Женский Репутация: ![]() ![]() ![]() |
как я понимаю, не целые должны на местах остаться, а целые нужно упорядочить. только можно ли упорядочить их прямо в строке?
если их отдельно записывать в массив, то мы же уже не будем потом знать на какое место их вставлять в строку. а как определить, что у числа нулевая дробная часть? |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата можно ли упорядочить их прямо в строке? Скорее всего - можно. Надо попробовать. А если нельзя, то придется хранить числа в отдельном массиве, а также хранить где-то позицию начала того или иного числа (чтобы потом восстановить исходную строку)...Цитата а как определить, что у числа нулевая дробная часть? double x;
if(x == (int)x) ...
? |
*оля* |
![]()
Сообщение
#6
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 125 Пол: Женский Репутация: ![]() ![]() ![]() |
{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 типами напутала, сейчас исправлю Сообщение отредактировано: *оля* - 17.12.2010 13:05 |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
![]() int n, size = 0;
// Вводишь всю строку s, а потом ее разбираешь:
p = s; // Чтоб не портить основную строку
while((i = sscanf(p, "%lf%n", &a[size], &n)) == 1)
{
size += 1;
p += n;
}
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
В общем, добрался я до компилятора, наконец, поборол свою лень запустить 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 Но у этого коде есть один недостаток. Попробуй догадаться, что именно я имею в виду. Если нужны комментарии - добавлю... |
*оля* |
![]()
Сообщение
#9
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 125 Пол: Женский Репутация: ![]() ![]() ![]() |
хм, интересное решение))
я хорошо подумаю, и тогда напишу ![]() |
![]() ![]() |
![]() |
Текстовая версия | 10.10.2025 2:54 |