Benvenuto su Inforge
Rimuovi la pubblicità e partecipa alla più grande comunità italiana sul mondo digitale presente sul web sin dal 2007.
Iscriviti

Discussione Ufficiale Programmiamo con Inforge | Esercitazione 05 in C | Livello difficile

Una Discussione Ufficiale punta a raccogliere tutte le informazioni su un argomento o un fatto di attualità, con costanti aggiornamenti da parte del creatore e dei partecipanti.

Not an engineer

Moderatore
31 Ottobre 2011
2,489
839
620
Ultima modifica:
main.png


Programmiamo con Inforge | Presentazione

Ad oggi, sul web, si trovano moltissime guide sui vari linguaggi di programmazione e sulle loro molteplici applicazioni. Tuttavia, chi si approccia a queste risorse, non sempre riesce a mettere in pratica ciò che ha appreso. Al fine di limitare queste mancanze, nasce Programmiamo con Inforge.

In questa rubrica potrai scrivere codice per la risoluzione di alcuni problemi legati alla programmazione, mettendo in pratica quanto stai apprendendo dalla teoria oppure mostrando le tue abilità e competenze nel campo dell’informatica.


Partiamo dalle basi del C

In questa guida puoi trovare i testi per studiare e approfondire il C: I migliori libri per imparare e approfondire il C
In questa discussione puoi trovare le risposte alle domande più frequenti su come scrivere codice in C: Frequently asked questions: da dove si parte?


Esercitazione 05 in C | Livello difficile | [Spirale]


Soluzioni


Per rendere l'esercitazione più interessante, non verrà pubblicata alcuna soluzione! Spetterà a te scrivere la tua versione del codice e pubblicarla in questo thread così che possa essere valutata dai moderatori e dalla community; il modo migliore per imparare!

Conclusioni


Pubblica la soluzione ottimale per risolvere gli esercizi e ricorda che puoi confrontarti con il resto della community in questo thread, chiedere aiuto o aiutare gli altri ;)
 
Supporta Inforge con un acquisto su NordVPN
Supporta Inforge con una donazione
Supporta Inforge con un acquisto su NordVPN
Rodnia -  The Great Conqueror

EcvdSama

Utente Iron
11 Maggio 2021
3
6
8
Soluzione meme, probabilmente si comporta peggio delle altre soluzioni ma è stato divertente scriverla.
Non ho pulito o riletto il codice.
Non ho messo input il codice è settato per una matrice 30x30 e per cambiare le dimensioni bisogna cambiare il valore di n nel main.
Ho testato con successo fino a una matrice 20k x 20k dopo di che inizia ad avere qualche problema di allocazione :v

C:
#include <stdio.h>
#include <stdlib.h>
int** start(int n);
void right(int** mat,int i,int x, int n);
void down(int** mat, int i,int x, int n);
void left(int** mat, int i,int x, int n);
void up(int** mat, int i,int x, int n);
int** start(int n){
    int** result = (int**)calloc(1,n*sizeof(int*)+n*n*sizeof(int));
    if (result == NULL){
        fprintf(stderr, "Sbiriguda");
        exit(1);
    }
    int**pstart=result;
    int*dstart=(int*)(result+n);
    for (int i=0;i<n;++i){
        *pstart++=dstart;
        dstart=dstart+n;
    }
    right(result,0,1,n);
    return result;
}
void right(int** mat, int i, int x, int n){
    for(int j=i; j<n-i;j++){
        mat[i][j]=x++;
    }
    if(x<=n*n){
        down(mat,i,x,n);
    }
}
void down(int** mat, int i, int x, int n){
    for(int j=i+1; j<n-i;j++){
        mat[j][n-1-i]=x++;
    }
    if(x<=n*n){
        left(mat,i,x,n);
    }
}
void left(int** mat, int i, int x, int n){
    for(int j=n-i-2; j>=i;j--){
        mat[n-1-i][j]=x++;
    }
    if(x<=n*n){
        up(mat,i,x,n);
    }
}
void up(int** mat, int i, int x, int n){
    for(int j=n-i-2; j>=i+1;j--){
        mat[j][i]=x++;
    }
    if(x<=n*n){
        right(mat,++i,x,n);
    }
}
int main(){
    int n=30;
    int **mat=start(n);
    for (int i=0; i<n;i++){
        for (int j=0; j<n; j++){
            printf("%3d ",mat[i][j]);
        }
        printf("\n");
    }
    return 0;
}
 

kernelspace

Utente Iron
17 Giugno 2021
43
22
18
bello !

anche se tardi ho giocato anche io

Codice:
/*
 * Siprale, per inforge
 *
 * in linux (o mingw):
 *    gcc -o spirale main.c
 */

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

void err(char *msg)
{
    printf("error: %s\n", msg);
    exit(1);
}

enum senso {
    dx,
    giu,
    sx,
    su,
};

/*
 * Spirale ha
 */
void crea_spirale(int n)
{
    int i, q, val, cur, tot, line_cnt, line_len;
    enum senso senso = dx;
    unsigned char *p, *out;

    tot = n * n;

    p = (unsigned char *)malloc(tot);

    if (!p)
        err("errore allocazione memoria");

    line_len = n;
    line_cnt = 0;
    tot = n * n;

    for (cur = -1, val = 1, i = 0; i < tot; ++i, ++val) {

        switch (senso) {
        case dx:
            cur++;
            break;
        case giu:
            cur += n;
            break;
        case sx:
            cur--;
            break;
        case su:
            cur -= n;
            break;
        }

        p[cur] = val;

        if (++line_cnt == line_len) {
            line_cnt = 0;
            switch (senso) {
            case dx:
                line_len--;
                senso++;
                break;
            case giu:
                senso++;
                break;
            case sx:
                line_len--;
                senso++;
                break;
            case su:
                senso = dx;
                break;
            }
        }
    }

    printf("\n");
    for (out = p, i = 0; i < n; ++i) {
        for (q = 0; q < n; ++q)
            printf("%-3d ", *out++);
        printf("\n");
    }
}

int main(void)
{
    int n, val = 0;

    printf("spirale v.090 (alpha), built %s %s\n\n", __DATE__, __TIME__);
    printf("inserisci n (1 a 100) ");

    while ((n = getchar()) != '\n') {

        if (n < 48 || n > 57)
            err("invalid value");

        val *= 10;
        val += n - 48;
    }

    if (val > 100)
        err("100 possono bastare, dai.");

    crea_spirale(val);

    return 0;
}

[email protected] ~/tests/spirale (master*) $ gcc -o spirale main.c
[email protected] ~/tests/spirale (master*) $ ./spirale
spirale v.090 (alpha), built Jun 17 2021 14:37:50

inserisci n (1 a 100) 10

1   2   3   4   5   6   7   8   9   10  
36  37  38  39  40  41  42  43  44  11  
35  64  65  66  67  68  69  70  45  12  
34  63  84  85  86  87  88  71  46  13  
33  62  83  96  97  98  89  72  47  14  
32  61  82  95  100 99  90  73  48  15  
31  60  81  94  93  92  91  74  49  16  
30  59  80  79  78  77  76  75  50  17  
29  58  57  56  55  54  53  52  51  18  
28  27  26  25  24  23  22  21  20  19  

[email protected] ~/tests/spirale (master*) $ ./spirale            
spirale v.090 (alpha), built Jun 17 2021 14:39:17

inserisci n (1 a 100) 15

1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  
56  57  58  59  60  61  62  63  64  65  66  67  68  69  16  
55  104 105 106 107 108 109 110 111 112 113 114 115 70  17  
54  103 144 145 146 147 148 149 150 151 152 153 116 71  18  
53  102 143 176 177 178 179 180 181 182 183 154 117 72  19  
52  101 142 175 200 201 202 203 204 205 184 155 118 73  20  
51  100 141 174 199 216 217 218 219 206 185 156 119 74  21  
50  99  140 173 198 215 224 225 220 207 186 157 120 75  22  
49  98  139 172 197 214 223 222 221 208 187 158 121 76  23  
48  97  138 171 196 213 212 211 210 209 188 159 122 77  24  
47  96  137 170 195 194 193 192 191 190 189 160 123 78  25  
46  95  136 169 168 167 166 165 164 163 162 161 124 79  26  
45  94  135 134 133 132 131 130 129 128 127 126 125 80  27  
44  93  92  91  90  89  88  87  86  85  84  83  82  81  28  
43  42  41  40  39  38  37  36  35  34  33  32  31  30  29  
[email protected] ~/tests/spirale (master*) $
 
Rodnia -  The Great Conqueror
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker