Skocz do zawartości
Husja

program w C, pomocy :(

Rekomendowane odpowiedzi

Cześć, mam problem z napisaniem pewnego programu. Nie wiem jak do niego podejść, nie mam kompletnie żadnego pomysłu, możecie mi pomóc? Treść mojego problemu wygląda tak: „Napisz funkcję do konwersji liczb zapisanych w notacji rzymskiej na liczby typu unsigned int oraz funkcję wykonującą przekształcenie odwrotne. Możesz ograniczyć się do liczb z zakresu 1-10000"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja bym to zrobił na samych if 'ach. Najpierw sprawdzał długość stringu prowadzonego jako liczba rzymska. A na stępnie tyle razy wykonywał pętle for() ile licz. A w pętli for dał same if znak==V to liczba+=5 if znak==X to liczba+=10 itp.

Co Ty na to ??

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak, ale...

wyjdzie mniej więcej coś takiego:[php:1:9fb86ae604]

char tab[20];

unsigned int liczba = 0;

int i;

cout<<"podaj liczbe rzymska ";

cin>>tab;

 

for(i = 0;i<20;i++)

{

if(tab=='M') liczba+=1000;

else if(tab=='C') liczba+=100;

else if(tab=='X') liczba+=10;

else if(tab=='V') liczba+=5;

else if(tab=='I') liczba++;

}

 

 

cout<<"liczba uint: "<<liczba;[/php:1:9fb86ae604]

 

ale nie będą działać takie liczby jak XL itp.

Co z tym zrobić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak, ale...

wyjdzie mniej więcej coś takiego:[php:1:7d4b52e7b6]

char tab[20];

unsigned int liczba = 0;

int i;

cout<<"podaj liczbe rzymska ";

cin>>tab;

 

for(i = 0;i<20;i++)

{

if(tab=='M') liczba+=1000;

else if(tab=='C') liczba+=100;

else if(tab=='X') liczba+=10;

else if(tab=='V') liczba+=5;

else if(tab=='I') liczba++;

}

 

 

cout<<"liczba uint: "<<liczba;[/php:1:7d4b52e7b6]

 

ale nie będą działać takie liczby jak XL itp.

Co z tym zrobić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

[php:1:ac0df27d4f]#include <iostream>

#include <stdlib.h>

 

using namespace std;

 

int zamien(char znak)

{

if(znak=='M') return 1000;

else if(znak=='C') return 100;

else if(znak=='X') return 10;

else if(znak=='V') return 5;

else if(znak=='I') return 1;

else return 0;

}

 

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

{

char tab[20];

unsigned int liczba = 0;

int i;

 

cout<<"podaj liczbe rzymska ";

cin>>tab;

 

liczba=zamien(tab[0]);

 

for(i=1; i<=strlen(tab)-1; ++i)

{

if(zamien(tab) > zamien(tab[i-1]))

{

liczba=zamien(tab) - liczba;

}

else

{

liczba+=zamien(tab);

}

}

 

cout << endl << liczba << endl;

 

system("PAUSE");

return 0;

}[/php:1:ac0df27d4f]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak na razie kombinuje i mam to:

[php:1:f05a72c98e]

#include <stdio.h>

#include <stdlib.h>

 

 

int zamien(char znak)

{

if(znak=='M') return 1000;

else if(znak=='C') return 100;

else if(znak=='X') return 10;

else if(znak=='V') return 5;

else if(znak=='I') return 1;

else return 0;

}

 

int main()

{

char tab[20];

unsigned int liczba = 0;

int i;

 

printf("podaj liczbe rzymska n");

for(i=0;i<strlen(tab);i++)

scanf("%c",&tab);

 

liczba=zamien(tab[0]);

 

for(i=0; i<strlen(tab)-1; i++)

{

if(zamien(tab) > zamien(tab[i-1]))

{

liczba=zamien(tab) - liczba;

}

else

{

liczba+=zamien(tab);

}

}

 

printf(" %in", liczba);

 

system("PAUSE");

return 0;

}[/php:1:f05a72c98e]

Ale nadal nie chce działać :(, proszę o daleszą pomoc :oops:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Prosze :)

[php:1:6dec87d22d]

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

 

int zamien(char znak)

{

if(znak=='M'||znak=='m') return 1000;

else if(znak=='D'||znak=='d') return 500;

else if(znak=='C'||znak=='c') return 100;

else if(znak=='L'||znak=='l') return 50;

else if(znak=='X'||znak=='x') return 10;

else if(znak=='V'||znak=='v') return 5;

else if(znak=='I'||znak=='i') return 1;

else return 0;

}

 

int main()

{

char tab[20];

int liczba = 0;

int i;

 

printf("podaj liczbe rzymska n");

scanf("%s",&tab);

 

 

int zamienn=0;

 

 

for(i=0; i<strlen(tab); i++)

{

if(zamien(tab) <= zamienn)

{

liczba+=zamien(tab);

}

else

{

liczba=liczba-2*zamienn+zamien(tab);

}

zamienn=zamien(tab);

}

 

printf(" %in", liczba);

 

getch();

return 0;

}

[/php:1:6dec87d22d]

 

Szczęśliwego Nowego Roku !!

Baw się dobrze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuje Wam za pomoc, bardzo mocno, diablenie mocno ]:-> :* pierwsza część już działa i wygląda tak:

[php:1:7346547e80]

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

 

int zamien(char znak)

{

if(znak=='M') return 1000;

else if(znak=='C') return 100;

else if(znak=='X') return 10;

else if(znak=='V') return 5;

else if(znak=='I') return 1;

else return 0;

}

 

int main()

{

char tab[20];

unsigned int liczba = 0;

int i;

 

printf("podaj liczbe rzymska n");

for(i=0;i<20;i++) {

scanf("%c",&tab);

if (!isalpha(tab))

break;

}

 

for(i=0; i<strlen(tab)-1; i++)

{

if(zamien(tab) < zamien(tab[i+1]))

liczba -= zamien(tab);

else

liczba+=zamien(tab);

}

 

printf(" %dn", liczba);

 

system("PAUSE");

return 0;

}

[/php:1:7346547e80]

niestety do pełni szczęścia potrzebuję jeszcze napisać funkcję, ale funkcję wykonującą przekształcenie odwrotne czyli działającej na odwrót… Jakieś propozycje?

:oops: :oops: :oops:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Troche poprawiłem swoją wersje działa teraz bardziej elegancko.

Chciałbym Ci tylko zwrócić uwagę że brakuje ci paru cyferek rzymskich...

 

[php:1:9279651512]

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

 

char rzym[14]={'M','m','D','d','C','c','L','l','X','x','V','v','I','i'};

int spr=0;

 

int zamien(char znak)

{

if(znak=='M'||znak=='m') return 1000;

else if(znak=='D'||znak=='d') return 500;

else if(znak=='C'||znak=='c') return 100;

else if(znak=='L'||znak=='l') return 50;

else if(znak=='X'||znak=='x') return 10;

else if(znak=='V'||znak=='v') return 5;

else if(znak=='I'||znak=='i') return 1;

else return 0;

}

 

void sprawdz(char *tab)

{

int i,j;

for(i=0;i<strlen(tab);i++)

{

for(j=0;j<14;j++)

{

if(tab==rzym[j])

{

spr=1;

break;

}

spr=0;

}

}

}

 

 

int main()

{

clrscr();

char tab[20];

int liczba = 0;

int i,j,zamienn=0;

 

printf("Podaj liczbe rzymska: nn");

scanf("%s",&tab);

 

sprawdz(tab);

 

if(spr==0)

{

printf("nnNieprawidlowe ciag wejsciowy !!");

getch;

return 0;

}

 

 

for(i=0; i<strlen(tab); i++)

{

if(zamien(tab) <= zamienn)

{

liczba+=zamien(tab);

}

else

{

liczba=liczba-2*zamienn+zamien(tab);

}

zamienn=zamien(tab);

}

printf("nLiczba arabska = %in", liczba);

getch();

return 0;

[/php:1:9279651512]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Prosze oto odwrotny, mógł być bardzie przejrzysty, ale ... :)

 

[php:1:dc13d78bc9]

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <iostream.h>

 

int arab[13]= { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};

char str[20];

 

int main()

{

clrscr();

int i=12,liczba=-1,z=0;

 

cout << "Podaj liczbe arabska: nn";

cin >> liczba;

 

while(liczba >0)

{

while ( liczba >= arab)

{

liczba -= arab;

if(i==0) {strcat(str,"I"); z+=1;}

else if(i==1) {strcat(str,"IV"); z+=2;}

else if(i==2) {strcat(str,"V"); z+=1;}

else if(i==3) {strcat(str,"IX"); z+=2;}

else if(i==4) {strcat(str,"X"); z+=1;}

else if(i==5) {strcat(str,"XL"); z+=2;}

else if(i==6) {strcat(str,"L"); z+=1;}

else if(i==7) {strcat(str,"XC"); z+=2;}

else if(i==8) {strcat(str,"C"); z+=1;}

else if(i==9) {strcat(str,"CD"); z+=2;}

else if(i==10) {strcat(str,"D"); z+=1;}

else if(i==11) {strcat(str,"CM"); z+=2;}

else if(i==12) {strcat(str,"M"); z+=1;}

}

 

i--;

}

cout << "nLiczba rzymska:n";

for(i=0;i<z;i++)

cout << str;

 

getch();

return 0;

}

[/php:1:dc13d78bc9]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...