[c i c++] przerobienie kodu z C++ na C

marek12
Użytkownik
Użytkownik
Posty: 696
Rejestracja: 5 lut 2008, o 15:38
Płeć: Mężczyzna
Lokalizacja: marki
Podziękował: 165 razy
Pomógł: 20 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: marek12 »

jak przerobić ten kod w C++ na C, dzieki

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>

using namespace std;

int ReadSquareSize()
{
    int x;
    cout<<"Podaj nieparzystą liczbę całkowitą wieksza lub równą 3 ";
    while(1)
    {
        cin>>x;
        if(x>=3 && x%2==1)
        {
            return x;
        }
        else
        {
            cout<<"Podaj nieparzystą liczbę całkowitą wieksza lub równą 3 ";
        }
    }
    cout<<endl;
}


int main()
{   

    int k,g;
    int unit;
    int row,col,newRow,newCol;
    int n = ReadSquareSize();
    int square[n][n];

    for(k=0 ; k<n ; k++) {
        for(g=0 ; g<n ; g++) {
                square[k][g] = 0;
        }
    }


    unit= 1;
    row= 1;
    col= (n+1)/2;
    k= 1;
    square[row-1][col-1]=k;


    for(k=2 ; k<=n*n ; k++)
    {
        newRow= row - 1;
        newCol= col + 1;
        if (newRow==0 && newCol==(n+1))
        {
            newRow = row + 1;
            newCol = n;
            row = newRow;
            col = newCol;
            square[row-1][col-1]=k;
        }
        else
        {
            if(newRow==0)
            {
            newRow= n;
            }
            if(newCol==(n+1))
            {
                newCol= 1;
            }
            if(square [newRow-1][newCol-1]==0)
            {
                row=newRow;
                col=newCol;
                square[row-1][col-1]=k;
            }
            else
            {
                newRow= row + 1;
                newCol= col;
                if(newRow==(n+1))
                {
                    newRow= 1;
                }
                    row= newRow;
                    col= newCol;
                    square[row-1][col-1]=k;
            }
        }
    }

for(int i=0; i<n ;i++)
{
for(int j=0; j<n ; j++)
{
cout<<setiosflags(ios::left) << setw (5) << square[j];
}
cout<<endl;
delete[] square;
}
free(square);

Kod: Zaznacz cały

   system("pause");
    return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: soku11 »

Kod: Zaznacz cały

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


int ReadSquareSize()
{
    int x;
    printf("Podaj nieparzystą liczbę całkowitą wieksza lub równą 3 ");
    while(1)
    {
        scanf("%d",&x);
        if(x>=3 && x%2==1)
        {
            return x;
        }
        else
        {
            printf("Podaj nieparzystą liczbę całkowitą wieksza lub równą 3 ");
        }
    }
    printf("
");
}


int main()
{   
    int k,g;
    int unit;
    int row,col,newRow,newCol;
    int n = ReadSquareSize();
    int square[n][n];

    for(k=0 ; k<n ; k++) {
        for(g=0 ; g<n ; g++) {
                square[k][g] = 0;
        }
    }


    unit= 1;
    row= 1;
    col= (n+1)/2;
    k= 1;
    square[row-1][col-1]=k;


    for(k=2 ; k<=n*n ; k++)
    {
        newRow= row - 1;
        newCol= col + 1;
        if (newRow==0 && newCol==(n+1))
        {
            newRow = row + 1;
            newCol = n;
            row = newRow;
            col = newCol;
            square[row-1][col-1]=k;
        }
        else
        {
            if(newRow==0)
            {
            newRow= n;
            }
            if(newCol==(n+1))
            {
                newCol= 1;
            }
            if(square [newRow-1][newCol-1]==0)
            {
                row=newRow;
                col=newCol;
                square[row-1][col-1]=k;
            }
            else
            {
                newRow= row + 1;
                newCol= col;
                if(newRow==(n+1))
                {
                    newRow= 1;
                }
                    row= newRow;
                    col= newCol;
                    square[row-1][col-1]=k;
            }
        }
    }


  for(int i=0; i<n ;i++)
  {
    for(int j=0; j<n ; j++)
    {
      printf("%5d",square[i][j]);
    }
    printf("
");
  }

   system("pause");
  return 0;
}
Nie sprawdzane, ale chyba tak bedzie ok. Samego kodu nie bede komentowal. Powiem tylko ze nie jest najwyzszych lotow... (i wywali ci bledy jesli nie skompilujesz w standardzie C99)

Pozdrawiam.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: matshadow »

wywalić system("pause");
marek12
Użytkownik
Użytkownik
Posty: 696
Rejestracja: 5 lut 2008, o 15:38
Płeć: Mężczyzna
Lokalizacja: marki
Podziękował: 165 razy
Pomógł: 20 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: marek12 »

dzieki a ten jest lepszy kod?

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>

using namespace std;

int ReadSquareSize();
void OddMagicSquare(int** matrix, int n);
void DoublyEvenMagicSquare(int** matrix, int n);
void SinglyEvenMagicSquare(int** matrix, int n);
void MagicSquare(int** matrix, int n);
int** CreateMatrix(int n);
void FreeMatrix(int** matrix, int n);

int main(int argc, char* argv[])
{
  int i,n;
  n = ReadSquareSize();

  int** matrix = CreateMatrix(n);

  MagicSquare(matrix, n);  

  // print the square
  for(int i=0; i<n ;i++)
  {
      for(int j=0; j<n ; j++)
      {
      cout<<setiosflags(ios::left) << setw (5) << matrix[i][j];        
      }
      cout<<endl;
  }
  
  FreeMatrix(matrix,n);
    
  return 0;
}


int ReadSquareSize()
{
    int x; 
    cout<<"Enter a positive integer square size of 3 or more: ";
    while(1)
    {
        cin>>x;
        if(x>=3)
        {
            return x;
        }
        else 
        {
            cout<<"Enter a positive integer square size of 3 or more: ";
        }
    }
    cout<<endl;
}

void MagicSquare(int** matrix,int n)
{
  if (n%2==1)        //n is Odd
    OddMagicSquare(matrix, n);
  else          //n is even
    if (n%4==0)    //doubly even order
      DoublyEvenMagicSquare(matrix, n);
    else      //singly even order
      SinglyEvenMagicSquare(matrix, n);
}

void OddMagicSquare(int** matrix, int n)
{
  int nsqr = n * n;
  int i=0, j=n/2;     // start position

  for (int k=1; k<=nsqr; ++k) 
  {
    matrix[i][j] = k;

    i--;
    j++;

    if (k%n == 0) 
    { 
      i += 2; 
      --j; 
    }
    else 
    {
      if (j==n) 
        j -= n;
      else if (i<0) 
        i += n;
    }
  }
}

void DoublyEvenMagicSquare(int** matrix, int n)
{
  int i, j;

  int** I = CreateMatrix(n);
  int** J = CreateMatrix(n);


  //prepare I, J
  int index=1;
  for (i=0; i<n; i++)
    for (j=0; j<n; j++)
    {
      I[i][j]=((i+1)%4)/2;
      J[j][i]=((i+1)%4)/2;
      matrix[i][j]=index;
      index++;
    }

  for (i=0; i<n; i++)
    for (j=0; j<n; j++)
    {
      if (I[i][j]==J[i][j])
        matrix[i][j]=n*n+1-matrix[i][j];
    }

  FreeMatrix(I,n);
  FreeMatrix(J,n);
    
}

void SinglyEvenMagicSquare(int** matrix, int n)
{
  int i, j, k, index=0;

  int p=n/2;

  int** M = CreateMatrix(p);
  
  MagicSquare(M, p);
  
  for (i=0; i<p; i++)
    for (j=0; j<p; j++)
    {
      matrix[i][j]=M[i][j];
      matrix[i+p][j]=M[i][j]+3*p*p;
      matrix[i][j+p]=M[i][j]+2*p*p;
      matrix[i+p][j+p]=M[i][j]+p*p;
    }

  if (n==2)
    return;  

  int* I = new int[p];
  int* J = new int[n];

  for (i=0; i<p; i++)
    I[i]=i+1;

  k=(n-2)/4;
  
  for (i=1; i<=k; i++)
    J[index++] = i;

  for (i=n-k+2; i<=n; i++)
    J[index++] = i;

  int temp;
  for (i=1; i<=p; i++)
    for (j=1; j<=index; j++)
    {
      temp=matrix[i-1][J[j-1]-1];
      matrix[i-1][J[j-1]-1]=matrix[i+p-1][J[j-1]-1];
      matrix[i+p-1][J[j-1]-1]=temp;
    }

  //j=1, i
  //i=k+1, k+1+p
  i=k; 
  j=0;
  temp=matrix[i][j]; matrix[i][j]=matrix[i+p][j]; matrix[i+p][j]=temp;

  j=i;
  temp=matrix[i+p][j]; matrix[i+p][j]=matrix[i][j]; matrix[i][j]=temp;

  FreeMatrix(M,p);
  delete[] I;
  delete[] J;
  
}


int** CreateMatrix(int n)
{
  int i;
  int** matrix = new int* [n];
  for(i=0;i<n;i++)
  {
        matrix[i] = new int[n];
  }
  return matrix;
}


void FreeMatrix(int** matrix, int n)
{
  for(int i=0; i<n ;i++)
  {
      delete[] matrix[i];
  }
  free(matrix);
}
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: matshadow »

jak to lepszy?
Awatar użytkownika
mcbob
Użytkownik
Użytkownik
Posty: 479
Rejestracja: 15 gru 2008, o 19:02
Płeć: Mężczyzna
Lokalizacja: Poland
Pomógł: 69 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: mcbob »

soku11 pisze:Nie sprawdzane, ale chyba tak bedzie ok. Samego kodu nie bede komentowal. Powiem tylko ze nie jest najwyzszych lotow...
marek12 pisze:dzieki a ten jest lepszy kod?
Jemu nie chodziło o to że nie używasz tablic, wskaźników, czy obiektów ale o szybkość i poprawność kodu.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: soku11 »

Nowego nie chce mi sie sprawdzac, bo za duzo kodu i nawet nie chce mi sie domyslac, co on ma robic... Jako uzasadnienie mojej opinii o kodzie moge podac zmieniona funkcje ReadSquareSize():

Kod: Zaznacz cały

int ReadSquareSize()
{
  int x=0;
  while(x<3 || !(x&1))
  {
    printf("Podaj nieparzystą liczbę całkowitą wieksza lub równą 3 ");
    scanf("%d",&x);
  }

  return x;
}
Jak widac duzo bardziej czytelne i spelnia swoja role. Reszty nie chce mi sie poprawiac, bo nie wiem co kod ma dokladnie robic. Moge tylko napisac, ze tablice square w main lepiej zadeklarowac dynamicznie na stosie (funkcja malloc) i pozniej zwolnic (funkcja free).

Pozdrawiam.
marek12
Użytkownik
Użytkownik
Posty: 696
Rejestracja: 5 lut 2008, o 15:38
Płeć: Mężczyzna
Lokalizacja: marki
Podziękował: 165 razy
Pomógł: 20 razy

[c i c++] przerobienie kodu z C++ na C

Post autor: marek12 »

dzieki
ODPOWIEDZ