сортировка массива

Тема в разделе "C/C++/C#", создана пользователем maks, 10 окт 2010.

  1. maks

    maks Гость

    помогите решить задачи чайнику на С++.
    1. Сортировка двумерного массива заполненного произвольными числами с помощью функций.
    2. Тоже самое только с указателями.
    3. Перевод строки в азбуку морзе


    1) есть такая задачка, сортировка одномерного массива, заполненного заданными числами, помогите подключить рандом чтобы массив заполнялся произвольно. это просто набросок, не смог довести до ума.

    #include <iostream>
    #include<conio.h>
    #include <iomanip>
    using namespace std;
    int main()
    {
    const int arraySize=10;
    int mas[x][y];
    int a[arraySize]={2,5,7,8,17,45,17,87,5,27};
    int hold;
    cout<<"el dannig v ishodnom pjryadke"<<endl;
    for (int i=0; i<arraySize; i++)
    cout<<setw(4)<<a;
    for (int pass=1; pass<arraySize; pass++)
    for (int i=0; i<arraySize-1; i++)
    if (a>a[i+1]) {
    hold=a;
    a=a[i+1];
    a[i+1]=hold;
    }
    cout <<endl<<"po vozr"<<endl;
    for (int i=0; i<arraySize; i++)
    cout<<setw(4)<<a;
    cout<<endl;
    getch();
    return 0;
    };

    2) вот пример проги сортировки при помощи указателей, но мне надо опять же двумерный массив.


    #include <iostream>
    #include<conio.h>
    #include <iomanip>
    #include <time.h>
    using namespace std;
    void bubblesort(int *, const int);
    int main()
    {
    int arraysize=10; srand (time(NULL));
    int a[10];
    cout<<"elementi massiva v ishodnom poryadke"<<endl;
    for (int i=0; i<10; i++)
    a=rand()%100;
    cout<<setw(4)<<a[arraysize];
    bubblesort(a, arraysize);
    cout<<endl<<"elementi dannih v vozrastayushem poryadke"<<endl;
    for (int i=0; i<10; i++)
    cout<<setw(4)<<a;
    cout<<endl;
    getch();
    return 0;
    }
    void bubblesort(int *array, const int size)
    {
    void swap (int *,int *);
    for (int pass=1; pass<size; pass++)
    for (int j=0; j<size-1; j++)
    if (array[j]>array[j+1])
    swap(&array[j],&array[j+1]);
    }
    void swap(int *element1Ptr,int *element2Ptr)
    {
    int temp=*element1Ptr;
    *element1Ptr=*element2Ptr;
    *element2Ptr=temp;
    }

    напишите свои сроки и свои требования.
    желательно чтобы эти задачки были по максимуму просты и немного прокомментированы. за работу предлагаю оплату. icq 1726090 либо мыло maks_man@bk.ru
    заранее спасибо!
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    3) Перевод строки в Азбуку Морзе

    Код (C++):
    #include <iostream>
    #include <locale.h> //для локали
    #include <Windows.h> //только для локали


    using namespace std;

    char Morse[255][7]; //Наш как бы ассоциативный массив


    void InitMorse(void) //функция инициализации массива, русские буквы имеют значение со знаком минус, поэтому правельно будет
    //приобразовать знаение к беззнаковому типу
    {
    strcpy(Morse[(unsigned char) 'А'],".- ");
    strcpy(Morse[(unsigned char) 'Б'],"-.. ");
    strcpy(Morse[(unsigned char) 'В'],".-- ");
    strcpy(Morse[(unsigned char) 'Г'],"--. ");
    strcpy(Morse[(unsigned char) 'Д'],"-.. ");
    strcpy(Morse[(unsigned char) 'Е'],". ");
    strcpy(Morse[(unsigned char) 'Ё'],"..-.. ");
    strcpy(Morse[(unsigned char) 'Ж'],"...- ");
    strcpy(Morse[(unsigned char) 'З'],"--.. ");
    strcpy(Morse[(unsigned char) 'И'],".. ");
    strcpy(Morse[(unsigned char) 'К'],"-.- ");
    strcpy(Morse[(unsigned char) 'Л'],".-.. ");
    strcpy(Morse[(unsigned char) 'М'],"-- ");
    strcpy(Morse[(unsigned char) 'Н'],"-. ");
    strcpy(Morse[(unsigned char) 'О'],"--- ");
    strcpy(Morse[(unsigned char) 'П'],".--. ");
    strcpy(Morse[(unsigned char) 'Р'],".-. ");
    strcpy(Morse[(unsigned char) 'С'],"... ");
    strcpy(Morse[(unsigned char) 'Т'],"- ");
    strcpy(Morse[(unsigned char) 'У'],"..- ");
    strcpy(Morse[(unsigned char) 'Ф'],".- ");
    strcpy(Morse[(unsigned char) 'Х'],".... ");
    strcpy(Morse[(unsigned char) 'Ц'],"-.-. ");
    strcpy(Morse[(unsigned char) 'Ч'],"---. ");
    strcpy(Morse[(unsigned char) 'Ш'],"---- ");
    strcpy(Morse[(unsigned char) 'Щ'],"--.- ");
    strcpy(Morse[(unsigned char) 'Ы'],"-.-- ");
    strcpy(Morse[(unsigned char) 'Ю'],"..-- ");
    strcpy(Morse[(unsigned char) 'Я'],".-.- ");
    strcpy(Morse[(unsigned char) 'Й'],".--- ");
    strcpy(Morse[(unsigned char) 'Ъ'],"-..- ");
    strcpy(Morse[(unsigned char) 'Ь'],"-..- ");
    strcpy(Morse[(unsigned char) 'Э'],"..-.. ");
    strcpy(Morse[(unsigned char) ' '],"  ");
    }




    int main (void)
    {
    setlocale(LC_ALL, "Russian");

    SetConsoleCP(1251); //Работаю с Visual C++, Так что для консольных приложений приходится играть с локалью
    //В данном случае для инициализации массива Азбуки Морзе

    InitMorse(); //Ицициализируем массив

    char buffer[1024]; //Буфер, в него мы вводим искомую строку

    SetConsoleCP(866); //Меняем консоль, что бы диалог вывелся не кракозябрами :-) Винда мать ее за ногу) Вывод в 866-codepage, ввод в 1251 :-) Че попало)
    cout<<"Введите строку : ";

    SetConsoleCP(1251);
    cin.getline(buffer,1024); //Получаем строку, только сначало кодировку опять поправим


    strcpy(buffer,strupr(buffer)); //из всех букв сделаем ВЕРХНИЙ регистр, короче CAPS

    SetConsoleCP(866); //Ну что бы дальше вывести все нормально опять переключаемся в 866
    cout<<endl<<endl<<"Введенная вами строка :"<<buffer<<endl;
    cout<<"На азбуке морзе будет звучать: ";



    for (int i=0;i<strlen(buffer);i++) //Обходим каждый символ нашего буфера
    {
    cout<<Morse[(unsigned char)buffer[i]]; //и по принципу ассоциативного массива выводим подмассивы строк
    }
    cout<<endl;

    return 0;
    }
    Добавлено: Немного громозко конечно, но пытался просто как можно более приблизить к чистому С, если убрать мой ввод-вывод в стиле STL, а заменить его на printfы и scanfы будет чистейший С++... При реализации с классом String будет красивее, и менее громозко, но это уже будет чистый C++, тогда и вообще лучше с ассоциативным массивом работать....
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    1. Сортировка двумерного массива заполненного произвольными числами с помощью функций.
    Код (C++):
    #include <iostream>
    #include <time.h> //Подключим для генератора случайных чисел

    using namespace std;

    const int SIZE = 5; //Наша размерность массива

    void GetIndex(int *i,int *j,int iter) //Функция для определения СТРОКИ и СТОЛБЦА двумерного массива
    //Сортировать все же линейную последовательность попроще поэтому приходиться выпендриваться
    //Смысл функции прост, определить из порядкового номера элемента, его проекцию на строку и столбец
    {
    *i = (int)(iter / SIZE); //Целочисленное деление на размер - это наша строка
    *j = iter % SIZE; //Остаток от деления на размер - это наш столбец : Пример 8 элемент(т.к. отсчет идет с нуля, то 7) (int) (7/5) = 1, 7 % 5 = 2
    //И искомы элемент будет МАССИВ[1][2]

    }

    void SortMass(int mass[][SIZE]) //Функция сортировки массива, исп. метод пузырька, в качестве параметра - наш массив
    {
    bool Buble = true; //Условие цикла
    int si,sj; //Индексы первого сравневаемого элемента МАССИВ[i][j]
    int ei,ej; //Индексы первого сравневаемого элемента МАССИВ[i][j+1] или МАССИВ[i+1][0]
    int IterationStat=0; //Счетчик итераций цикла

    while (Buble) //Пока произошла хоть одна замена
    {
    IterationStat++; //Увеличим итерацию
    Buble = false; //От противного, предположим в этой итерации не было замен
    for (int i=0;i<SIZE*SIZE-IterationStat;i++) //Перебирем элементы массива с первого по Размер МИНУС итерацию
    {      
    GetIndex(&si,&sj,i); //Получим индексы
    GetIndex(&ei,&ej,i+1); //сравниваемых элементов

    if (mass[si][sj] > mass[ei][ej]) //сравним их, если предыдущий > последующего
    {              
    int temp = mass[ei][ej]; //то меняем их местами
    mass[ei][ej] = mass[si][sj];
    mass[si][sj] = temp;

    Buble = true; //Наше предположение было не верно (БЫЛИ ЗАМЕНЫ), продолжаем метод          
    }

    }

    }

    }

    int main(void) //Главная функция
    {
    int mass[SIZE][SIZE]; //Определение массива

    srand(time(0)); //Инициализация Генератора случ. величины
    for (int i=0;i<SIZE;i++) //Заполним массив случ. числами
    {
    for (int j=0; j<SIZE;j++)
    {
    mass[i][j] = rand()%200 - 100; // от -99 до 99
    cout<<mass[i][j]<<" "; //Выведем элементы на экран
    }
    cout<<endl;
    }

    SortMass(mass); //Функция сортировки

    cout<<endl<<endl<<"Result:"<<endl;
    for (int i=0;i<SIZE;i++) //Покажим отсортированный массив
    {
    for (int j=0; j<SIZE;j++)
    {
    cout<<mass[i][j]<<" ";
    }
    cout<<endl;
    }


    return 0;
    }
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    2. Сортировка двумерного массива заполненного произвольными числами с помощью функций (используя указатели)
    Код (C++):
    #include <iostream>
    #include <time.h> //Подключим для генератора случайных чисел

    using namespace std;

    const int SIZE = 5; //Наша размерность массива


    void SortMass(int mass[][SIZE]) //Функция сортировки массива, исп. метод пузырька, в качестве параметра - наш массив
    {

    bool Buble = true; //Условие цикла
    int IterationStat=0; //Счетчик итераций цикла

    while (Buble) //Пока произошла хоть одна замена
    {
    IterationStat++; //Увеличим итерацию
    Buble = false; //От противного, предположим в этой итерации не было замен
    for (int i=0,*p=&mass[0][0]; i<SIZE*SIZE-IterationStat; i++,p++) //Перебирем элементы массива с первого по Размер МИНУС итерацию
    //Используем указатели p=указатель на первый элемент массива,
    //с каждой итерацией увеличиваем p (т.е. указатель на след. элемент массива
    {      

    if (*p > *(p+1)) //сравним их, если предыдущий > последующего
    {              
    int temp = *(p+1); //то меняем их местами
    *(p+1) = *p;
    *p = temp;

    Buble = true; //Наше предположение было не верно (БЫЛИ ЗАМЕНЫ), продолжаем метод          

    }

    }

    }

    }


    int main(void) //Главная функция
    {
    int mass[SIZE][SIZE]; //Определение массива

    srand(time(0)); //Инициализация Генератора случ. величины
    for (int i=0;i<SIZE;i++) //Заполним массив случ. числами
    {
    for (int j=0; j<SIZE;j++)
    {
    mass[i][j] = rand()%200 - 100; // от -99 до 99
    cout<<mass[i][j]<<" "; //Выведем элементы на экран
    }
    cout<<endl;
    }

    SortMass(mass); //Функция сортировки

    cout<<endl<<endl<<"Result:"<<endl;
    for (int i=0;i<SIZE;i++) //Покажим отсортированный массив
    {
    for (int j=0; j<SIZE;j++)
    {
    cout<<mass[i][j]<<" ";
    }
    cout<<endl;
    }


    return 0;
    }
     
  5. maks

    maks Гость

    спасибо большое!

    Добавлено:
    большое спасибо!

    Добавлено:
    большое спасибо!
     
Загрузка...

Поделиться этой страницей