Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2009, 14:54   #1
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
Вопрос Сортировка с вводом чисел

Наконец-то разобрался с алгоритмом сортировки. Решил изменить код.
Я хочу задать ввод с клавиатуры чисел, а программа их уже должна отсортировать. То есть вначале, юзер, должен ввести количество чисел масива,после этого,сами числа, а программа должна вывести эти числа в отсортированном виде.
Вот исходник. Программа компилится,но работает не так,как хочется.
Код:
#include <iostream>
using namespace std;
 
//создается шаблнная функция
template<class T> 
// функция принимает аргументы: 
// массив (так как функция шаблонная, то любого типа массив), и кол-во элементов массива.
void quickSortR(T* a, long N) 
{
    long i = 0, j = N;
    // T - это тип передаваемого массива
    // создаем две перменных этого типа
    T temp, p;
 
  
    p = a[ N>>1 ];
 
    // процедура разделения (разделяет массив на подмассивы)
 
    do {
                 
        while ( a[i] < p ) i++;  
        while ( a[j] > p ) j--;  
 
        if (i <= j) 
        {
            // обмен местами элементов a[i] с a[j] 
            // то есть, то что было в a[i] станет в a[j]
            // а то, что было в a[j] станет в a[i]
            temp = a[i]; a[i] = a[j]; a[j] = temp; 
            i++; j--;
        }
    } while ( i<=j );
 
    // рекурсивные вызовы, если есть, что сортировать
    if ( j > 0 ) quickSortR(a, j); 
 
    if ( N > i ) quickSortR(a+i, N-i);
      
}
// ------------------------------------------------------------------------------
int main()
{
  setlocale(LC_ALL, "Russian");   // создаем массив символов
    char str[] = "бвгда";
    // сортируем массив символов
    quickSortR(str, strlen(str));
    // выводим на экран отсортированный массив симовлов
    cout << str <<  endl;
    // создаем целочисленный массив
        int ch,z, k = 0;
        cout<<"Введите количество чисел -> ";
        cin>>k;
        int a[] = {0};
        for(z = 0; z<k; z++)
        {
                cin>>ch;
                a[z] = ch;
        }
     
    // сортируем целочисленный массив
    quickSortR(a, a[z]);
    // выводим на экран отсортированный целочисленный массив
    for(int i = 0; a[z]; i++)
        cout << a[z] << " ";
    cout <<  endl;
    
    system("pause"); 
    return 0; // функция main ДОЛЖНА возвращать число
}
Syltan вне форума Ответить с цитированием
Старый 26.09.2009, 15:13   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Syltan
int ch,z, k = 0;
cout<<"Введите количество чисел -> ";
cin>>k;
int a[] = {0};
for(z = 0; z<k; z++)
{
cin>>ch;
a[z] = ch;
}

// сортируем целочисленный массив
quickSortR(a, a[z]);
// выводим на экран отсортированный целочисленный массив
for(int i = 0; a[z]; i++)
cout << a[z] << " ";
cout << endl;
int a[] = { 0 }; - создаёт массив, состоящий из одного(!) элемента. Чтобы динамически создать массив размерностью k, делайте так:
Код:
int* a = new int[k];
... // Использования массива
delete[] a; // Когда он нам уже не нужен - удаляем его, дабы освободить память.
quickSortR(a, a[z]); - опять неправильно, вторым параметром передаём индекс последнего элемента массива, но никак не сам последний элемент. Тем более, что a[z] будет уже за пределами массива(ведь индексация начинается с 0, так что последний - z-1).
Код:
quickSortR(a, z-1);
netrino вне форума Ответить с цитированием
Старый 26.09.2009, 16:27   #3
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Ой,что-то такое неизвестное наваял:
Код:
#include <iostream>
using namespace std;

template < typename T>
void sort(T *a, long N)
{
	long i = 0,  j = N;
   T temp,p;
   p = a[N/2];
   do{
   while(a[i]<p) i++;
   while(a[j]>p) j--;
   if(i<=j)
   {
	   temp = a[i]; a[i]= a[j]; a[j] = temp;
	   i++; j--;
   }
   }while(i<=j);
   if(j>0) sort(a,j);
   if(N>i) sort(a+i,N-i);
 
}


