Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C abi, reaosa lugemine kui sõna leitud xml failist märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
hotmp4
HV vaatleja
hotmp4

liitunud: 26.12.2002




sõnum 05.05.2009 23:10:05 C abi, reaosa lugemine kui sõna leitud xml failist vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 06.05.2009 00:24:34 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
hotmp4
HV vaatleja
hotmp4

liitunud: 26.12.2002




sõnum 06.05.2009 13:36:31 vasta tsitaadiga

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 {}icon_wink.gif? 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
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 06.05.2009 14:20:40 vasta tsitaadiga

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 thumbs_up.gif
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 06.05.2009 19:07:39 vasta tsitaadiga

hotmp4 kirjutas:
hm, sa mõtled struktuuride kasutamist (struct {}icon_wink.gif? 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
vaata kasutaja infot saada privaatsõnum
tooner
HV vaatleja

liitunud: 07.05.2009




sõnum 07.05.2009 21:25:14 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
hotmp4
HV vaatleja
hotmp4

liitunud: 26.12.2002




sõnum 17.06.2009 18:25:19 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 17.06.2009 18:37:25 vasta tsitaadiga

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 icon_razz.gif

_________________
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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 17.06.2009 20:30:16 vasta tsitaadiga

if (*p1++ - *riik++) {

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 18.06.2009 20:54:21 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C abi, reaosa lugemine kui sõna leitud xml failist
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.