Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 961
от 09.01.2008, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 472, Экспертов: 43
В номере:Вопросов: 4, Ответов: 12

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 116827: Здравствуйте Поздравляю с новым годом!!!!! Помогите разобраться с алгоритмоми сортировки и поиска в массивах Сортировка выбором Сортировка мет. пузырька Сортировка включением Быстрая сортировка Линейный по...
Вопрос № 116832: В MS Visual C++ 2005 Express Edition не могу скомпилировать программу Ошибка: Cannot open include file: 'windows.h' Установил Microsoft Platform SDK for Windows Server 2003 R2, но всеравно ошибка не проходит. Пробовал скопировать фай...
Вопрос № 116876: Здарвствуйте, товарищи эксперты, нужна помощь! Помогите написать программу на нахождения максимального по значению элемента списка на С++ с помощью динамических структур данных...
Вопрос № 116896: Здравствуйте, уважаемые эксперты! Очень надеюсь на вашу помощь. Необходимо решить вот такую задачу по "Си" (сам я пока ещё дуб - а времени уже нету...): "Ввести строки, в которых имеются круглые, фигурные и квадратные скобки. Прове...

Вопрос № 116.827


Здравствуйте Поздравляю с новым годом!!!!!

Помогите разобраться с алгоритмоми сортировки и поиска в массивах
Сортировка выбором
Сортировка мет. пузырька
Сортировка включением
Быстрая сортировка
Линейный поиск элемента
Двоичный поиск элемента

С уважением Vidok.
Отправлен: 04.01.2008, 07:33
Вопрос задал: Vidok (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Maksim Trofimov
Здравствуйте, Vidok!

Ого-го...сколько навалило в новый год :) :
+ Сортировка включением
+ Быстрая сортировка

Сначало код (на С):
------------------------------
#include <stdio.h>

#define compGT(a,b) (a > b)

typedef char T; // Тип элемента для сортировки
typedef char tblIndex; // тоже самое сдесь подставить...

// Сортировка включением
void insertSort(T *a, tblIndex lb, tblIndex ub) {
T t;
tblIndex i, j;

for (i = lb + 1; i <= ub; i++) {
t = a[i];

for (j = i-1; j >= lb && compGT(a[j], t); j--)
a[j+1] = a[j];

a[j+1] = t;
}
}

// Выбор центрального элемента массива для соритировки
tblIndex partition(T *a, tblIndex lb, tblIndex ub) {
T t, pivot;
tblIndex i, j, p;

p = lb + ((ub - lb)>>1);
pivot = a[p];
a[p] = a[lb];

i = lb+1;
j = ub;
while (1) {
while (i < j && compGT(pivot, a[i])) i++;
while (j >= i && compGT(a[j], pivot)) j--;
if (i >= j) break;
t = a[i];
a[i] = a[j];
a[j] = t;
j--; i++;
}

a[lb] = a[j];
a[j] = pivot;

return j;
}

// Быстрая сортировка
void quickSort(T *a, tblIndex lb, tblIndex ub) {
tblIndex m;

while (lb < ub) {

// сортируем методом включением, если массив мал
if (ub - lb <= 12) {
insertSort(a, lb, ub);
return;
}

// найдем центр
m = partition (a, lb, ub);

// сначала отсортируем меньший раздел, ...
if (m - lb <= ub - m) {
quickSort(a, lb, m - 1);
lb = m + 1;
} else { // а потом, который побольше
quickSort(a, m + 1, ub);
ub = m - 1;
}
}
}

int main(void)
{
char arr[] = "kdjhbdcuhwedokwdodvucns;djks434njkdfn-=++-=";
unsigned arr_len = strlen(arr);
unsigned i;

// массив длиной больше чем 12 элементов - будет сортировка включением
quickSort(arr, 0, arr_len-1);
// ну и выводим поэлементно...
puts("Sorting by insertion");
for(i = 0; i < arr_len; i++)
printf("%c ", arr[i]);

// сделаем так, чтобы сработала быстрая сортировка
strcpy(arr, "dfbcaa,3e42");
arr_len = strlen(arr);
quickSort(arr, 0, arr_len-1);
puts(" Sorting by quick sort");
for(i = 0; i < arr_len; i++)
printf("%c ", arr[i]);

return 0;
}
------------------------------

Значит так. Алгоритм быстрой сортировки разбивает сортируемый массив на разделы, затем рекурсивно сортирует каждый раздел.
В функции partition(arr, i, j) один из элементов массива выбирается в качестве центрального. Ключи, меньшие центрального следует расположить слева от него, те, которые больше, – справа. Индексы начинают изменяться с концов массива. Индекс i начинается слева и используется для выбора элементов, которые больше центрального, индекс j начинается справа и используется для выбора элементов, которые меньше центрального. Эти элементы меняются местами. Короче:
1) 4 2 3 5 1 //исходный массив элементов:
^
2) 1 2 3 5 4 // поменяли местами концы массива
3) Процедура quickSort рекурсивно сортирует два подмассива {1 2} и {5 4}, в результате получается массив:
1 2 3 4 5

В качестве центрального в функции partition() выбирается элемент, расположенный в середине.
Для коротких массивов вызывается функция insertSort() - cортировка включением. Из-за рекурсии и других “накладных расходов” быстрая сортировка оказывается не столь уж быстрая для коротких массивов. Поэтому, если в массиве 12 и меньше элементов, вызывается сортировка включением.

Чтобы было понятней, в приложении ссылка на справочник, из которого я, кстати, и черпал :)

Приложение:

Ответ отправил: Maksim Trofimov (статус: 3-ий класс)
Ответ отправлен: 04.01.2008, 10:40

Отвечает: Solar
Здравствуйте, Vidok!

Вообще-то, неплохо иногда юзать гугл, но, тем не менее получайте (код в приложении).

По нижеприведенной ссылке вы найдете практически исчерпывающую информацию по алгоритмам сортировки.

Link#1

А вот ссылки на алгоритмы поиска:

Link#2
Link#3

Исправлены ссылки.
-----
∙ Отредактировал: Gh0stik (А кадемик)
∙ Дата редактирования: 04.01.2008, 11:44

Приложение:

Ответ отправил: Solar (статус: 2-ой класс)
Ответ отправлен: 04.01.2008, 10:57

Отвечает: Терсков Сергей
Здравствуйте, Vidok!
Все эти алгоритмы давно разобраны... Посмотрите здесь:

algolist.manual.ru

На этом сайте есть отдельные разделы освященные сортировке и поиску. Также советую почитать Д.Кнута "Искусство программирования" 3-ий том. Название его говорит само за себя - "Сортировка и поиск". Материал изложенный в ней, хотя и непрост для восприятия, но является лучшим пособием в этой области.
Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 05.01.2008, 04:21


Вопрос № 116.832
В MS Visual C++ 2005 Express Edition не могу скомпилировать программу
Ошибка:
Cannot open include file: 'windows.h'

Установил Microsoft Platform SDK for Windows Server 2003 R2, но всеравно ошибка не проходит. Пробовал скопировать файл windows.h, но появляется ошибка: Cannot open include file: 'windef.h'
Отправлен: 04.01.2008, 09:40
Вопрос задал: Иванов Максим (статус: 2-ой класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Maksim Trofimov
Здравствуйте, Иванов Максим!

Не нужно компилировать...
Что можно попробывать сделать?:
1) Не подключать его. Может быть его подключит другой заголовочный файл, и он знает где windows.h расположен;
2) Найти, в какой директории он расположен (может быть он не в директории include VC) и прописать полный путь к нему, например #include "C:Program FilesMicrosoft Visual Studio 8VCPlatformSDKIncludewindows.h";
3) А регистр соблюден? Может быть Windows.h, а не windows.h ...
Ответ отправил: Maksim Trofimov (статус: 3-ий класс)
Ответ отправлен: 04.01.2008, 09:54

Отвечает: Mitya86
Здравствуйте, Иванов Максим!

А у тебя, случаем, не в кавычках ли windows.h находится? Если да, замени их на треугольные скобки(см.пример). Надеюсь помог.

Удачи!

Приложение:

Ответ отправил: Mitya86 (статус: 3-ий класс)
Ответ отправлен: 04.01.2008, 10:39

Отвечает: kool
Здравствуйте, Иванов Максим!
Поищите где у вас находится файлы windows.h и
другие *.h и пропишите путь к этой папке в настройках среды
Неплохо бы еще глянуть текст проги где используется windows.h
Удачи!

---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 04.01.2008, 12:14

Отвечает: mega
Здравствуйте, Иванов Максим!
После установки SDK, найдите его группу через меню "Пуск-> Программы...", среди всего прочего, там должен быть ярлык на bat-файл, с названием "Set Envirounment" или "Set Envirounment Variables" (точно не помню), выполните его, перезапустите среду, или ребутните комп.

Проблема в том, что в настройках среды после установки SDK не указаны пути поиска стандартных хидеров, библиотек, исходников и т.п.

Этот батник как раз и добавляет пути до всех нужных подпапок SDK в VS.

То же самое можно сделать и вручную, перейти в меню Tools->Options->Projects->VC++Directories и добавить к каждой группе списка "Show directories for" соответствующий путь из SDK. Но такой способ менее надежен, поскольку можно что-то да пропустить.
Ответ отправил: mega (статус: 3-ий класс)
Ответ отправлен: 04.01.2008, 13:20
Оценка за ответ: 5
Комментарий оценки:
Все помогло, спасибо!


Вопрос № 116.876
Здарвствуйте, товарищи эксперты, нужна помощь! Помогите написать программу на нахождения максимального по значению элемента списка на С++ с помощью динамических структур данных
Отправлен: 04.01.2008, 15:09
Вопрос задал: Мингараев Дмитрий (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Maksim Trofimov
Здравствуйте, Мингараев Дмитрий!

Вот пожайлуста... Динамическая структура - односвязный список. Элементами списка являются данные типа char (чтобы сделать шаблон, не придется много исправлять). Максимальный элемент определяется методом max().

//************************************************************************
#include <iostream>
//************************************************************************
class t_list {
private:
char data;
protected:
t_list(char c = 0): data(c) {
}
char get_char(void) {
return data;
}
void set_char(char c) {
data = c;
}
};
//************************************************************************
class t_singlist: public t_list {
private:
t_singlist *m_next;
unsigned m_count;
public:
t_singlist(): t_list(), m_next(NULL), m_count(0) {
}
~t_singlist();
t_singlist(const t_singlist &t);
t_singlist operator=(const t_singlist &t);
// добавить элемент
void add(char c);
// удалить элемент
void del(unsigned index);
// получить данные элемента
char get(unsigned index = 0);
// длина списка
unsigned count(void) {
return m_count;
}
// нахождение максимального элемента списка
char max(void);
};
t_singlist::t_singlist(const t_singlist &t): m_count(0), m_next(NULL)
{
t_singlist *tmp = (t_singlist *)&t;
for(; tmp!= NULL; tmp = tmp->m_next)
add(tmp->get_char());
}
t_singlist t_singlist::operator=(const t_singlist &t)
{
if(&t!= this)
{
t_singlist *tmp = (t_singlist *)&t;
for(; tmp!= NULL; tmp = tmp->m_next)
add(tmp->get_char());
}
return *this;
}
t_singlist::~t_singlist()
{
t_singlist *t = this;
if(this->m_next == NULL)
m_count = 0;
else
{
while(t->m_next!= NULL)
t = t->m_next;

m_count--;
delete t;
}
}
void t_singlist::add(char c)
{
if(!count())
set_char(c);
else
{
t_singlist *t = this;
while(t->m_next!= NULL)
t = t->m_next;

t->m_next = new t_singlist;
t->m_next->set_char(c);
t->m_next->m_next = NULL;
}
m_count++;
}
void t_singlist::del(unsigned index)
{
t_singlist *t1 = this, *t2 = this;
unsigned i;
if(index < count())
{
if(!index)
{
if(count() > 1)
{
set_char(this->m_next->get_char());
this->m_next = this->m_next->m_next;
m_count--;
}
else
m_count--;
}
else
{
for(i = 0; i < index; i++)
t1 = t1->m_next;

for(i = 0; i < index-1; i++)
t2 = t2->m_next;

t2->m_next = t1->m_next;
m_count--;
}
}
}
char t_singlist::get(unsigned index)
{
if(index >= count())
return 'a';
else if(!index)
return get_char();

t_singlist *t = this;
for(; index!= 0; index--)
t = t->m_next;

return t->get_char();
}
char t_singlist::max(void)
{
char c = get();
char t;
for(unsigned i = 0; i < count(); i++)
if(int(c) < int(t=get(i)))
c = t;
return c;
}
//************************************************************************

int main(void)
{
using namespace std;

cout << " Create single list and show it's elements: ";
t_singlist t;
t.add('1');
t.add('2');
t.add('9');
t.add('4');
t.add('8');

cout << "Single list: ";
for(unsigned i = 0; i < t.count(); i++)
cout << t.get(i);
cout << " Max element: " << t.max() << endl;

return 0;
}
//************************************************************************
Ответ отправил: Maksim Trofimov (статус: 3-ий класс)
Ответ отправлен: 04.01.2008, 16:07

Отвечает: Ross
Здравствуйте, Мингараев Дмитрий!

Решение в приложении к ответу. В отличие от предыдущего ответа здесь использована традиционная структура списка (head/tail) и шаблоны.

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 04.01.2008, 16:22


Вопрос № 116.896
Здравствуйте, уважаемые эксперты! Очень надеюсь на вашу помощь. Необходимо решить вот такую задачу по "Си" (сам я пока ещё дуб - а времени уже нету...):
"Ввести строки, в которых имеются круглые, фигурные и квадратные скобки. Проверить, правильно ли они расставлены. Результат вывести на экран. Стандартных функций работы со строками не использовать."
Если можно - алгоритм решения, комментарии, ссылки и всё, что может помочь мне в данной ситуации...
P.S. Также может найдётся такой добрый человек, который скинет готовый файл (...или что-нить похожее...) именно для Си/Си ++... А лучше всего - на Turbo Си ++... =)))
На других языках не пишите... Всё равно нету уже времени переделывать под себя...
P.P.S. Заранее благодарен всем взявшимся помочь и просто всем знающим... Очень нуждаюсь в вашей помощи... =(
Отправлен: 04.01.2008, 17:35
Вопрос задал: Tarik-fly (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X-men
Здравствуйте, Tarik-fly!
Вот как мне представляется алгоритм программы:
1. Посчитать количество открытых и закрытых скобок (для каждого типа ( "()", "[]", "{}" ) скобок)
2. Если кол-во открытых скобок равняется количеству закрытых, то:
2.1. вызов рекурсивной функции для проверки всего выражения:
2.1.1. поиск первой открывающейся скобки. Если найдена открывающаяся скобка, то запомнить её тип и далее искать закрывающуюся скобку (разумеется этого же типа).
2.1.2. Если закрывающая скобка не была найдена, то выход из всех рекурсий и вывод ошибки.
2.1.3. Иначе (если она была найдена), то вызываем рекурсию (параметром будет подстрока между открытой и закрытой скобкой).
3. иначе (если даже количество не совпадает [см.п.2.] ), то вывод ошибки.

В приложении описана часть этого алгоритма. Осталось лишь функцию дописать.

Приложение:

Ответ отправил: X-men (статус: 2-ой класс)
Ответ отправлен: 05.01.2008, 00:50

Отвечает: Maksim Trofimov
Здравствуйте, Tarik-fly!

#include <stdio.h>

int main(void)
{
char str[] = "f(ff[]lhgi{fgfg}fgfg()fgfgf)fwwss[dsdsd]sdsd[]sds{}sdd";
int i;
int j = 0, k = 0, m = 0;
for(i = 0; i < strlen(str)-1; i++)
if(str[i] == '(' && str[i+1] == ')')
j++;
else if(str[i] == '{' && str[i+1] == '}')
k++;
else if(str[i] == '[' && str[i+1] == ']')
m++;
printf("String: %s () count: %d {} count: %d [] count: %d ", str, j, k, m);

return 0;
}
Ответ отправил: Maksim Trofimov (статус: 3-ий класс)
Ответ отправлен: 05.01.2008, 03:18

Отвечает: Терсков Сергей
Здравствуйте, Tarik-fly!
Ваше же вопрос №115073. Приведенный код полностью удовлетворяет условиям вашей задачи.

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 05.01.2008, 04:48


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.69 от 06.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное