Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int& TV(int*p, int lim1,int lim2, int lim3, int f, int n);
  5. void stampa(int*, int, int, int);
  6.  
  7. int main() {
  8.  
  9. int x[100];
  10. for(int i=0; i<100; i++)
  11. cin >> x[i];
  12.  
  13. int lim1, lim2, lim3;
  14. cin >> lim1 >> lim2 >> lim3;
  15.  
  16. cout << "start" << endl;
  17.  
  18. int quadrupla[4];
  19. int val;
  20. cin >> val;
  21. int quadIndex = 0;
  22.  
  23. while(val != -1) { // R=(inseriti (quadIndex%4 elementi della quadrupla corrente (quadrupla[0..(quadIndex%4-1)] )
  24. // && val e' l'ultimo elemento letto && sono state svolte tutte le modifiche relative alle quadruple lette)
  25. // && sono state lette quadIndex/4 quadruple complete
  26. quadrupla[quadIndex%4] = val;
  27.  
  28. // se ho completato la quadrupla allora svolgo il cambiamento
  29. if((quadIndex%4) == 3) {
  30.  
  31. // quadrupla: i j k z
  32. // scambio il valore j della vFetta i
  33. // con il valore z della vFetta k
  34.  
  35. int *pVfettaI = x+quadrupla[0];
  36. int *pVfettaK = x+quadrupla[2];
  37.  
  38. int& v1 = TV(pVfettaI, lim1, lim2, lim3, quadrupla[0], quadrupla[1]);
  39. int& v2 = TV(pVfettaK, lim1, lim2, lim3, quadrupla[2], quadrupla[3]);
  40.  
  41. int temp = v1;
  42. v1 = v2;
  43. v2 = temp;
  44. }
  45.  
  46. quadIndex++;
  47. cin >> val;
  48. }
  49. // POST=(val == -1 && sono state svolte tutte le modifiche relative alle quadruple lette nell'ordine di lettura presente)
  50.  
  51. stampa(x, lim1, lim2, lim3); // stampa Y[lim1][lim2][lim3] per strati
  52.  
  53. cout << "end" << endl;
  54.  
  55. return 0;
  56. }
  57.  
  58. // PRE=(p punta al primo elemento della V-fetta f, e gli altri parametri sono ben definiti)
  59. int& TV(int*p, int lim1,int lim2, int lim3, int f, int n) {
  60. int& cella = *(p+n*lim3);
  61. return cella;
  62. }
  63. // POST=(la funzione restituisce per riferimento l’elemento n della V-fetta di indice f)
  64.  
  65. // PRE=(array e' definito && lim1, lim2, lim3 indicano le dimensioni della torta da considerare)
  66. void stampa(int *array, int lim1, int lim2, int lim3) {
  67.  
  68. for(int i = 0; i < lim1; i++) { // R=(0<=i<=lim1 && stampati i strati della torta)
  69.  
  70. for(int j = 0; j < lim2; j++) { // R=(0<=j<=lim2 && stampate j righe dello strato corrente i)
  71.  
  72. for(int k = 0; k < lim3; k++) { // R=(0<=k<=lim3 && stampate k colonne della riga j dello strato i)
  73. cout << array[i*lim2*lim3+j*lim3+k] << " ";
  74. }
  75.  
  76. cout << endl;
  77. }
  78. }
  79. }
  80. // POST=(e' stata stampata la torta richiesta)
  81.  
  82. /*
  83. PROVA DI CORRETTEZZA:
  84. 1. INIZIO: quadIndex = 0, viene letto val
  85. ==> R diventa: sono stati inseriti 0 elementi nella quadrupla corrente && val e' l'ultimo elemento letto
  86. && sono state lette 0 quadruple complete && sono state svolte tutte le modifiche relative alle quadruple lette (0)
  87. ==> R viene rispettata
  88.  
  89. 2. INVARIANZA
  90. condizione: val != -1
  91. quindi entro nel ciclo, viene introdotto un ulteriore valore (precedentemente letto) nella quadrupla corrente,
  92. se a questo punto la quadrupla e' completa, viene richiamata due volte la funzione TV e viene effettuato lo scambio.
  93. L'indice generale viene incrementato e viene letto un nuovo valore di val.
  94. => vale quindi R
  95.  
  96. 3. FINE
  97. condizione: val == -1
  98. !(val != -1) => val == -1 => POST
  99.  
  100. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement