praegune kellaaeg 20.06.2025 23:30:07
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
hotmp4
HV vaatleja

liitunud: 26.12.2002
|
05.05.2009 23:10:05
C abi, reaosa lugemine kui sõna leitud xml failist |
|
|
mainin kohe ausalt ära, et see on kodutöö ja olen sellega hätta jäänud. ülesanne on muidu selline:
Koostada C++ programm, mis väljastab EL "uute" ja "vanade" liikmesriikide summaarse osatähtsuse selle kuu impordi kogukäibes (protsentides).
#include <stdio.h> // standard IO
#include <conio.h> // keyboard-monitor
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char *trim (char *str);
int n, i; // variables declaring
int x = 0;
int old_EU_sum = 0;
const char *old_EU[] = {"Austria", "Belgium", "Spain", "Holland", "Ireland", "Italy", "Greece", "Luxembrug", "Portugal",
"France", "Sweden", "Germany", "Finnish", "Great Britain", "Denmark"};
n=sizeof(old_EU)/sizeof(int); // get the number of different countries in array
char *file="c:\\Import.xml";
char rida[240], *pos;
char number;
FILE *fp;
fp=fopen(file, "r");
if(fp){ // file opened successfully
while (fgets(rida, sizeof(rida), fp) != NULL) {
pos=strtok(rida, "<>");
do{
trim(pos); // trim output before we compare and print it
for (i=0; i<n; i++) {
if (strcmp(old_EU[i], pos) == 0) {
x++;
//old_EU_sum += atoi(number); // convert to int
}
}
printf("%s\n", pos);
pos=strtok(NULL, "<>");
}while(pos && *pos!='\n');
}
}
else printf
("File %s couldnt be opened\n",
file);
printf("\n%d, %d, %d", x, n, old_EU_sum);
printf("\nPress any key...");
getch();
return 0;
}
|
Jäin seisma selle koha peal, kui peale rea tükkideks löömist eraldi sõnadeks teen strcmp() ning tõepoolest leiab massiivist ja failist samasugused riigid, aga mis edasi? kuidas võtta siis see number mis on peale leitud riigi nime? kellelgi nõuandeid?
siin muidu üks väljalõige XML failist, et saada mingi ettekujutus selle ülesehitusest
<Import partner>
<Country name>Argentina </Country name><Import quantity (kr)> 5670753 </Import quantity (kr)>
</Import partner>
<Import partner>
<Country name>Aruba </Country name><Import quantity (kr)> 0 </Import quantity (kr)>
<Import partner>
<Import partner>
<Country name>Australia </Country name><Import quantity (kr)> 1263834 </Import quantity (kr)>
<Import partner>
<Import partner>
<Country name>Austria </Country name><Import quantity (kr)> 129511215 </Import quantity (kr)>
</Import partner> |
ja Dev-C++-s output on selline hetkel:
Country name
Argentina
/Country name
Import quantity (kr)
5670753
/Import quantity (kr)
/Import partner
Import partner
Country name
Aruba
/Country name
Import quantity (kr)
0
/Import quantity (kr)
... |
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
06.05.2009 00:24:34
|
|
|
Kui sul on sisendiks XML fail, siis ei tasu sellele nii kannatamatult ligi minna.
XML disainiti nii, et see oleks vähese vaevaga programselt loetav. Mõtle selle peale, et need nimed, väärtused jmt võiks esteks sisse lugeda ja mingisse kenasse struktuuri laduda. Ja siis alles töötluse kallale asuda. Elu muutub palju lihtsamaks.
Ja kõrvaline kommentaar - su kood on läbi ja lõhki puhas C. Maitse üle küll ei vaielda, aga IMHO on C++-i vahendeid kasutades XML-i töötlemine - khmm - veidi lihtsam. Eeskätt STL konteinereid ja string klassi pean silmas.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
hotmp4
HV vaatleja

