Mi a hiba a programban? (romai szamokat alakit at arab szamokka)
a foprogram elottt mutat hibat, de nem tudom, hogy mi lehet az..
elore is koszonom a segitseget :) !!!
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int atalakit( char r[], int i, int l)
{
int a=0;
int z[50];
for(int i=0;i<l;i++)
{
if(r[i]=='M') z[i]=1000;
if(r[i]=='D') z[i]=500;
if(r[i]=='C') z[i]=100;
if(r[i]=='L') z[i]=50;
if(r[i]=='X') z[i]=10;
if(r[i]=='V') z[i]=5;
if(r[i]=='I') z[i]=1;
}
for(int i=0;i<l;i++)
{
if(i==l-1) a=a+z[i];
else
{
if(z[i]<z[i+1]) a=a-z[i] ;
else a=a+z[i];
}
return a;
}
int main()
{
cout << "Hello world!" << endl;
ifstream f("adatok.txt");
char R[50][50];
int N;
for(int i=1; i<=N;i++)
{
f>>R[i];
}
int A[50];
for(int i=1; i<=N;i++)
{
int L=strlen(R[i]);
A[i]=atalakit(R[i],i,L);
}
for(int i=1; i<=N;i++) cout<<R[i]<<"-->"<<A[i]<<endl;
return 0;
}
A függvényedből lemaradt az utolsó for ciklus lezárása.
Amúgy elég sok ponton sántít a kód, az egyik amit kiemelnék, hogy karaktertömb helyett használhatnál stringet, az számontartja a saját hosszát, így nem kell a függvénybe külön paraméterként megadni azt. Valamint a függvényeden belül miért 50 hosszúra deklarálod a 'z' tömböt, miért nem olyan hosszúra, mint a kapott string? Meg eleve, használhatnál picit beszédesebb változóneveket.
A kódod egy rettenet, de a módszered maga a jelek szerint működik:
Mivel én nem ismerem a C++-t, nem kísérleteztem azzal, hogy tényleg gatyába rázzam a programodat, csak addig kínoztam, hogy egyáltalán leforduljon. A kép jobb oldalán látható ellenor.txt fájlról annyit kell tudni, hogy azt egészen más módon hoztam létre egy pascal-programmal, az adatok.txt fájl elkészítése közben (azt ugyanis elfelejtetted mellékelni). Abban tehát a látszat ellenére nem a rómaiból arabra konvertálás eredménye van, hanem pont fordítva, az eredetileg generált arab- és a belőlük nyert római számokat írattam ki olyan sorrendben, ahogyan a te programodban meg kéne jelennie. Így első blikkre úgy látom, hogy tökéletes a visszafordítás, gratulálok!
Az eddig elmondottakon kívül: Ha a nyelv megengedi is, szerintem marhára zavaró, hogy az átalakítófüggvényben ugyanolyan nevű ciklusváltozót használsz, mint a mainben. Miért nem lehetett oda más bötűt kiagyalni? Egyébként meg, ha már az i-nél tartunk, pompás ötlet átadni az értékét a függvénynek, legalább van mit azonnal lenulláznia. Azt sem értem, mire jó, hogy minden nyomorult forban meg kell adni, hogy i az bizony integer, nem egyéb, ahelyett, hogy előtte deklarálnád, és békében használgatnád akárhányszor. A pascalon nevelkedett mimózalelkemet meg bántja ez a sok szöveg mélyén létrehozott változó, szerintem sokkal átláthatóbb volna kigyűjteni az elejére, hogy na, itt a készlet, ezeket fogom használni. Ami a fájlkezelést illeti, nem tudom, hogyan szokás C++-ben korrekt módon intézni, de én hiányolok valami más nyelvekben szokásos megnyitást és lezárást.
Egy kísérlet, az említetteken túli néhány módosítással -- érzékenyebb idegrendszerű C++-programozók takarják el a szemüket:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const string romaiSzamjegyek = "MDCLXVI";
const int arabErtekek[7] = {1000, 500, 100, 50, 10, 5, 1};
int arabra(char romaiSzamjegy)
{
int a = 0;
for(int c = 0; c < 7; c++)
if(romaiSzamjegyek[c] == romaiSzamjegy) a = arabErtekek[c];
return a;
}
int atalakit( string szam)
{
int hossz = szam.length();
int arabErtek = 0;
for(int j = 0; j < hossz; j++)
{
int soros = arabra(szam[j]);
if(j == hossz - 1)
arabErtek += soros;
else
{
int kovetkezo = arabra(szam[j + 1]);
if(soros < kovetkezo) arabErtek -= soros ;
else arabErtek += soros;
}
}
return arabErtek;
}
int main()
{
string romai[50];
int arab[50];
int N = 50;
int i;
ifstream f;
cout << "Mi a fenenek kell ideirni, hogy Hello world!?\n";
f.open("adatok.txt");
for(i = 0; i < N; i++) f >> romai[i];
f.close();
for(i = 0; i < N; i++) arab[i] = atalakit(romai[i]);
for(i = 0; i < N; i++) cout << romai[i] << " --> " << arab[i] << "\n";
return 0;
}
Esetleg így?
int arabra(char romaiSzamjegy)
{
int a = 0;
for(int c = 0; c < 7 && a == 0; c++)
if(romaiSzamjegyek[c] == romaiSzamjegy) a = arabErtekek[c];
return a;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!