BG Development


  Reply to this topicStart new topicStart Poll

> Проблем със сливане на две подредедени редици, merge функция за сортирани масиви/редици
chessplayer
  Публикувано на: 28-08-2020, 13:50
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



Здравейте,

Опитвам се да реализирам програма, която слива две подредени редици.

Ето кода, който имам:

CODE

[B]#include <stdio.h>

void input(int * array, int length);
void sort(int * array, int length);
int * merge(int * array1, int * array2, int a, int b, int * merged);
void output(int * array, int length);

int main(void){
      setvbuf(stdout, NULL, _IONBF, 0);
      int N, M, n[20], m[20], merged[40];

      printf("Enter length of first series N <= 20 ");
      scanf("%d",&N);

      input(n, N);
      sort(n,N);
      output(n,N);

      printf("Enter length of second series M <= 20 ");
      scanf("%d",&M);

      input(m,M);
      sort(m,M);
      output(m,M);

      merge(n,m, N,M, merged);
      output(merged, N+M);

      return 0;
}


void input(int * array, int length){
      for ( int i = 0; i < length; i++ ){
            scanf("%d", &array[i]);
      }
}

void output(int * array, int length){
      for ( int i = 0; i < length; i++ ){
            printf("%d ", array[i]);
      }
}

void sort(int * array, int length){
      int min , temp;
      for( int i = 0; i < length-1; i++){
            min = array[i];
            for( int j = i+1; j < length; j++){
                  if(min>array[j]){
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;

                  }
            }
      }
}

int * merge(int * array1, int * array2, int a, int b, int * merged){
      int arr1_index = 0, arr2_index = 0, arr_merg_index=0;
      while(arr1_index<a||arr2_index<b){
            if(array1[arr1_index] <= array2[arr2_index]){
                  merged[arr_merg_index] = array1[arr1_index];
                  arr1_index++;
                  arr_merg_index++;
            }else{
                  merged[arr_merg_index] = array2[arr2_index];
                  arr2_index++;
                  arr_merg_index++;
            }
            if(arr1_index>a&&arr2_index<b){
                  for(int i = arr2_index; i < b;i++){
                        merged[arr_merg_index] = array2[i];
                        arr_merg_index++;
                  }
                  break;
            }else if(arr2_index>b&&arr1_index<a){
                  for(int i = arr1_index; i < a;i++){
                        merged[arr_merg_index] = array1[i];
                        arr_merg_index++;
                  }
                  break;
            }
      }

      return merged;[/B]
}


Моля, дайте мнение, защо функцията merge не работи, както очаквам!

Ето примерен вход и примерен изход:


QUOTE
Enter length of first series N <= 20 5
5
4
3
2
1
1 2 3 4 5 Enter length of second series M <= 20 7
1
2
4
3
5
7
6
1 2 3 4 5 6 7 1 1 2 2 3 3 4 4 5 0 5 6


Това мнение е било редактирано от chessplayer на 28-08-2020, 14:00
PMEmail Poster
Top
miron
Публикувано на: 28-08-2020, 15:00
Quote Post



Име: Мирослав Николов
Група: Потребител
Ранг: Старо куче

Мнения: 658
Регистриран на: 26.04.05



Щото не си ползвал дебъгер icon_smile.gif.
Ако беше ползвал щеше да видиш че излизаш извън границите на масивите. Щото те са от 0 до n-1, а ти проверяваш >n
PM
Top
chessplayer
Публикувано на: 31-08-2020, 11:37
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



QUOTE (miron @ 28-08-2020, 15:00)
Щото не си ползвал дебъгер icon_smile.gif.
Ако беше ползвал щеше да видиш че излизаш извън границите на масивите. Щото те са от 0 до n-1, а ти проверяваш >n

Проблема е че дебъгера зависва на първия printf и функцията степовер, не е активна, някакава идея какво може да е?
Ето описание във StackOverflow: Problem With Debugger
PMEmail Poster
Top
miron
Публикувано на: 31-08-2020, 11:55
Quote Post



Име: Мирослав Николов
Група: Потребител
Ранг: Старо куче

Мнения: 658
Регистриран на: 26.04.05



Странно никога не съм имал такъв проблем с дебъгер.
Но можеш да премахнеш входно-изходните операции(printf, scanf) и да работиш с предварително дефинирани масиви. Грешката ти е в merge
PM
Top
Дон Реба
Публикувано на: 31-08-2020, 12:19
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 9457
Регистриран на: 11.11.06



