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

  • Автор темы maks
  • Дата начала
M

maks

#1
помогите решить задачи чайнику на С++.
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
заранее спасибо!
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
3) Перевод строки в Азбуку Морзе

Если писать будешь под досом или в 866 код. странице, то все что связанно с локалью - тебе не нужно
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++, тогда и вообще лучше с ассоциативным массивом работать....
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
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;
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
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;
}
 
M

maks

#5
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++, тогда и вообще лучше с ассоциативным массивом работать....
спасибо большое!

Добавлено:
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;
}
большое спасибо!

Добавлено:
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;
}
большое спасибо!