[C++][C] Sortowanie przez scalanie na C

11Nowy11
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 14 maja 2016, o 10:57
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 1 raz

[C++][C] Sortowanie przez scalanie na C

Post autor: 11Nowy11 »

Moje pytanie to: Jak będzie wyglądać poniższy kod w języku C ???

Kod: Zaznacz cały

#include <cmath>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

const int N = 20; // Liczebność zbioru.

int d[N],p[N];

// Procedura sortująca
//--------------------

void MergeSort(int i_p, int i_k)
{
  int i_s,i1,i2,i;

  i_s = (i_p + i_k + 1) / 2;
  if(i_s - i_p > 1) MergeSort(i_p, i_s - 1);
  if(i_k - i_s > 0) MergeSort(i_s, i_k);
  i1 = i_p; i2 = i_s;
  for(i = i_p; i <= i_k; i++)
    p[i] = ((i1 == i_s) || ((i2 <= i_k) && (d[i1] > d[i2]))) ? d[i2++] : d[i1++];
  for(i = i_p; i <= i_k; i++) d[i] = p[i];
}

// Program główny
//---------------

int main()
{
  int i;
  
  cout << " Sortowanie przez scalanie
"
          "---------------------------
"
          "  (C)2005  Jerzy Walaszek

"
          "Przed sortowaniem:

";

// Najpierw wypełniamy tablicę d[] liczbami pseudolosowymi
// a następnie wyświetlamy jej zawartość

  srand((unsigned)time(NULL));

  for(i = 0; i < N; i++) d[i] = rand() % 100;
  for(i = 0; i < N; i++) cout << setw(4) << d[i];
  cout << endl;

// Sortujemy

  MergeSort(0,N-1);
  
// Wyświetlamy wynik sortowania

  cout << "Po sortowaniu:

";
  for(i = 0; i < N; i++) cout << setw(4) << d[i];
  cout << endl;
  return 0;
} 
Ostatnio zmieniony 7 cze 2016, o 13:19 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: kalwi »

Zamień cout na printf.
Zamień biblioteki z C++ na te z C.
Tyle.
11Nowy11
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 14 maja 2016, o 10:57
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 1 raz

[C++][C] Sortowanie przez scalanie na C

Post autor: 11Nowy11 »

Mam jeszcze kilka pytań:
1.) Czy "using namespace std;" zamienić na coś innego w języku C
2.) Jak zamienić cout na printf w wierszach (40,41,50,51) poniższego programu Czy można tak

Kod w języku C++:

Kod: Zaznacz cały

 for(i = 0; i < N; i++) cout << setw(4) << d[i];
     cout << endl;
Zmiana na kod w języku C:

Kod: Zaznacz cały

 for(i = 0; i < N; i++) printf("%4d 
",d[i]);
Program zmieniony na język C:

Kod: Zaznacz cały

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

const int N = 20; // Liczebność zbioru.

int d[N],p[N];

// Procedura sortująca

void MergeSort(int i_p, int i_k)
{
  int i_s,i1,i2,i;

  i_s = (i_p + i_k + 1) / 2;
  if(i_s - i_p > 1) MergeSort(i_p, i_s - 1);
  if(i_k - i_s > 0) MergeSort(i_s, i_k);
  i1 = i_p; i2 = i_s;
  for(i = i_p; i <= i_k; i++)
    p[i] = ((i1 == i_s) || ((i2 <= i_k) && (d[i1] > d[i2]))) ? d[i2++] : d[i1++];
  for(i = i_p; i <= i_k; i++) d[i] = p[i];
}

// Program główny

int main()
{
  int i;
 
 printf(" 
 Sortowanie przez scalanie

 Przed sortowaniem:

");

// Najpierw wypełniamy tablicę d[] liczbami pseudolosowymi
// a następnie wyświetlamy jej zawartość

  srand((unsigned)time(NULL));

  for(i = 0; i < N; i++) d[i] = rand() % 100;
  for(i = 0; i < N; i++) cout << setw(4) << d[i];                 //for(i = 0; i < N; i++) printf("%4d 

",d[i]);? 
  cout << endl;

// Sortujemy

  MergeSort(0,N-1);
 
// Wyświetlamy wynik sortowania

 printf("
 Po sortowaniu:

");
  for(i = 0; i < N; i++) cout << setw(4) << d[i];                  //for(i = 0; i < N; i++) printf("%4d 

",d[i]);?
  cout << endl;
  return 0;
} 
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: kalwi »

1) nie, "using namespace std" po prostu kasujesz
2) 40 linijka - no prawie... w tym forze nie masz znaku nowej linii '\n'.

To

Kod: Zaznacz cały

 for(i = 0; i < N; i++) cout << setw(4) << d[i];
     cout << endl;
zamień na

Kod: Zaznacz cały

 for(i = 0; i < N; i++) printf("%4d", d[i]); 
    printf("\n");
Analogicznie w 50 i 51
11Nowy11
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 14 maja 2016, o 10:57
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 1 raz

[C++][C] Sortowanie przez scalanie na C

Post autor: 11Nowy11 »

OK Dziękuję za pomoc

-- 10 cze 2016, o 11:34 --

Mam jeszcze problem z tym programem.
Po kompilacji pojawiają się takie błędy:

Kod: Zaznacz cały

error: variably modified ‘d’ at file scope
 int d[N],p[N];
     ^
 error: variably modified ‘p’ at file scope
 int d[N],p[N];
          ^
-- 10 cze 2016, o 16:54 --Mam jeszcze problem z tym programem.
Po kompilacji pojawiają się takie błędy:

Kod: Zaznacz cały

error: variably modified ‘d’ at file scope
 int d[N],p[N];
     ^
 error: variably modified ‘p’ at file scope
 int d[N],p[N];
          ^
[/quote]
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: miki999 »

Zamień const int N = 20; na #define N 20

Rozumiem, że dostałeś zadanie do rozwiązania w C, ale znalazłeś gotowca w C++ i próbujesz go przerobić?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: kalwi »

miki999 pisze:Zamień const int N = 20; na #define N 20

Rozumiem, że dostałeś zadanie do rozwiązania w C, ale znalazłeś gotowca w C++ i próbujesz go przerobić?
...a najlepiej nie używaj zmiennych globalnych, bo to zła praktyka.
11Nowy11
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 14 maja 2016, o 10:57
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 1 raz

[C++][C] Sortowanie przez scalanie na C

Post autor: 11Nowy11 »

Poprawiłem, ale pojawił się nowy błąd error: lvalue required as left operand of assignment związany z 21 wierszem programu:


Kod: Zaznacz cały

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

const int N = 20; // Liczebność zbioru.

// Procedura sortująca

void MergeSort(int i_p, int i_k)
{
  int i_s,i1,i2,i;

  int*d[N],*p[N];

  i_s = (i_p + i_k + 1) / 2;
  if(i_s - i_p > 1) MergeSort(i_p, i_s - 1);
  if(i_k - i_s > 0) MergeSort(i_s, i_k);
  i1 = i_p; i2 = i_s;
  for(i = i_p; i <= i_k; i++)
    p[i] = ((i1 == i_s) || ((i2 <= i_k) && (&d[i1] > &d[i2]))) ? &d[i2++] : &d[i1++];
  for(i = i_p; i <= i_k; i++) &d[i] = &p[i];
}

// Program główny

int main()
{
  int i;
  int d[N],p[N];

 printf(" 
 Sortowanie przez scalanie

 Przed sortowaniem:

");

// Najpierw wypełniamy tablicę d[] liczbami pseudolosowymi
// a następnie wyświetlamy jej zawartość

  srand((unsigned)time(NULL));

  for(i = 0; i < N; i++) d[i] = rand() % 100;
  for(i = 0; i < N; i++) printf("%4d 

",d[i]);

// Sortujemy

  MergeSort(0,N-1);

// Wyświetlamy wynik sortowania

 printf("
 Po sortowaniu:

");
  for(i = 0; i < N; i++) printf("%4d 

",d[i]);
  return 0;
}
miki999:Zamień const int N = 20; na #define N 20
Taka zmiana powoduje jeszcze więcej błędów.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: kalwi »

Pisząc

Kod: Zaznacz cały

 int main()
{
  int i;
  int d[N],p[N];
A następnie..

Kod: Zaznacz cały

  MergeSort(0,N-1);
I w tej funkcji

Kod: Zaznacz cały

 int*d[N],*p[N];
Nie spowoduje to jakiejkolwiek zmiany w tablicy d i p w mainie.
11Nowy11
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 14 maja 2016, o 10:57
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 1 raz

[C++][C] Sortowanie przez scalanie na C

Post autor: 11Nowy11 »

Więc jak to zmienić
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++][C] Sortowanie przez scalanie na C

Post autor: kalwi »

Poszukaj takich informacji w sieci "przekazywanie tablicy do funkcji"

Kod: Zaznacz cały

https://pl.wikibooks.org/wiki/C/Funkcje#Tablice_jako_parametr_funkcji
ODPOWIEDZ