liitunud: 26.12.2002
|
06.05.2009 13:36:31
|
|
|
Supiplex kirjutas: |
Kui sul on sisendiks XML fail, siis ei tasu sellele nii kannatamatult ligi minna.
XML disainiti nii, et see oleks vähese vaevaga programselt loetav. Mõtle selle peale, et need nimed, väärtused jmt võiks esteks sisse lugeda ja mingisse kenasse struktuuri laduda. Ja siis alles töötluse kallale asuda. Elu muutub palju lihtsamaks.
Ja kõrvaline kommentaar - su kood on läbi ja lõhki puhas C. Maitse üle küll ei vaielda, aga IMHO on C++-i vahendeid kasutades XML-i töötlemine - khmm - veidi lihtsam. Eeskätt STL konteinereid ja string klassi pean silmas. |
hm, sa mõtled struktuuride kasutamist (struct {} ? ilma nendeta peaks saama ka hakkama selle ülesandega, kuna meil paluti neid mitte kasutada.
muidu ma loodan kuulda mingit konkreetsemat vastust, kuidas saaks sisse lugeda arvu mis asub peale leitud riigi nime.
peaks saama ka teha nii, et mingit kindlat C või C++ eripära kasutamata sellise programmi kirjutamisel, mida püüangi üritada teha.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
06.05.2009 14:20:40
|
|
|
um no siin on nii palju viise kuidas teha.. vb üks lihtsamaid:
hakkad seda faili lugema ja kui leiad, et number on, siis kasutad lihtsalt sscanf(buffer + asukoht, "%d", &result[mitmes]);
ei tea kas sind aitab see..ega päris otseselt sind toitma vast ei hakka, kooliülesanne ikkagist
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
06.05.2009 19:07:39
|
|
|
hotmp4 kirjutas: |
hm, sa mõtled struktuuride kasutamist (struct {} ? ilma nendeta peaks saama ka hakkama selle ülesandega, kuna meil paluti neid mitte kasutada.
muidu ma loodan kuulda mingit konkreetsemat vastust, kuidas saaks sisse lugeda arvu mis asub peale leitud riigi nime.
peaks saama ka teha nii, et mingit kindlat C või C++ eripära kasutamata sellise programmi kirjutamisel, mida püüangi üritada teha. |
Hmm, sinu kirjeldatud piirangud panevad mind kergelt kulmu kergitama. Sul on kas väga kummaline õppejõud või oled sa ülesandest vildakalt aru saanud.
Struktuurid on elementaarne osa programmeerimisest ja seda enamikus kõigist keeltest. Kindlasti pole tegemist C või C++ eripäraga.
Aga konkreetseid vastuseid pole kombeks kooliülesannetele anda. Kui sa kribada oskad, siis pole vajagi. Antud juhul võib - kõrvuti mark11 soovitusele - tsüklis lipu püsti panna kui leiad vana EU riigi; kui loed hiljem rahanumbrit siis vaatad lippu ja kui see on püsti siis liidad numbri vanadele EU riikidele. Vastasel korral uutele. Et tegemist on rahanumbriga, tead sa siis kui eelmises tsüklis oli string "Import quantity (kr)". Seda võid taaskord lipuga ära märkida.
Ära unusta siis lippe maha panna kui oled reast üle käinud.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
 |
tooner
HV vaatleja
liitunud: 07.05.2009
|
07.05.2009 21:25:14
|
|
|
Vastus ilmselt oleneb sellest, mislaadi kodutöö see on. Normaalne lahendus sellisele probleemile on kasutada mingit vabalt valitud xml-parserit. Kui aga töö eesmärgiks on stringitöötluse õpetamine, siis aitavad C küllalt hästi dokumenteeritud stringifunktsioonid, pisuke kogus loogikat ja debugimisoskus. Mingit lahendust ette öelda oleks mõttetu. Ei tahaks ju, et sinust täiesti kasutu progeja saaks.
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
hotmp4
HV vaatleja

liitunud: 26.12.2002
|
17.06.2009 18:25:19
|
|
|
tõstaks teema uuesti ülesse ja oleks paar küsimust
#include <stdio.h> // standardne sisend-v?ljund
#include <conio.h> // klaviatuur-kuvar
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
void andmed(char*); //leiab failist riigid mis on massiivis ja arvutab nende riikide impordi mahu summad
int main(void)
{
char *trim (char *str);
int n, i; // variables declaring
int x = 0;
int old_EU_sum = 0;
char *old_EU[] = {"Austria", "Belgia", "Hispaania", "Holland", "Iiri", "Itaalia", "Kreeka", "Luksemburg", "Portugal",
"Prantsusmaa", "Rootsi", "Saksamaa", "Soome", "Suurbritannia", "Taani"};
n=sizeof(old_EU)/sizeof(int); // get the number of different countries in array
char *file="Import.xml";
char rida[240], *pos, *number;
FILE *fp;
fp=fopen(file, "r"); // these two lines can be changed to if((fp = fopen(file, "r")) != NULL)
if(fp){ // file opened successfully
while (fgets(rida, sizeof(rida), fp) != NULL) { // explanation why - http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046476070&id=1043284351
andmed(rida);
}
}
else {
printf("File %s couldnt be opened\n", file);
}
printf("\n%d, %d, %d", x, n, old_EU_sum);
printf("\nPress any key...");
getch();
return 0;
}
char *trim(char *str)
{
char *end;
// Trim leading space
while(isspace(*str)) str++;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;
// Write new null terminator
*(end+1) = 0;
return str;
}
void andmed(char *p1){
int riigiga=1; //1 - kui sisseloetud real on meie riigi nimi, 0 - kui ei ole
int pos=0; //kaugus stringi algusest stringis
int i, n;
char mark; //m?rk stringis
char *riik="<Riigi nimi>";
char *maht="<Impordi maht (kr)> ";
char *abi; //abimuutuja, et s?ilitada stringi p1 edasiseks tegevuseks
char *old_EU[] = {"Austria", "Belgia", "Hispaania", "Holland", "Iiri", "Itaalia", "Kreeka", "Luksemburg", "Portugal",
"Prantsusmaa", "Rootsi", "Saksamaa", "Soome", "Suurbritannia", "Taani"}; // [color=red]kui massiiv on ainult main() funktsioonis, siis ei ole seda selle funktsiooni sees näha, miks? C eripära?[/color]
n=sizeof(old_EU)/sizeof(int); // get the number of different countries in array Bad idea. This won't give the result you're looking for.
abi=p1; //s?ilitab p1 edaspidiseks
while(*p1 && *riik){ //k?ib rea alguse m?rkhaaval l?bi, v?rdleb stringiga <Riigi nimi>
if(*p1++-*riik++){ //kui stringid ei ole v?rdsed pole ka reas riiki
riigiga=0; //reas ei ole riiki
break;
}
}
if(riigiga){ //reas on nimi
while(mark=p1[pos++]){ //liigub real edasi kuni " <" m2rgini ja asendab selle 0-ga
if(mark=='<'){ // kuni "<" m2rgini, mitte tyhikuni, sest kui riik koosneb mitmest s6nast, siis ei salvesta nime t2ielikult
p1[pos-1]=0;
trim(p1); // kuna xml failis on peale igat riiki enne "<" m2rki "tyhik" veel, siis peab trimmima
for (i=0; i<n; i++) {
if (strcmp(old_EU[i], p1) == 0){
printf("\n%s", p1);
break; // kui leitud, siis hyppame tsyklist v2lja kuna edasi pole m6tet lugeda
//old_EU_sum += atoi(number);
}
}
break;
}
}
// pos=0; //nullitud, et alustaks liikumist stringi algusest
}
riigiga=1; //j2rgmisel real v6ib riik olla
}
|
if(*p1++-*riik++){ //kui stringid ei ole v?rdsed pole ka reas riiki kuidas selline asi töötab? mida see lahutustehe üldse teeb ja mille alusel saadakse aru sellise tehtega et kas on võrdne või mitte?
põhimõtteliselt vaatasin teisi koode ja jõudsin hetkel sellise tulemuseni, et eraldab edukalt riigi nime ja võrdleb massiivis olevate nimedega. küsimus oleks hetkel siis kuidas saaks sellelt samalt realt, kus leiti riiki, liikuda impordi mahuni ja sealt sisse lugeda numbrid?
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
17.06.2009 18:37:25
|
|
|
Mulle tundub, et võrreldakse pointerite aadresse mitte stringide sisu. Üsnagi segane kood igal juhul ning ma isiklikult imestan, kui see üldse töötab. Asja saaks standard C++ teeke kasutades oluliselt lihtsamini ja loetavamalt ära lahendada.
Igal juhul inimene, kes selle koodi kirjutas tuleks oksa tõmmata, seda enam kui tegu peaks olema mingi näiteülesandega või sellelt kopeerituga. C ja C++ standardteekide läbisegi kasutamine ning C++ puhul lisaks veel ka vananenud standardid. Ei ole just kõige korralikum asi
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
17.06.2009 20:30:16
|
|
|
p1 ja riik viitavad char massiividesse, *p1 ja *riik on siis vastavate massiivi pesade väärtused.
Kui väärtused on võrdsed lahutamine annab tulemuseks 0-i.
p1++ ja riik++ panevad viidad viitama järgmistesse pesadesse.
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
18.06.2009 20:54:21
|
|
|
XML-i töötlemiseks on Expat hea. Ei ole keeruline.
Protsentide rehkendamiseks pakun välja lihtsa ebaoptimaalse lahenduse: lugeda faili 2x:
1. korral rehkendad kogusumma.
2. korral väljastad protsendid (kogusumma on juba teada).
Ülejäänud siis ehk koduseks ülesandeks.
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|