int main()
{
setlocale(0,"");
int k1 = 0,ch1,i;
int k2 = 0,ch2, s;
cout<<"Введите пожалуйста количество чисел:\n";
cin>>k1;
int* a = new int[k1];
sort(a,a[k1-1]);
for(i = 0; i < k1; i++)
{
cin>>ch1;
a[i] = ch1;
cout<<a[i]<<' ';
}
delete[] a; 

cout<<"Введите пожалуйста количество символов:\n";
cin>>k2;
int* b = new int[k2];
sort(a,a[s-1]);
for(s = 0; s < k2; s++)
{
cin>>ch2;
a[s] = ch2;
cout<<a[s]<<' ';
}
delete [] b;

cin.get();
}
Syltan вне форума Ответить с цитированием
Старый 26.09.2009, 16:35   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Syltan
Код:
sort(a,a[k1-1]);
...
sort(a,a[s-1]);
Ещё раз... передавать надо индекс(номер) последнего элемента массива.
Код:
sort(a, k1-1);
...
sort(b, k2-1); // Теперь массив b передаём. Откуда вы s вообще взяли? Кол-во элементов содержится в k2.
netrino вне форума Ответить с цитированием
Старый 26.09.2009, 16:57   #5
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Странно, вроде так,если выводить, также результата не вижу на экран:
Код:
int main()
{
setlocale(0,"");
int k1 = 0,ch1,i;
int k2 = 0,ch2, s;
cout<<"Введите пожалуйста количество чисел:\n";
cin>>k1;
int* a = new int[k1];
sort(a,k1-1);
for(i = 0; i < k1; i++)
{
cin>>ch1;
a[i] = ch1;
cout<<a[i]<<' ';
}
delete[] a; 

cout<<"Введите пожалуйста количество символов:\n";
cin>>k2;
int* b = new int[k2];
sort(b,k2-1);
for(s = 0; s < k2; s++)
{
cin>>ch2;
a[s] = ch2;
cout<<a[s]<<' ';
}
delete [] b;

cin.get();
}
Тоесть не выводится в ровную строку отсортированный масив символов и чисел. А символы вообще не выводятся.

Последний раз редактировалось Syltan; 26.09.2009 в 17:04.
Syltan вне форума Ответить с цитированием
Старый 26.09.2009, 17:41   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

мда...
Код:
int main()
{
     int k; // Одну и ту же переменную можно использовать дважды и более для разных операций
     setlocale(LC_ALL, "Russian");

     std::cout << "Введите кол-ство символов: ";
     std::cin >> k; // Вводим кол-ство элементов

     int* a = new int [k]; // Выделяем память под массив
     
     for(int i = 0; i < k; i++) { // Заполняем массив 
          std::cin >> a[i];       // Введёнными с клавиатуры цифрами
          std::cout << a[i] << ' ';
     }

     sort(a, k-1);  // Сортируем
     std::cout << "\nОтсортированный массив: ";
     for(int i = 0; i < k; i++) // Выводим отсортированный массив
          std::cout << a[i] << ' ';

     delete[] a; // Освобождаем память.
     
     std::cout << "\nВведите кол-ство элементов: ";
     std::cin >> k;  // Вводим кол-ство элементов для второго массива

     int* b = new int[k];  // Выделяем под него память.
     
     for(int i = 0; i < k; i++) {  // Вводим значения
          std::cin >> b[i];
          std::cout << b[i] << ' ';
     }

     sort(b, k-1);  // Сортируем
     std::cout << "\nОтсортированный массив: ";
     for(int i = 0; i < k; i++)  // Выводим отсортированный
         std::cout << b[i] << ' ';

     delete[] b; // Освобождаем память.

     std::cin.get();

     return 0;
}
Учите мат. часть, я уже рекомендовал Вам почитать учебник.
netrino вне форума Ответить с цитированием
Старый 26.09.2009, 18:03   #7
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Спасибо,вроде так как хотел,но:
1)не выводятся и не вводятся русские символы;
При вводе первого русского символа, обрывается программа, при вводе английского также.
Syltan вне форума Ответить с цитированием
Старый 26.09.2009, 18:10   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А куда они должны вводится? У вас же массив целочисленных переменных, никак не символов. Если попытаться ввести символ, то cin проигнорирует его и переменная k так и останется не инициализированной, там будет мусор, вероятно -1, и когда new попытается выделить память такой размерности, то не странно, что вылетает ошибка и программа завершается
netrino вне форума Ответить с цитированием
Старый 26.09.2009, 18:22   #9
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Смотрите, за первым разом, масив указателей а, я использую для ввода и сортировки чисел, а масив указателей b,я хочу использовать для ввода символов русских и англ, и их сортировки также.
Syltan вне форума Ответить с цитированием
Старый 26.09.2009, 18:35   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну так и объявлять его в таком случае надо соответственно. То есть как указатель на строку, а не на массив целых чисел.
Код:
char b[80];
std::cin >> b;
sort(b, strlen(b));
Ввод кол-ства элементов тут уже не нужен...
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка римских чисел nopster Общие вопросы C/C++ 0 18.06.2009 12:00
сортировка чисел типа float дядя Общие вопросы C/C++ 2 23.05.2009 12:11
Поразрядная сортировка беззнаковых целых чисел горе-программист Помощь студентам 0 12.04.2009 02:20
Задача на Delphi. Сортировка чисел mr-professor Помощь студентам 2 22.03.2009 18:49
Сортировка массива чисел Roberto Помощь студентам 1 02.04.2008 23:19