QUOTE (chessplayer @ 31-08-2020, 11:37)
QUOTE (miron @ 28-08-2020, 15:00)
Щото не си ползвал дебъгер icon_smile.gif.
Ако беше ползвал щеше да видиш че излизаш извън границите на масивите. Щото те са от 0 до n-1, а ти проверяваш >n

Проблема е че дебъгера зависва на първия printf и функцията степовер, не е активна, някакава идея какво може да е?
Ето описание във StackOverflow: Problem With Debugger

сигурен ли си че зависва на printf? може просто чака да въвъведеш числата в конзолата на scanf
PM
Top
chessplayer
Публикувано на: 31-08-2020, 13:40
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



QUOTE (miron @ 31-08-2020, 11:55)
Странно никога не съм имал такъв проблем с дебъгер.
Но можеш да премахнеш входно-изходните операции(printf, scanf) и да работиш с предварително дефинирани масиви. Грешката ти е в merge

Направих пробата с входноизходните данни и преработих малко merge, защото видях грешка, но интересното е, че втория масив, не ми идва сортиран... Връщам се в 8-ми клас направо
PMEmail Poster
Top
chessplayer
Публикувано на: 31-08-2020, 13:59
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 13
Регистриран на: 06.11.18



QUOTE (chessplayer @ 31-08-2020, 13:40)
QUOTE (miron @ 31-08-2020, 11:55)
Странно никога не съм имал такъв проблем с дебъгер.
Но можеш да премахнеш входно-изходните  операции(printf, scanf) и да работиш с предварително дефинирани масиви. Грешката ти е в merge

Направих пробата с входноизходните данни и преработих малко merge, защото видях грешка, но интересното е, че втория масив, не ми идва сортиран... Връщам се в 8-ми клас направо

Готово, програмата без вподно изходни операции работи, корекции:

CODE
void sort(int * array, int length){
      int min , temp;
      for( int i = 0; i < length-1; i++){
            min = array[i];
            for( int j = i+1; j < length; j++){
                  if(min>array[j]){
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                        min = array[i];

                  }
            }
      }
}


И

CODE
int * merge(int * array1, int * array2, int a, int b, int * merged){
      int arr1_index = 0, arr2_index = 0, arr_merg_index=0;
      while(arr1_index<a||arr2_index<b){
            if(array1[arr1_index] < array2[arr2_index]){
                  merged[arr_merg_index] = array1[arr1_index];
                  arr1_index++;
                  arr_merg_index++;
            }else if(array1[arr1_index] > array2[arr2_index]){
                  merged[arr_merg_index] = array2[arr2_index];
                  arr2_index++;
                  arr_merg_index++;
            }else{
                  merged[arr_merg_index] = array1[arr1_index];
                  arr_merg_index++;
                  merged[arr_merg_index] = array2[arr2_index];
                  arr_merg_index++;
                  arr1_index++;
                  arr2_index++;
            }
            if(arr1_index>a&&arr2_index<b){
                  for(int i = arr2_index; i < b;i++){
                        merged[arr_merg_index] = array2[i];
                        arr_merg_index++;
                  }
                  break;
            }else if(arr2_index>b&&arr1_index<a){
                  for(int i = arr1_index; i < a;i++){
                        merged[arr_merg_index] = array1[i];
                        arr_merg_index++;
                  }
                  break;
            }
      }

      return merged;
}


Движа се по един учебник и там предлагат друго решение, което може би е по-елегантно, но исках сам да съставя алгоритъм.
PMEmail Poster
Top
miron
Публикувано на: 31-08-2020, 14:21
Quote Post



Име: Мирослав Николов
Група: Потребител
Ранг: Старо куче

Мнения: 658
Регистриран на: 26.04.05



Малко ме съмнява, че работи коректно във всички случаи icon_smile.gif
PM
Top
Gamma Goblin
Публикувано на: 31-08-2020, 15:09
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4010
Регистриран на: 21.02.18



някак си като го погледнах тоя код и почна да ми се върти пред очите; тука има повече специални знаци отколкото в ръст с лайфтайм анотации; Деми къде се да кажеш че ръста не бил четим, след като от 20 реда ц може да припаднеш;

ПП: може да ми се припада, защото може да ми е паднало кръвното, тъй като много ми се спи, а може да е и от това че думата индекс се повтаря повече от благоприличния брой пъти. Ебаси, досег ане ми се е завиввало свят от парче код, лол
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0