Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Värin nimi luvuksi taulukosta

kuutso [04.11.2009 12:44:09]

#

Saisko jotenkin tästä arvon "400" jos laitan

int a,b,c;
scanf("%d %d %d", &a, &b, &c); // annetaan kolme väriä
"yellow black brown"

yellow = 4
 black = 0
 brown = 1                     // värien arvot
 c =                           // nollien määrä

printf("%d%d%d",a,b,c);     // tulostaa värikoodin arvon

tämä ei anna arvoa 400 mutta onko se jotenkin tohon tapaan?

Teuro [04.11.2009 12:57:38]

#

No ei saa tuota kyllä millään. Tuossahan luetaan a, b, c muuttujiin jotain lukuja, jotka tulkitaan int luvuiksi. Sen jälkeen on virheellinen merkkijono literaali, jolle ei ole tyyppiä. Implisiittisesti siitä tulisi char* osoitin, mutta C ei tue implisiittistä muunnosta. Lopuksi on jotain määrittelemättömiä muuttujia, jotka tulkitaan int luvuiksi. Viimeisimpänä c =, josta pitäisi tulla virhe, että odotetaan ; -merkkiä.

kuutso [04.11.2009 13:03:01]

#

Mulla on tässä koodissa muuttaa ohmit värikoodiksi.
En tiiä tulisko se samalla tavalla, mutta tietysti eri jutut tonne.

char colors[10][7]=
     {
     "black",
     "brown",
     "red",
     "orange",
     "yellow",
     "green",
     "blue",
     "violet",
     "gray",
     "white"
     };
int value_1, value_2, value_3=0;
float R, temp;

system("cls");
printf("Anna resistanssi ohmeina:");
scanf("%f", &R);
temp=R;
while(temp>=100.0)
                  {
                         temp=temp/10.0;
                         ++value_3;
                         }
value_1=(int)(temp/10.0);
value_2=(int)(temp-10.0*value_1);

printf("Varikoodi on: %s - %s - %s.", colors[value_1], colors[value_2], colors[value_3]);

}

Torgo [04.11.2009 13:21:52]

#

Tarkoitatko nyt sitä että käyttäjää pyydetään syöttämään kolme väriä merkkijonona ja ohjelma muuttaa sen numeroksi? Eli jos käyttäjä syöttää vaikka tuon "yellow black brown", niin ohjelman tulisi suoltaa ulos "401"?

Jos noin, niin sinun täytyy skannata syöte merkkijonona, eikä kokonaislukuna (%s eikä %d). Ja luonnollisesti muuttujienkin on oltava samalla merkkijonoja. Nähtävästi talukossa merkkijonot ovat char[7], niin sitä tyyppiä olisi hyvä skannatakin. Siis:

char a[7], b[7], c[7];
scanf("%s %s %s", a, b, c);

Sitten etsit merkkijonojen paikan taulukosta vaikka for-silmukan ja strncmp:n avulla.

kuutso [04.11.2009 13:38:42]

#

Torgo kirjoitti:

Tarkoitatko nyt sitä että käyttäjää pyydetään syöttämään kolme väriä merkkijonona ja ohjelma muuttaa sen numeroksi? Eli jos käyttäjä syöttää vaikka tuon "yellow black brown", niin ohjelman tulisi suoltaa ulos "401"?

Jos noin, niin sinun täytyy skannata syöte merkkijonona, eikä kokonaislukuna (%s eikä %d). Ja luonnollisesti muuttujienkin on oltava samalla merkkijonoja. Nähtävästi talukossa merkkijonot ovat char[7], niin sitä tyyppiä olisi hyvä skannatakin. Siis:

char a[7], b[7], c[7];
scanf("%s %s %s", a, b, c);

Sitten etsit merkkijonojen paikan taulukosta vaikka for-silmukan ja strncmp:n avulla.

Mulla on tuo ohmeista värikoodiksi ja toimii.
Ja nyt ongelma tuli tossa että värikoodista ohmeiksi.
- pyydetään kolme väriä. Kolme noista väreistä mitä nyt on saatavilla. arvot ovat samat kuin oikeissa värikoodeissa.
- muuntaa värikoodin ohmeiksi esim. yellow black brown on ohmeina 400.
kolmas väri kertoo nollien määrän esim. brown on 1 eli yksi 0 jos kolmas väri oisi vaikka yellow niin nollia olisi neljä 0000.

Metabolix [04.11.2009 13:43:22]

#

Kuten Teuro sanoi: lue käyttäjän syötteet teksteinä (%s ja char-taulukko) ja etsi ne värilistasta for-silmukalla. Oikea numero on se, jonka kohdalla strcmp-funktio tunnistaa tekstit samoiksi. Jos silmukan ymmärtäminen tuntuu vaikealta, voit tehdä muunnoksen aluksi (tietysti opettelet myöhemmin paremmin) myös rumalla toistolla:

int numero(const char *vari) {
  if (strcmp(vari, "black") == 0) return 0;
  if (strcmp(vari, "brown") == 0) return 1;
  /* ... */
  return -1;
}
/* if (numero(vari) == -1) printf("Virhe!\n"); */

kuutso [04.11.2009 14:46:55]

#

Sain toimimaan.
kiitoksia!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta