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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 14:19   #1
DarkAltair
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию сортировка слиянием (C++)

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

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <conio.h>
class X {
	typedef double temp [100];
	typedef double T[100];
        int lb; 
	int split;
	int ub;
	int a[100];
public:
void merge(T a[], long lb, long split, long ub) {
// Слияние упорядоченных частей массива в буфер temp
// с дальнейшим переносом содержимого temp в a[lb]...a[ub]

  // текущая позиция чтения из первой последовательности a[lb]...a[split]
  long pos1=lb;

  // текущая позиция чтения из второй последовательности a[split+1]...a[ub]
  long pos2=split+1;

  // текущая позиция записи в temp
  long pos3=0;  

  T *temp = new T[ub-lb+1];

  // идет слияние, пока есть хоть один элемент в каждой последовательности
  while ( (pos1 <= split) && (pos2 <= ub) ) {
    if (a[pos1] < a[pos2])
      temp/*Ошибка:выражение должно быть допустимым для изменения левосторонним движением*/[pos3++] = a[pos1++];
    else
      temp/*Ошибка:выражение должно быть допустимым для изменения левосторонним движением*/[pos3++] = a[pos2++];
  }

  // одна последовательность закончилась - 
  // копировать остаток другой в конец буфера 
  while (pos2 <= ub)   // пока вторая последовательность непуста 
    temp/*Ошибка:выражение должно быть допустимым для изменения левосторонним движением*/[pos3++] = a[pos2++];
  while (pos1 <= split)  // пока первая последовательность непуста
    temp/*Ошибка:выражение должно быть допустимым для изменения левосторонним движением*/[pos3++] = a[pos1++];

  // скопировать буфер temp в a[lb]...a[ub]
  for (pos3 = 0; pos3 < ub-lb+1; pos3++)
    a/*Ошибка:выражение должно быть допустимым для изменения левосторонним движением*/[lb+pos3] = temp[pos3];

  delete temp[ub-lb+1];
}

int main(){}

Последний раз редактировалось DarkAltair; 11.10.2011 в 15:36.
DarkAltair вне форума Ответить с цитированием
Старый 11.10.2011, 14:26   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Код:
while (pos1 <= split && pos2 <= ub)
Если вы пользуетесь логическими операциями, то операнды должны быть заключены в скобки, то есть
Код:
While ((Логическое_Выражение_1) && (Логическое_выражение_2))
Вадим Мошев вне форума Ответить с цитированием
Старый 11.10.2011, 14:31   #3
DarkAltair
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

Ошибка осталась та же.
DarkAltair вне форума Ответить с цитированием
Старый 11.10.2011, 14:37   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

да вот ещё что.
Вы объявляете класс X в функции main. Объявите его ВНЕ этой функции (ДО этой функции)
Вадим Мошев вне форума Ответить с цитированием
Старый 11.10.2011, 14:57   #5
DarkAltair
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

Сейчас код выглядит так.
Также при попытки изменить объявленный тип в строке

Код:
    a[lb+pos3] =/*значение типа "double*" нельзя присвоить сущности типа "int"*/ temp[pos3];
ошибка остается.

Последний раз редактировалось DarkAltair; 11.10.2011 в 15:01.
DarkAltair вне форума Ответить с цитированием
Старый 11.10.2011, 15:25   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
*значение типа "double*" нельзя присвоить сущности типа "int"*
Int - это целые числа
double - действительные.
Несоответствие типов (если я не ошибся). Чтобы сработало, попробуйте сделать так:
Код:
double y;
int x = int(y); // вот таким образом.
Вадим Мошев вне форума Ответить с цитированием
Старый 11.10.2011, 15:38   #7
DarkAltair
 
Регистрация: 05.10.2011
Сообщений: 7
По умолчанию

Вернулась теперь обратно старая ошибка с недоступностью левостороннего движения.
Попытался исправить так, как мне предлагает компилятор (Visual Studio 2010 C++)
Код:
X::T*a[lb/*выражение должно иметь константное значение*/+pos3/*выражение должно иметь константное значение*/] = temp[pos3];
но тогда выходит такая ошибка.
DarkAltair вне форума Ответить с цитированием
Старый 11.10.2011, 21:12   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Обратите внимание, что у вас после X стоит удвоенное двоеточие. Можте, вы хотели поставить оператор присваивания?
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка слиянием C++ PinkPink Помощь студентам 3 10.10.2011 22:44
СОРТИРОВКА СЛИЯНИЕМ spawn969 Помощь студентам 5 12.05.2011 01:03
Сортировка слиянием Aндрей Общие вопросы C/C++ 3 15.04.2010 09:47
Сортировка слиянием maxflint Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 05.12.2009 20:41