Risolto Esercizio array in C

alessina02

Utente Bronze
2 Gennaio 2022
35
11
0
25
Buonasera, il mio esercizio richiede di leggere due input h e k da tastiera e poi legge h vettori di lunghezza k. Il fatto è che non capisco come fare a inizializzare h array senza sapere che numero è h. Non posso usare un ciclo while perchè mi sovrascriverebbe i dati
 
Ciao! Come dici tu, non puoi inizializzare "h" vettori senza sapere quanto vale h. Quindi, per prima cosa, leggi quanto vale h, poi inizializzi i vettori. Ti scrivo dello pseudo codice, prova a implementarlo poi, se hai problemi, condividi fin dove sei arrivata e vediamo di aiutarti:


Codice:
h := read_input()
k := read_input()

arrays := malloc(h)

for i := 0; i < h; i++ {
    arrays[i] = malloc(k)
    
    for j := 0; j < k; j ++ {
        arrays[i][j] = read_input()
    }
}


Se invece non puoi creare array multidimensionali, basta che crei un solo array di dimensione (h*k). Cosi anche più efficiente…
 
Ultima modifica:
Sono riuscita ad inizializzare gli array, ma adesso sono bloccata su un altro punto. In pratica l'esercizio mi chiede di stampare i due vettori che hanno il minor numero di cifre diverse in posizioni uguali, in ordine di input (Esempio: con input h=4 e k=3
123 456 124 456 dovrebbe stampare 456-456 e 12[3]-12[4]). Il punto è che dovrei mettere tra parentesi i numeri che le due stringhe non hanno in comune e non so come fare.

C:
#include <stdio.h>
#include <stdlib.h>
int leggi_dato (int);
int main ()
{ int h,k,i,j,m,n,p,z1,y1,z2,y2;
 printf ("Inserisci due indici h="); //Da togliere
h=leggi_dato(h);
printf ("k="); //Da togliere
k=leggi_dato(k);
int **arrays;
arrays=malloc(k);
for (i=0; i<h; i++) {arrays[i]=malloc(k);
    for (j=0; j<k; j++) arrays[i][j]=leggi_dato(arrays);}
    
int x=k, t=k;
for (i=0; i<h; i++)
    {for (j=i+1; j<h; j++)
        {p=0; for (m=0; m<k; m++)
            {if (arrays[i][m]!=arrays[j][m]) p++;}
        if (p<x) {y2=y1; z2=z1; y1=i; z1=j; x=p;}
        else if (p<t){y2=i; z2=j; t=p;}}}
        
    
for (n=0; n<k; n++) {
 printf ("%d\t", arrays[y1][n]);}
 printf ("-\t");
for (n=0; n<k; n++) {
 printf ("%d\t", arrays [z1][n]);}

printf ("\n\n");
    
    
for (n=0; n<k; n++) {
 printf ("%d\t", arrays[y2][n]);}
 printf ("-\t");
for (n=0; n<k; n++) {
 printf ("%d\t", arrays [z2][n]);}



    return 0;
}



int leggi_dato (int a)
{scanf("%d", &a);
return a;}
 
Non ho capito quale sia lo scopo dell'esercizio. Puoi avere qualsiasi numero di vettori in input?

Dici "stampare i due vettori che hanno il minor numero di cifre diverse in posizioni uguali", ma poi di vettori ne stampi quattro.
Devi stamparli tutti i vettori, o solo scegliere i due vettori più simili ed evidenziare le loro differenze?

Se per ogni vettore devi trovare quello con una distanza minore, e non avere duplicati, e avere un qualsiasi numero di vettori in input, è un problema estremamente complicato. Se devi solo scegliere due vettori, invece, diventa più facile. Riusciresti a condividere il testo esatto?

Inoltre, attenzione, non bisogna ignorare i warnings ;-)

Codice:
gcc a.c
a.c: In function ‘main’:
a.c:20:39: warning: passing argument 1 of ‘leggi_dato’ makes integer from pointer without a cast [-Wint-conversion]
   20 |             arrays[i][j] = leggi_dato(arrays);
      |                                       ^~~~~~
      |                                       |
      |                                       int **
a.c:4:16: note: expected ‘int’ but argument is of type ‘int **’
    4 | int leggi_dato(int);
      |                ^~~

Puoi semplicemente non prendere nessun argomento come input in leggi_dato. Alla fine l'input non lo usi, quindi perché passarlo?
 
  • Mi piace
Reazioni: alessina02
In pratica devo scegliere i 4 vettori più simili tra loro a due a due ed evidenziare quando non sono uguali. Posso mettere quello che voglio in input. Il mio compilatore bypassava i warnings ma ho risolto mettendo lo scanf
Grazie mille