Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - da stringa a float e calcolo distanza punti su un piano cartesinano
Forum - C# / VB.NET - da stringa a float e calcolo distanza punti su un piano cartesinano - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 17:50
Giovedì, 01/10/2009
io nel regolamento non ho trovato scritto che non si può chiedere aiuto per un esercizio (se mi dici dove è scritto mi faresti un favore) e se non ci fosse scritto sei libero di non aiutarmi.
comunque l'esercizio è stato assegnato per casa da il prof. di laboratorio che abbiamo da poco e non sa cosa abbiamo fatto l'anno scorso e uno arriva a casa per fare l'esecizio con le idee un pò confuse perchè certe cose magari non ci sono state spiegate.
l'esercizio non è urgente però io ho chiesto aiuto qui perchè mi piace programmare e quando ho dei dubbi preferisco levarmeli subito senza dover aspettare di avere lezione con questo prof.
se non mi vuoi chiarire le idee tu (o non puoi per via del regolamento) avrò le idee chiare la prossima lezione.

ps:per la domanda delle combinazioni ho risolto oggi a scuola grazie al prof. di teoria.

Ultima modifica effettuata da microprocessore il 01/10/2009 alle 17:55
PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 20:46
Giovedì, 01/10/2009
Testo quotato

Postato originariamente da microprocessore:
io nel regolamento non ho trovato scritto che non si può chiedere aiuto per un esercizio


Il regolamento per questa sezione lo ha scritto lui :D dubito che possa sbagliarsi...

Testo quotato

Tratto da Regolamento:
- Non richiedere listati già pronti
Nonostante siano davvero pochi i casi di questo tipo (e mi fa piacere), alcuni utenti postano una discussione richiedendo espressamente un sorgente già pronto per eseguire una certa azione. Dato che il forum non è un fast-food, ma serve ad aiutare a risolvere i problemi in modo ragionato e con uno scambio di opinioni, è severamente vietato aprire topic del genere, pena la chiusura immediata.


PM Quote
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 21:58
Giovedì, 01/10/2009
ma io non ho chiesto nulla di pronto... ho semplicemente chiesto che ragionamento logico fare visto che in questo forum c'è tantissima gente che ha conoscenze di programmazione molto superiori di quelle che ho io che studio informatica da poco più di un anno...
anche perchè avessi avuto il codice sorgente pronto per il copia e incolla non avrei imparato niente e io mi sono iscritto a questo forum per imparare qualcosa da chi ha maggiori conoscenze delle mie.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:34
Venerdì, 02/10/2009
Testo quotato

Postato originariamente da microprocessore:

ma io non ho chiesto nulla di pronto... ho semplicemente chiesto che ragionamento logico fare visto che in questo forum c'è tantissima gente che ha conoscenze di programmazione molto superiori di quelle che ho io che studio informatica da poco più di un anno...
anche perchè avessi avuto il codice sorgente pronto per il copia e incolla non avrei imparato niente e io mi sono iscritto a questo forum per imparare qualcosa da chi ha maggiori conoscenze delle mie.



il tuo ragionamento fila, peccato che non hai considerato l'assoluta semplicità dell'esercizio, riguardo al quale basta concentrarsi 10 minuti e si risolve da solo.

cmq le conversioni implicite sono il male, questo è il modo corretto di convertire una stringa in un float in C#:

Codice sorgente - presumibilmente C# / VB.NET

  1. string sStr = ...;
  2.  
  3. try {
  4.  
  5.     float fNum = float.parse(sStr);
  6.  
  7.     [...]
  8.  
  9. } catch(FormatException ex) {
  10.     Console.WriteLine(" !> Formato numero non riconosciuto");
  11. }




PM Quote
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 18:48
Venerdì, 02/10/2009
ringrazio nuovamenti chi si è interessato al mio problema... ma ora c'hanno cambiato la consegna del compito il vettore e del tipo della strutture con 2 campi di tipo int, uno per x e uno per y... non ho problemi nella logico del programma... ho finito il codice ma nel debug a volte mi trovo il valore "non un numero reale" nel vettore delle distanze...
per esempio da utente specifico che nello spazio ci devono essere 3 punti con le seguenti coordinate: (1,1) (2,2) (3,3).

mentre altre volte non mi viene considerata la parte di codice in cui voglio far visualizzare il contenuto del vettore che registra le distanze.
ecco il codice che ho sviluppato...sapere aiutarmi?

Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace punti_sul_piano_cartesiano
  7. {
  8.     class Program
  9.     {
  10.         //creo la struttura per il vettore
  11.         struct coordinate
  12.         {
  13.             public int x;
  14.             public int y;
  15.         }
  16.         static void Main(string[] args)
  17.         {
  18.             //imposto la lunghezza del vettore e il numero dei punti
  19.             int n;
  20.             Console.WriteLine("inserire il numero di punti presenti nel piano cartesiano");
  21.             n = Convert.ToInt32(Console.ReadLine());
  22.  
  23.             //dichiaro la variabile contatore
  24.             int k = 0;
  25.  
  26.             //dichiaro e carico il vettore
  27.             coordinate[] punti = new coordinate[n];
  28.             Console.WriteLine("Coordinate punti");
  29.             for (k = 0; k < n; k++)
  30.             {
  31.                 Console.WriteLine("Inserire la coordinata x del " + (k + 1) + "° punto");
  32.                 punti[k].x = Convert.ToInt32(Console.ReadLine());
  33.                 Console.WriteLine("Inserire la coordinata y del " + (k + 1) + "° punto");
  34.                 punti[k].y = Convert.ToInt32(Console.ReadLine());
  35.             }
  36.  
  37.             //calcolo la lunghezza del vettore delle distanza e il numero delle combinazioni dei punti presi 2 a 2
  38.             int combinazioni;
  39.             combinazioni = n * (n - 1) / 2;
  40.  
  41.             //dichiaro e carico il vettore delle distanze
  42.             double[] distanze = new double[combinazioni];
  43.             for (k = 0; k < combinazioni; k++)
  44.             {
  45.                 int z;
  46.  
  47.                 for (z = k+1; z < combinazioni; z++)
  48.                 {
  49.                     if (punti[k].x == punti[z].x && punti[k].y == punti[z].y)
  50.                     {
  51.                         distanze[k] = 0;
  52.                     }
  53.  
  54.                     if (punti[k].x != punti[z].x && punti[k].y == punti[z].y)
  55.                     {
  56.                         if (punti[k].x > punti[z].x)
  57.                         {
  58.                             distanze[k] = punti[k].x - punti[z].x;
  59.                         }
  60.                         else
  61.                         {
  62.                             distanze[k] = punti[z].x - punti[k].x;
  63.                         }
  64.                     }
  65.  
  66.                     if (punti[k].x == punti[z].x && punti[k].y != punti[z].y)
  67.                     {
  68.                         if (punti[k].y > punti[z].y)
  69.                         {
  70.                             distanze[k] = punti[k].y - punti[z].y;
  71.                         }
  72.                         else
  73.                         {
  74.                             distanze[k] = punti[z].y - punti[k].y;
  75.                         }
  76.                     }
  77.  
  78.                     if (punti[k].x != punti[z].x && punti[k].y != punti[z].y)
  79.                     {
  80.                         distanze[k] = Math.Sqrt(((punti[k].x - punti[z].x) ^ 2) + ((punti[k].y - punti[z].y) ^ 2));
  81.                     }
  82.                 }
  83.             }
  84.            
  85.             //visualizzo il contenuto del valore delle distanze
  86.             Console.WriteLine("Distanze");
  87.             for (k = 0; k < combinazioni; k++)
  88.             {
  89.                 for (int z = k+1; z < combinazioni; z++)
  90.                 {
  91.                     Console.WriteLine("La distanza dal punto " + (k + 1) + " al punto " + (z+1) + " è di " + distanze[k]);
  92.                 }
  93.             }
  94.  
  95.             Console.ReadLine();
  96.  
  97.         }
  98.     }
  99. }


Ultima modifica effettuata da Il Totem il 02/10/2009 alle 18:57
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:09
Venerdì, 02/10/2009
Non ho capito certe cose...

Se i punti li prendi a due a due, l'array delle distanze dovrebbe avere n-1 elementi, e non (n-1)*n/2 (che equivale alla somma degli interi da 1 a n-1). Infatti, quando n=4, le combinazioni sono 6, e tenti di accedere, ad esempio, a punti[5], che non esiste. Il fatto che non ti abbia dato errore indica che hai tentato con 3 o meno punti.

Inoltre, tutto il codice degli if, può essere ridotto a:
if ((punti[k].x == punti[z].x) || (punti[k].y == punti[z].y))
{
    distanze[k] = Math.Abs(punti[k].x - punti[z].x) + Math.Abs(punti[k].y - punti[z].y);
}

Il valore NaN (not a number) deriva da operazioni come 0/0, radici di numeri negativi od operazioni con altri valori NaN. Credo sia il secondo caso.

Comunque dovresti aprire una nuova discussione per questo argomento, dato che è diverso dal post iniziale.

PM Quote
Avatar
microprocessore (Normal User)
Pro


Messaggi: 146
Iscritto: 18/06/2009

Segnala al moderatore
Postato alle 7:17
Sabato, 03/10/2009
Testo quotato

Postato originariamente da Il Totem:

Non ho capito certe cose...

Se i punti li prendi a due a due, l'array delle distanze dovrebbe avere n-1 elementi, e non (n-1)*n/2 (che equivale alla somma degli interi da 1 a n-1). Infatti, quando n=4, le combinazioni sono 6, e tenti di accedere, ad esempio, a punti[5], che non esiste. Il fatto che non ti abbia dato errore indica che hai tentato con 3 o meno punti.


quando dici che l'array delle distanza dovrebbe avere n-1 elementi intendi n-1 celle?
perchè la formula del calcolo delle combinazioni di n elementi presi 2 a 2 è uguale a: n(n-1)/2... quindi considerando che il vettore delle distanze deve memorizzare tutte le combinazioni io ho creato un tot di celle pari a n+(n-1)/2.

per quanto riguarda il problema nel "non numero reale" cosa mi consigli di fare?... anche secondo me è dovuto al fatto dei numeri negativi

usando il tuo codice degli if mi da sempre 0
e poi sbaglio o ci vorrebbe comnque un' else con l'esecuzione del teorema di pitagora?

Ultima modifica effettuata da microprocessore il 03/10/2009 alle 11:32
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:20
Domenica, 04/10/2009
Testo quotato

Postato originariamente da microprocessore:
quando dici che l'array delle distanza dovrebbe avere n-1 elementi intendi n-1 celle?
perchè la formula del calcolo delle combinazioni di n elementi presi 2 a 2 è uguale a: n(n-1)/2... quindi considerando che il vettore delle distanze deve memorizzare tutte le combinazioni io ho creato un tot di celle pari a n+(n-1)/2.

per quanto riguarda il problema nel "non numero reale" cosa mi consigli di fare?... anche secondo me è dovuto al fatto dei numeri negativi

usando il tuo codice degli if mi da sempre 0
e poi sbaglio o ci vorrebbe comnque un' else con l'esecuzione del teorema di pitagora?



Non avevo capito che tu volessi calcolare tutte le possibili distanze tra due punti qualsiasi. In questo caso, sì, la formula è per puro caso simile a quella della somma delle successioni aritmetiche parziali. In modo rigoroso si avrebbero delle combinazioni semplici di n elementi di classe 2, ossia:
C(n, 2) = D(n, 2) / P(2) = (n * (n - 1)) / 2! = n * (n - 1) / 2
Ma comunque rimane il fatto che non puoi prendere l'elemento punti[k] con k che varia da 0 a C(n, 2) - 1, perchè andresti puntualmente fuori dai limiti dell'array. Hai sbagliato ad impostare il for, perchè il modo corretto sarebbe:
Codice sorgente - presumibilmente Plain Text

  1. for(k = 0; k < punti.Length - 1; k++)
  2.     for(z = k + 1, z < punti.Length; z++)
  3.       { ... }


Per indicizzare l'array distanze non puoi fare altro che prendere un'altra variabile contatore, ad esempio y, ed incrementarla di 1 ogni volta che hai eseguito il codice interno al secondo for (ossia ogni volta che hai aggiunto una nuova combinazione di punti).

Se il problema fossero i numeri negativi, dubito che riusciresti a leggere quello che sto scrivendo io, perchè da che mondo è mondo i valori in virgola mobile accettano sempre anche i valori negativi e se così non fosse ogni applicazione crasherebbe. Tutte le regole che valgono nella matematica valgono anche qui... ed il quadrato di un negativo è pur sempre positivo. Dovresti mettere un breakpoint prima dell'esecuzione di Sqrt e verificare i valori.

Il mio codice è esatto e se ti dà 0 sempre devi aver sbagliato qualcosa. Infatti, se la condizione è vera, almeno uno dei due Abs sarà 0: l'altro restituisce esattamente la differenza tra i valori, sia che il primo sia maggiore del secondo sia viceversa.
Ed è ovvio che ci vuole anche la parte dove applichi il teorema di Pitagora...

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo