Referate Meniu
Astronomie
Biologie
Chimie
Desen
Diverse
Drept
Economie
Engleza
Filozofie
Fizica
Franceza
Geografie
Germana
Informatica
Istorie
Italiana
Marketing
Matematica
Medicina
Muzica
Psihologie
Romana
Romana1
Spaniola


 


referat, proiect, rezumat, caracterizare, lucrare de nota 10 despre:

Program c - Constructia unui patrat magic impar

Constructia unui patrat magic impar

Problema:

55472vyo72vtj4t Sa se construiasca un patrat magic de dimensiune n ( cu n impar), adica o matrice cu n linii si n coloane avand ca elemente numerele naturale 1, 2, ..., n^2 astfel incat sumele elementelor pe linii, pe coloane si pe cele doua diagonale sa fie identice.

Introducere:

55472vyo72vtj4t Un patrat magic consta dintr-un tablou de numere aranjate in forma unui patrat, astfel incat sumele elementelor din fiecare linie, coloana si din cele doua diagonale sa fie identice; valoarea sumei se numeste numar magic. Un patrat magic este de ordin n daca pe o latura a sa sunt asezate n numere, iar in componenta sa intra numerele 1, 2, 3…, n2; atunci numarul magic poate fi calculat cu formula: numar magic = n(n2+1)/2.

55472vyo72vtj4t

55472vyo72vtj4t Exista un singur patrat magic de ordinul 3 (cu toate ca prin rotatii si simetrii pot fi obtinute 8 astfel de patrate):

4 55472vyo72vtj4t 3 55472vyo72vtj4t 8 55472vyo72vtj4t

9 55472vyo72vtj4t 5 55472vyo72vtj4t 1 55472vyo72vtj4t

2 55472vyo72vtj4t 7 55472vyo72vtj4t 6 55472vyo72vtj4t

55472vyo72vtj4t Patratele magice de ordin 4 sunt in numar de 880 (7040 daca sunt considerate si rotatiile si simetriile), iar numarul patratelor magice de ordin 5 este de circa 13.000.000.

55472vyo72vtj4t Sunt cunoscute mai multe metode de obtinere a patratelor magice, ele diferind pentru patratele de ordin par, respectiv impar.

Metoda:

55472vyo72vtj4t O metoda foarte simpla consta in urmatoarele actiuni:

  • Se plaseaza 1 in centrul ultimei coloane;

  • Se merge in linie oblica, dreapta-jos, cu numarul urmator; daca se iese din patrat prin partea dreapta, se merge in partea opusa, in stanga liniei unde trebuia depus numarul, iar daca se iese prin partea de jos a patratului, se merge in partea de sus a coloanei unde trebuia depus numarul;

  • Dupa ce se completeaza un grup de n numere, se merge cu o casuta spre stanga, pe aceeasi linie, pentru a se repeta apoi pasul 2 si a genera urmatorul grup de n numere.

Se obtine in final urmatorul patrat magic:

 

11 55472vyo72vtj4t 10 55472vyo72vtj4t 4 55472vyo72vtj4t 23 55472vyo72vtj4t 17 55472vyo72vtj4t

18 55472vyo72vtj4t 12 55472vyo72vtj4t 6 55472vyo72vtj4t 5 55472vyo72vtj4t 24 55472vyo72vtj4t

25 55472vyo72vtj4t 19 55472vyo72vtj4t 13 55472vyo72vtj4t 7 55472vyo72vtj4t 1 55472vyo72vtj4t

2 55472vyo72vtj4t 21 55472vyo72vtj4t 20 55472vyo72vtj4t 14 55472vyo72vtj4t 8 55472vyo72vtj4t

9 55472vyo72vtj4t 3 55472vyo72vtj4t 22 55472vyo72vtj4t 16 55472vyo72vtj4t 15 55472vyo72vtj4t

 

Despre program:

55472vyo72vtj4t Programul permite 2 tipuri de afisare a patratului magic:

1. 55472vyo72vtj4t Direct

  • programul afiseaza patratul chiar daca nu o sa incapa pe ecran

2. 55472vyo72vtj4t Pas cu pas

  • dupa fiecare numar afisat trebuie apasata o tasta

  • se vor afisa numai patratele cu n<15. Pentru n>15 afisarea se va face numai in mod 'Direct'

Sursa programului:

#include <stdio.h>#include <conio.h>unsigned char m[200][200];int n;

void af(){ for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) printf("%3d%c",m[i][j],j==n?'\n':' ');}void mod_1(){ int i=n/2+1,j=1; for (int nr=1;nr<=n*n;nr++)

{

if (nr%n==1) {if (!(--j)) j=n;}

else {if (++i==n+1) i=1;

if (++j==n+1) j=1;

}

m[i][j]=(unsigned char)nr;

}

af();

}

void mod_2()

{

if (n>17) {

printf("Nu pot afisa pas cu pas patrate cu n>17.Il afisez normal...\n");

mod_1();

return;

}

int poz=wherey()-1;

int i=n/2+1,j=1;

for (int nr=1;nr<=n*n;nr++)

{

if (nr%n==1) {if (!(--j)) j=n;}

else {if (++i==n+1) i=1;

if (++j==n+1) j=1;

}

gotoxy(j*4,poz+i);

printf("%3d ",nr);

getch();

}

gotoxy(1,poz+n);

}

void main(void)

{

char c;

do{

clrscr();

printf("N=");scanf("%d",&n);fflush(stdin);

if (n%2) {

puts("1. Direct 2. Pas cu pas");

printf("Alegeti modul de afisare al patratului (1/2):");

unsigned char k;

scanf("%u",&k);

if (k==1) mod_1();

else mod_2();

printf("\nAcesta este patratul magic de ordin %d.",n);

printf("\nNumarul magic este %d.",n*(n*n+1)/2);

}

else printf("Ati introdus un numar par...");

printf("\nContinuati? (d/n) ");c=getch();

}while (c!='n');

}