Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Преобразование массива 
V
    Опции темы
WiWo
Дата 15.4.2012, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.4.2012

Репутация: нет
Всего: нет



Необходимо преобразовать одномерный массив из 10 элементов так,чтобы сначала шли элементы,по модулю не превышающие 1,а потом все остальные
(желательно методом пузырька или вставкой)

Это сообщение отредактировал(а) WiWo - 15.4.2012, 19:25
PM MAIL   Вверх
disputant
Дата 15.4.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(WiWo @ 15.4.2012,  11:02)
Необходимо преобразовать одномерный массив из 10 элементов так,чтобы сначала шли элементы,по модулю не превышающие 1,а потом все остальные

Так это просто сортировка с соответствующим критерием smile Написать свою функцию, и вперед.

Или применить (размер-то маленький) что-то типа пузырьковой сортировки или сортировки вставкой. Или вообще в один проход - идти слева, и если модуль больше 1, менять с правым концом (сдвигая при этом указатель правого конца влево), типа

Код

#include <stdio.h>
#include <math.h>

void swap(double * f, double * l)
{
    double t = *f;
    *f = *l;
    *l = t;
}

void absort(double*first, double*last)
{
    while(first < last)
    {
        if (fabs(*first) <= 1) { ++first; continue; }
        if (fabs(*last) >   1) { --last;  continue; }
        swap(first,last);
    }
}


int main(int argc, const char * argv[])
{
    double x[] = {
         0.5,
         2.2,
        -0.3,
         4.4,
         0.1,
         6.0,
         0.6,
        -2.8,
         3.3,
         0.9
    };

    for(int i = 0; i < sizeof(x)/sizeof(x[0]); ++i)
        printf("%5.2lf ",x[i]);
    printf("\n");
    absort(&x[0],&x[0] + sizeof(x)/sizeof(x[0]) - 1);
    for(int i = 0; i < sizeof(x)/sizeof(x[0]); ++i)
        printf("%5.2lf ",x[i]);
    printf("\n");
}




Это сообщение отредактировал(а) disputant - 15.4.2012, 11:41
PM MAIL   Вверх
bsa
Дата 15.4.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM   Вверх
WiWo
Дата 15.4.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.4.2012

Репутация: нет
Всего: нет



disputant, Извините,я только не давно изучаю с++...
Пробовал метод пузырька и метод последовательных включений,но видимо руки с головой не оттуда растут:( 
посмотрите пожалуйста мой код и если не составит труда укажите на ошибки в сортировки:



Код

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
//Прототип функции для ввода массива
void inputv(double x[], int n);
//Прототип функции для вывода массива
void outputv (double x[], int n);
//Прототип функции для поиска минимальной координаты и её индекса
void mine(double x[],int n,double& p2,int& l);
//Прототип функции нахождения суммы между 1м и 2м отрицательным элементом
double sum (double x[], int n);
//Прототип функции сортировки 
void sortm(double x[], int n);
//Главная функция
void main()
{
    //Руссификация
    setlocale(LC_ALL,"Russian");
    //Объявление переменных
    double x[10],p2,sb;
    int l;
    //Вывод информации с 10 знаками после запятой
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    //Ввод вектора 
cout<<"\n ввод вектора ";
inputv(x,10);
//Вывод вектора
cout<<"\n вывод вектора ";
outputv(x,10);
mine(x,10,p2,l);
cout<<"\n Минимальный элемент=  "<<p2<<"  индекс=  "<<l;
sb=sum(x,10);
cout<<"\n сумма между 1м и 2м отрицательным =  "<<sb;
cout<<endl;
sortm(x,10);
cout<<"\n Отсортированный массив\n";
outputv(x,10);
cout<<endl;
}
//Определение функции для ввода вектора
void inputv(double x[], int n)
{int i; 
for(i=0;i<n;i++)
cin>>x[i];
}
//Определение функции для поиска минимальной координаты и её индекса
void mine(double x[],int n,double& p2,int& l)
{int i;
p2=x[0];
l=0;
for(i=1;i<n;i++)
  {if ((x[i])<p2) {p2=x[i];
                  l=i;
                   }
}
}
double sum (double x[], int n)
{
    int i,k,l;
    double s;
    s=0;
    for(i=0;i<n;i++) 
      {if (x[i]<0) {k=i;
                   break;
                   }  
    }
for(i=k+1;i<n;i++)
{if (x[i]<0) {l=i;
             break;
             }
}
for(i=k+1;i<l;i++)
s=s+x[i];
return s;
}
void sortm(double x[], int n)
{
    int i,j;
    double p;
    for (i=0;i<n-1;i++)
    {for (j=i+1;j<n;j++)
                {if (fabs(x[i])<=1) {p=x[i];
                                      x[i]= x[j];
                                      x[j]=x[i];
                                      }
                }
    
    }
}


//Определение функции для вывода 
//Определение функции для вывода 
void outputv(double x[], int n)
{
    //Объявление  переменных
    int i;
    //ввод
    for(i=0;i<n;i++)
    {
        if(i%6==0) cout<<endl;
        cout<<setw(10)<<x[i];
    }
}



Это сообщение отредактировал(а) WiWo - 15.4.2012, 18:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.