Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
aksdaqg
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 115
#1

Многопутевое слияние. Пропускается элемент с индексом 1 - C++

02.04.2014, 11:29. Просмотров 435. Ответов 2
Метки нет (Все метки)

Собсна вот алгоритм. Проблема в том, что пропускается элемент с индексом 1. В чем проблема. Еще если можно, помогите организовать чтение из файла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
#define MAXNUMBER 10
 
int base[MAXNUMBER+1],
   b1[MAXNUMBER+2],
   b2[MAXNUMBER+2],
   b3[MAXNUMBER+2],
   b4[MAXNUMBER+2];
int i=1;
 
int merges( int *dest, int *f1, int c1, int *f2, int c2)
    
//сливает две последовательности в одну
//возвращает число вставленных элементов
{ int i=0;
 int t1=0,t2=0;
 int *tf1,*tf2;
 while(c1>0||c2>0)
 { if(c1>0)t1=1;
   if(c2>0)t2=1;
   tf1=f1;tf2=f2;
   do
   {
   i++;
   if(t1&&t2) { if(*(f1)<*(f2)) *(dest++)=*(f1++);
else *(dest++)=*(f2++);
      }
   else if(t1){ *(dest++)=*(f1++);}
    else if(t2){ *(dest++)=*(f2++);}
   if(tf1!=f1) { tf1=f1;if(*(f1)<*(f1-1)) t1=0;}
   if(tf2!=f2) {tf2=f2;if(*(f2)<*(f2-1)) t2=0; }
   }while(t1||t2);
   c1--;c2--;
 };
 return i;
}
int number_of_serieses()
{ int *master;
 master=base;
 int j=1;
 for(int i=0;i<MAXNUMBER;i++)
  { if(*(master)<*(master-1)) j++;
    master++;
  }
 return j;
}
void split( int * master, int *f1, int *f2, int *f3, int *f4)
//разбивает последовательность по подпоследовательностям
{ int *t1,*t2,*t3,*t4;
 t1=f1;t2=f2;t3=f3;t4=f4;
 f1++;f2++;f3++;f4++;
 int i=1;
 *(f1++)=*(master++);
 int j=1,sn=double(number_of_serieses()+1)/4,n=1;
 sn=sn>0?sn:1;
 *(t1)=0;
 *(t2)=0;
 *(t3)=0;
 *(t4)=0;
 do
 { if(*(master)<*(master-1))
   { switch(j)
     { case 1:*(t1)+=1;n++;break;
case 2:*(t2)+=1;n++;break;
case 3:*(t3)+=1;n++;break;
case 4:*(t4)+=1;n++;break;
     }
     if(n>sn) { j=j<4?j+1:j;n=1; }
   }
   switch(j)
   { case 1: *(f1++)=*(master++);break;
     case 2: *(f2++)=*(master++);break;
     case 3: *(f3++)=*(master++);break;
     case 4: *(f4++)=*(master++);break;
   }
 }
 while (++i<MAXNUMBER);
 *(t1)+= j!=1 ?0:*(t1)+1;
 *(t2)+= j!=2 ?0:*(t2)+1;
 *(t3)+= j!=3 ?0:*(t3)+1;
 *(t4)+= j!=4 ?0:*(t4)+1;
 *(f1)=0;
 *(f2)=0;
 *(f3)=0;
 *(f4)=0;
}
 
void fillmaster()
{ 
    for(int i=0;i<MAXNUMBER;i++)
{   cout << i <<":";
  cin >> base[i];//=random(10000);
}
    
    base[i]=0;
}
void write(int *matrix)
{ for(int i=0;i<MAXNUMBER;i++)
  {
    if (!(i%20)) {cout << "\n----------------------";
  getch();
 };
    cout << "\n[" << i << "]\t"<< *(matrix++);
  }
}
void main()
 
{// clrscr();
fillmaster();
//  write(base);
 getch();
 
 cout<<"\nNumber Series=" << number_of_serieses();
while(number_of_serieses() != 1)
{
 split(base,b1,b2,b3,b4);
 int shift=merges(base,b1+1,*(b1),b2+1,*(b2));
 merges(base+shift,b3+1,*(b3),b4+1,*(b4));
//  cout<<"\nNumber Series=" << number_of_serieses();
//  getch();
}
 write(base);
 getch();
 cout<<"\nThe END - - - - - - - - -\n";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 11:29     Многопутевое слияние. Пропускается элемент с индексом 1
Посмотрите здесь:

C++ Вставить в вектор новый элемент перед элементом с заданным индексом
C++ Добавить после элемента массива с заданным индексом элемент со значением 100
Почему пропускается getline? C++
Извлечь элемент из массива рандомным индексом C++
В данном линейном целочисленном массиве каждый элемент с четным индексом увеличить на значение индекса, с нечетным — уменьшить на значение индекса C++
C++ найти максимальный элемент массива x(15) . переставить местами этот максимальный элемент с индексом 4
Пропускается ввод C++
C++ Заменить каждый неположительный элемент массива Х абсолютной величиной элемента массива Y с тем же индексом
Из заданного массива удалить элемент с указанным индексом C++
Убрать те строки матрицы, в которых ни один элемент не является взаимно простым со своим индексом C++
Замените минимальный элемент массива его удвоенным индексом C++
C++ Если элемент массива с четным индексом меньше предыдущего - поменять их местами

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 11:47     Многопутевое слияние. Пропускается элемент с индексом 1 #2
Цитата Сообщение от aksdaqg Посмотреть сообщение
Проблема в том, что пропускается элемент с индексом 1. В чем проблема.
Проблема в том, что пропускается элемент с индексом 1.

А если серьёзно, то Вы хотя бы поточнее указывайте в какой части что пропускает. Что подаете на вход, какой видите результат, и какой он должен быть. Какая вообще суть задачи и т.д. и т.п.
aksdaqg
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 115
07.04.2014, 11:53  [ТС]     Многопутевое слияние. Пропускается элемент с индексом 1 #3
Суть в том, что нужно отсортировать файл, используя метод многопутевого слияния. у меня считывается с клавы, а надо с файла, допустим есть массив 9 7 6 5 83 6 65 93 24 78 4 . отсортировывает, пропуская второй элемент(начиная с 0), т.е. не 4 5 6 6 7 9, а 4 6 6 7 9.Вот в чем ошибка. Еще нужно считать массив с файла
Yandex
Объявления
07.04.2014, 11:53     Многопутевое слияние. Пропускается элемент с индексом 1
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru