Problema con le strutture in c

di il
6 risposte

Problema con le strutture in c

"Scrivere un programma che riceve due punti dal piano cartesiano come argomenti e ne calcola la distanza"

La traccia originaria era molto più lunga e comprendeva più dati, ma preferisco focalizzarmi sul problema.

Penso subito a definire i punti come record di due variabili, una per ciascuna coordinata del punto.
Vi tralascio la parte "creativa" non essendo quello il problema: in seguito alle varie elucubrazioni esce fuori questo programmino:

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

struct punto {
float x;
float y;
};

float distanza (struct punto a, struct punto b){

float d;
float dx=a.x-b.x;
float dy=a.y-b.y;
d=sqrt(dx*dx+dy*dy);

return d;

}

int main(int argc, char * argv[]){

float d;
struct punto pt1;
struct punto pt2;

printf("inserire coordinata x1:");
scanf("%f\n", &pt1.x);

printf("inserire coordinata y1:");
scanf("%f\n", &pt1.y);

printf("inserire coordinata x2:");
scanf("%f\n", &pt2.x);

printf("inserire coordinata y2:");
scanf("%f\n", &pt2.y);

d=distanza(pt1, pt2);

printf("%f", d);

}

Lo mando in pasto al compilatore, il quale mi da l'ok, ma quando lo eseguo stampa a video questo simpaticissimo output:

inserire coordinata x1: //stampa a video il primo printf e attende che inserisca il valore chiesto dallo scanf
//mi chiede di inserire un altro valore senza stampare il secondo printf, completamente a caso
inserire coordinata y1: //all'improvviso spunta il secondo printf con annesso scanf
inserire coordinata x1: //continua a stampare la sequenza di printf e scanf normalmente
inserire coordinata y2: //ultimo printf con annessa attesa di un input: magicamente è comparso un 5°scanf


Il problema suppongo risieda nella zona che ho evidenziato in rosso, ma sono davvero senza idee, sia perchè il compilatore non segnala errori, sia perchè ho ricontrollato la struttura formale del programma così tante volte da averne perso il conto : ma sicuramente continuo a tralasciare qualche dettaglio, che spero la community possa aiutarmi a trovare.

6 Risposte

  • Re: Problema con le strutture in c

    Prova così
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct punto {
    float x;
    float y;
    };
    
    float distanza (struct punto a, struct punto b){
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    
    int main(int argc, char * argv[]){
    
    float d;
    struct punto pt1;
    struct punto pt2;
    
    printf("inserire coordinata x1:");
    fflush(stdout);
    scanf(" %f", &pt1.x);
    
    printf("inserire coordinata y1:");
    fflush(stdout);
    scanf(" %f", &pt1.y);
    
    printf("inserire coordinata x2:");
    fflush(stdout);
    scanf(" %f", &pt2.x);
    
    printf("inserire coordinata y2:");
    fflush(stdout);
    scanf(" %f", &pt2.y);
    
    d=distanza(pt1, pt2);
    
    printf(" %f", d);
    fflush(stdout);
    
    return 0;
    }
    
  • Re: Problema con le strutture in c

    Devi rimuovere i "\n" dagli scanf();
  • Re: Problema con le strutture in c

    Adesso funziona, grazie a entrambi, davvero inappuntabili!
  • Re: Problema con le strutture in c

    Ne approfitto vista la solerzia per fare chiarezza anche su un altro piccolo problema ricorrente.
    Evito di annoiare con la pappardella e introduco subito il dilemma:

    implemento una variabile "char", in modo da assegnare ad ogni coppia di coordinate anche una lettera
    struct punto{
    		char lettera;
    		float x;
    		float y;
    	};
    aggiungo nel main
      printf("inserire primo punto: ");
            pt1.lettera=getchar();
    e
    printf("inserire secondo punto: ");
            pt2.lettera=getchar();
    ottenendo un altro simpatico output
    inserire primo punto: a
    inserire coordinata x1: 2
    inserire coordinata y1: 3
    inserire secondo punto: inserire coordinata x2:
    in modo da evitare possibili dubbi, la sezione delle funzioni di i/o è:
      printf("inserire primo punto: ");
            pt1.lettera=getchar();
    
                    printf("inserire coordinata x1: ");
                    scanf("%f", &pt1.x);
    
                    printf("inserire coordinata y1: ");
                    scanf("%f", &pt1.y);
    
            printf("inserire secondo punto: ");
            pt2.lettera=getchar();
    
                    printf("inserire coordinata x2: ");
                    scanf("%f", &pt2.x);
    
                    printf("inserire coordinata y2: ");
                    scanf("%f", &pt2.y);
    
    confido in voi, grazie in anticipo!
  • Re: Problema con le strutture in c

    Vai avanti a usare scanf(), perché getchar()?
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct punto { 
    char lettera;   
    float x;
    float y;
    };
    
    float distanza (struct punto a, struct punto b){
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    
    int main(int argc, char * argv[]){
    
    float d;
    struct punto pt1;
    struct punto pt2;
    
    printf("inserire primo punto: ");
    fflush(stdout);
    scanf(" %c", &pt1.lettera);
    
    printf("inserire coordinata x1: ");
    fflush(stdout);
    scanf(" %f", &pt1.x);
    
    printf("inserire coordinata y1: ");
    fflush(stdout);
    scanf(" %f", &pt1.y);
    
    printf("inserire secondo punto: ");
    fflush(stdout);
    scanf(" %c", &pt2.lettera);
    
    printf("inserire coordinata x2: ");
    fflush(stdout);
    scanf(" %f", &pt2.x);
    
    printf("inserire coordinata y2: ");
    fflush(stdout);
    scanf(" %f", &pt2.y);
    
    d=distanza(pt1, pt2);
    
    printf("distanza tra %c e %c = %f", pt1.lettera, pt2.lettera, d);
    fflush(stdout);
    
    return 0;
    }
    
    Se invece vuoi padroneggiare tutte le funzioni di IO ti suggerisco di leggere molto bene la documentazione, compresa la parte che sembra inutile a prima vista (whitespace etc.)
  • Re: Problema con le strutture in c

    Ho difatti notato che negli scanf prima dell'operatore "%" lasci uno spazio: suppongo ci sia una motivazione per questo, e dovrò andare ad informarmi in merito.
    Detto ciò, ancora una volta, grazie per la disponibilità e l'efficacia della risposta!
Devi accedere o registrarti per scrivere nel forum
6 risposte