Przypisywanie do napisu wartości liczbowej

0

Cześć,
Jestem totalnie początkującym programistą. Chciałbym napisać swój pierwszy użyteczny program a mianowicie - kalkulator rezystorów, koncepcje mam, ale brakuje mi dokładniejszej znajomości języka. Stąd pytanie : jak przypisać do jakiegoś napisu wartość liczbową ? Mam na myśli, że użytkownik wprowadza nazwę jakiegoś koloru - dajmy na to : czerwony i przypisuję sobie do tego koloru wartość 2. Mam zamiar zrobić to funkcją switch. Do tej pory tak to wygląda :

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

int main()
{
char kolor1[20], kolor2[20], kolor3[20], kolor4[20];
int x, y, z, q;

printf("Podaj pierwszy kolor : ");
gets(kolor1);
printf("Podaj drugi kolor : ");
gets(kolor2);
printf("Podaj trzeci kolor : ");
gets(kolor3);
printf("Podaj czwarty kolor : ");
gets(kolor4);



switch(kolor1[20])
{
case czarny:
	x=0;
case brazowy:
	x=1;
case czerwony:
	x=2;
}
0

Po 1 to nie wczytuj za pomocą gets tylko fgets co najwyżej. gets wczytuje wszystkie znaki z wejścia, a rezerwujesz pamięć tylko na 20 (lub raczej, na 19). Jeśli podasz swojemu programowi napis dłuższy, to Twój program może się wywalić. Nadto komitet standaryzacyjny języka C wyrzucił jakiś czas temu funkcję gets z języka.

Po 2: Ja na Twoim miejscu nie bawiłbym się tutaj w switcha czy próby przypisania liczby do napisu. Użyj strcmp do porównania napisu i zamiast switch drabinkę if else.

0

Kompiluje ci się ta wyliczanka na początku?

0

Tak

0
#include <stdio.h>
#include <string.h>

enum kolor {CZARNY, BRAZOWY, CZERWONY};
 
int main()
{
  int liczba_kolorow = 4;
  char kolor_napis[20];
  enum kolor k[liczba_kolorow];
  
  for(int i = 0; i < liczba_kolorow; ++i)
  {
    // %19 a nie %20: musi wczytać nie więcej niż 19 znaków,
    // bo jeszcze musi mieć miejsce na znak '\0' który automatycznie
    // wstawia na koniec
    scanf("%19s", kolor_napis);
    
    if(strcmp(kolor_napis, "czarny") == 0)
      k[i] = CZARNY;
    else if(strcmp(kolor_napis, "brazowy") == 0)
      k[i] = BRAZOWY;
    else if(strcmp(kolor_napis, "czerwony") == 0)
      k[i] = CZERWONY;
    else
    // Został podany zły kolor; return -1 to brutalne rozwiązanie w takim
    // wypadku, jeśli chcesz możesz zrobić inaczej
      return -1;
  }
}
0

A gdyby Ci powyższe nie chciało się kompilować z powodu zbyt starego kompilatora:

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

enum kolor {CZARNY, BRAZOWY, CZERWONY};
 
int main()
{
  int liczba_kolorow = 4;
  char kolor_napis[20];
  enum kolor k[liczba_kolorow];
  int i;
  
  for(i = 0; i < liczba_kolorow; ++i)
  {
    /* %19 a nie %20: musi wczytać nie więcej niż 19 znaków,
       bo jeszcze musi mieć miejsce na znak '\0' który automatycznie
       wstawia na koniec */
    scanf("%19s", kolor_napis);
    
    if(strcmp(kolor_napis, "czarny") == 0)
      k[i] = CZARNY;
    else if(strcmp(kolor_napis, "brazowy") == 0)
      k[i] = BRAZOWY;
    else if(strcmp(kolor_napis, "czerwony") == 0)
      k[i] = CZERWONY;
    else
    /* Został podany zły kolor; return -1 to brutalne rozwiązanie w takim
       wypadku, jeśli chcesz możesz zrobić inaczej */
      return -1;
  }
}
0

Dzięki wielkie. Używam MS Visual 2012, pobrać 2015 ?

0
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

enum color{
	color_black = 0,
	color_red = 0xff0000,
	color_green = 0x00ff00,
	color_blue = 0x0000ff,
	color_yellow = color_red | color_green,
	color_magenta = color_red | color_blue,
	color_cyan = color_green | color_blue
};

bool str_to_color(const char *colname, enum color *colval){
	if(!strcmp(colname, "black")){
		*colval = color_black;
		return true;
	}
	if(!strcmp(colname, "red")){
		*colval = color_red;
		return true;
	}
	if(!strcmp(colname, "green")){
		*colval = color_green;
		return true;;
	}
	if(!strcmp(colname, "blue")){
		*colval = color_blue;
		return true;
	}
	if(!strcmp(colname, "yellow")){
		*colval = color_yellow;
		return true;
	}
	if(!strcmp(colname, "magenta")){
		*colval = color_magenta;
		return true;
	}
	if(!strcmp(colname, "cyan")){
		*colval = color_cyan;
		return true;
	}
	return false;
}

int main(void) {
	enum color col;
	char buff[64];
	while(scanf("%63s ", buff) == 1){
		if(str_to_color(buff, &col)){
			printf("%#08x\n", col);
		}
		else{
			puts("Wrong color.");
		}
	}
	return 0;
}

Przy czym widać, że przydała by się jakaś magia z makrami.

http://ideone.com/DnmlUx

0

strcmp - zwraca 0 jeśli napisy są identyczne

O enum czy o scanf poczytaj gdzieś sobie, pełno jest tutoriali choćby w internecie które o tym traktują

enum kolor to w zasadzie ładniejsza forma na int x gdzie x==0 oznacza że kolor jest czarny, x==1 że jest brązowy itd. enum robi podobnie, tyle że nie musisz pamiętać, która liczba to który kolor -> mniejsza szansa że zrobisz błąd

Aha, i używaj tablic, a nie nazywaj zmiennych kolor1, kolor2 itd. Przy 3 kolorach to może to się jeszcze wydawać akceptowalne, ale co gdybyś miał tych kolorów 50 lub chociażby 10? Tablice potrafią to rozwiązać

0

Używam MS Visual 2012, pobrać 2015 ?

Olej, chyba że będziesz potrzebował jakieś funkcji, która jest tylko w nowszej wersji i będzie Ci to bardzo utrudniało życie. Albo, chyba że chcesz.

0
struct { const char *name; char mark; double precision; } tb[]=
  {
   {"czarny",       '\0', 0.00},
   {"brazowy",      'F',  1.00},
   {"czerwony",     'G',  2.00},
   {"pomaranczowy", '\0', 0.00},
   {"zolty",        '\0', 0.00},
   {"zielony",      'D',  0.50},
   {"niebieski",    'C',  0.25},
   {"fioletowy",    'B',  0.10},
   {"szary",        'A',  0.05},
   {"bialy",        '\0', 0.00},
   {"zloty",        'J',  5.00},
   {"srebrny",      'K', 10.00},
  };

int find(const char *name)
  {
   int i;
   for(i=0;i<sizeof(tb)/sizeof(*tb);++i) if(!strcmp(name,tb[i].name)) return i;
   return -1;
  } 

int read()
  {
   char buff[16];
   int i;
   if(scanf(" %15s",buff)!=1) return -1;
   return find(buff);
  } 

bool digit(int *val)
  {
   *val=read();
   return (0<=*val)&&(*val<10);
  }
 
bool power(int *val)
  {
   *val=read();
   return (0<=*val)&&(*val<=7);
  }
 
bool precision(char *buff)
  {
   int i;
   i=read();
   if(i>=0) sprintf(buff,"+/- %lg%% (%c)",tb[i].precision,tb[i].mark);
   return (i>=0)&&(tb[i].mark);
  }

int main()
  {
   char buff[16];
   int a,b,c,p;
   for(;;)
     {
      printf("Podaj oznaczenie: ");
      if(digit(&a)&&digit(&b)&&digit(&c)&&power(&p)&&precision(buff))
        {
         printf("%lg %s\n\n",((a*10+b)*10+c)*pow(10,p),buff);
        }        
      else printf("Niepoprawnie odczytane kolory\n\n");
     }
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1