Jump to content
Sign in to follow this  
marionette

Tak Faham Pasal Output

Recommended Posts

#define MAX 20

struct subject{

char nama [40];

char gred;

int markah;};

struct subject math[MAX];

void main()

{

bacafail (subject)

/*kiramarkah (math, gred)

cetakmarkah (math);*/

void bacafail (struct subject math(MAX));

{

File *fail;

int i;

fail = fopen ("pelajar.dat","r");

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

fscanf(fail, "%s" , p.nama));

fgets(p.markah, fail);

printf("%s %d", p.nama, p.markah)

}

fclose (fail);

}

output:

mohd

kamal

bin

abu

80

salim

johari

90

->tapi dalam fail "pelajar.dat" dia punya bentuk camnie:

mohd kamal bin abu 80

salim johari 90

jadi camner saya nak buat apa yang sebijik dalam fail "pelajar.dat" sama ngan saya punya output.Atau ada silap saya kat atucara di atas???

mintak tolong semak....aturcara ini akan membaca fail "pelajar.dat" kemudian ia akan mempaparkan isi kadungan fail "pelajar.dat" kemudian ia berupaya mengira berapa peratus yg dapat A,B,C dan D mengikut range yg akan ditentukan nnt.Skrng saya punya output tak jadi,camner saya boleh selesaikan masalah saya nie???

Share this post


Link to post
Share on other sites

laugh.gif tq zeph.dah ade kemajuan skit.

aku ubah gini:

fscanf(fail, "%s %d", p.nama, &p.markah);

fprintf("%s %d", p.nama, p.markah);

output die:

mohd 0

kamal 0

bin 0

abu 80

salim 0

johari 90

macamana nak buat gini:

mohd kamal bin abu 80

salim johari 90 dry.gif

Share this post


Link to post
Share on other sites

kalau hanya mahu menggunakan fungsi fscanf untuk membaca fail,

siti cadangkan satu kaedah yang agak 'mudah' dan ringkas...

1. Nama <- "", Markah <- 0

2. ulang selagi masih ada data dalam fail

2.1 fscanf(fail, "%s", szValue );

2.2 Jika szValue bukan digit, maka

Nama <- Nama + szValue, Jika tidak

2.2.1 Markah <- szValue (perlu tukarkan string kepada integer)

2.2.2 keluar dari gelung (pergi ke 3)

3. simpan Nama dan Markah ke dalam rekod pelajar

4. kalau masih ada data dalam fail

4.1 Ulang untuk rekod pelajar baru (pergi ke 1)

contoh:

1. Nama = "", Markah = 0

2. szValue = "mohd", Name = "mohd"

3. szValue = "kamal", Name = "mohdkamal"

4. szValue = "bin", Name = "mohdkamalbin"

5. szValue = "abu", Name = "mohdkamalbinabu"

6. szValue = "80", Markah = 80

7. p[0].Nama = "mohdkamalbinabu" p[0].markah = 80

8. Nama = "", Markah = 0

9. szValue = "salim", Name = "salim"

10. szValue = "johari", Name = "salimjohari"

11. szValue = "90", Markah = 90

12. p[1].Nama = "salimjohari" p[1].markah = 90

13. Nama = "", Markah = 0

14. dan seterusnya...

untuk memisahkan "mohdkamalbinabu" kepada "mohd kamal bin abu"

marionette perlulah menggunakan kebijaksanaan sendiri dan siti memberi

jaminan tidak susah untuk menulisnya.

p/s: untuk mencantum string boleh guna strcat dan untuk menukar string kepada

integer guna atoi.

untuk memastikan szValue adalah digit, tulis fungsi sendiri... laugh.gif

Share this post


Link to post
Share on other sites

blink.gif szValue? saya baru belajar2 nak guna C. boleh cerita lebih detail tak siti camner fungsi szValue. Setakat nie saya blom jumpa mengenai szValue. yang saya tahu struct, array, pointer, gelung2 nie. belajar sendiri2 n buat rujukan sendiri kat internet.tak pun tanya kat orang2 kat sini. unsure.gif

Takpe saya try test cuba buat.nnt tolong cek kan yer... biggrin.gif

Share this post


Link to post
Share on other sites

biggrin.gif nie jer ilmu yang saya ada klu berpandu guide yg siti bagi...tak tau btol ke tidak.

int i;

szValue (nama, markah);

for (i=0; i<MAX; i++wink.gif

{

fscanf (fail, "%s", szValue);

if

{

nama <- nama + szValue;

p.nama = szValue;

}

else

{

markah <-s zValue;

p.markah = szValue;

}

}

boleh jalan ker nier??? huh.gif

Share this post


Link to post
Share on other sites

alamak, apa yang siti berikan adalah algoritma dan jangan menterjemahkannya

kepada kod secara bulat-bulat!!!! sad.gif

char szValue[MAX_STR_LEN];
char szName[MAX_STR_LEN];
int  iMarkah;

// open and initiate file....

for ( int i=0; i<MAX_RECORD; i++ )
{
    strcpy ( szName, "" );
    iMarkah = 0;

    while ( TRUE )
    {                    
          if ( feof ( hFail ) ) // sudah habis baca fail
             break;
          
          fscanf ( hFail, "%s", szValue );
          if ( !IsDigit ( szValue ) )
             strcat ( szName, szValue );
          else
          {
              iMarkah = atoi ( szValue );
              strcpy ( p[i].Nama, szName );
              p[i].Markah = iMarkah;
              break; // continue to the next student
          } // else
    } // while
    
    if ( feof ( hFail ) ) // sudah habis baca fail
       break;
} // for

// close file....

fungsi IsDigit kena tulis sendiri!!!! mad.gif

Edited by siti

Share this post


Link to post
Share on other sites

buah cempedak dluar pagar,

ambil galah tolong jolokan,

saya budak baru blajar,

klu salah tolong tunjuk. rolleyes.gif

siti nak tanya sikit....

apa maksud "h" kat depan fail tu???

fscanf ( hFail, "%s", szValue );

sbb sebelum nie saya buat:

fscanf (fail, "%s", szValue );

Share this post


Link to post
Share on other sites

penggunaan huruf 'h' itu dinamakan hungarian notation (direka oleh Charles Simonyi, microsoft). biasanya kalau kita menulis kod untuk projek yang besar dan melibatkan ramai programmer, penggunaan hungarian notation digalakkan (dan sesetengah syarikat mewajibkannya) supaya kod menjadi lebih senang difahami dan seragam.

sebagai contoh,

'i' - integer

'h' - handle

'sz' - null termiated string

jika kita menulis kod seperti ini,

// pengistiharan

int iMarkah; // berjenis integer!

// banyak lagi kod di sini

// beribu-ribu lemon banyaknya

// dan akhirnya

scanf ( "%f", &iMarkah ); // membaca nilai float!

sudah tentu ada yang tidak kena dengan baris "scanf ( "%f", &iMarkah)" kerana parameter pertama untuk membaca pembolehubah jenis float tetapi parameter kedua adalah berjenis penunjuk kepada integer (penggunaan 'i' untuk 'iMarkah').

tetapi standard hungarian notation ini tidak sama untuk setiap syarikat yang berlainan...

http://www4.ncsu.edu:8030/~moriedl/projects/hungarian/

http://msdn.microsoft.com/library/default..../HungaNotat.asp

Share this post


Link to post
Share on other sites

Awak bleh guna fungsi fgets untuk dapatkan satu baris data dari fail, then scan baris ni untuk dapatkan data. Kalau nak guna fungsi C, bleh gunakan sscanf. Untuk format data awak, bleh gunakan format specifier "%[^0-9]%d", di mana %[^0-9] untuk dapatkan data selain daripada nombor (nama orang maner ader nombor ye tak), then %d untuk dapatkan markah. Of course ni contoh ni limited jer. Awak bleh bacer mengenai scanf nyer format specifiers untuk dapatkan hasil yang lebih memuaskan, e.g untuk pisahkan first name dan last name. Contoh kod :

#include <stdio.h>

#define MAX_INPUT 20
#define MAX_CHARS_IN_LINE 100
#define MAX_NAME_LENGTH 40

char  line[MAX_CHARS_IN_LINE],
      name[MAX_NAME_LENGTH];
int mark;

void dumpinfo() {
FILE *file;
int i;

  file = fopen ("pelajar.dat","r");
  for (i=0; i<MAX_INPUT; i++) {
    if (fgets(line, sizeof(line), file) == NULL) break;
    sscanf(line, "%[^0-9]%d", name, &mark);
    printf("%s%d\n", name, mark);
  }
  fclose (file);
}

void main() {
  dumpinfo();
}

Share this post


Link to post
Share on other sites

terima kasih kepada yg sudi membantu... minggu lepas saya ada tanya member saya yang amik subject C. dia ada emailkan saya atucara nie:

ko buata satu fail "pelajar.dat" pastu ko isi data nie:

farid bin abu 60 B

kassim bin salleh 80 A

farid bin ismail 40 D

blaaa.........blaaaa dan bla....

save kat ko nyer c compiler.buat aturcara kat bawah. mesti ko faham nyer....

#define MAK 20

struct kursus

{

char nama[20];

int markah;

char gred;

};

struct kursus cbds[MAK];

void bacadata(struct kursus p[]);

void kiragred(struct kursus p[]);

void kiraperatus(int v, int w, int x, int y, int z)

void bacadata (struct kursus p[])

{

FILE *fail;

int i;

fail = fopen("pelajar.dat","r")

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

{

fgets(p.nama, 20, fail);

fscanf(fail, "%d", &(p.markah));

fscanf(fail, "%c", &(p.gred));

}

fclose (fail);

}

void kiragred (struct kursus k[])

{

int i,a,b,c,d,e;

a=b=c=d=e=0;

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

{

if (p.gred=='A')

{

a++;

printf("%s mendapat A\n",p.nama);

}

else if (p.gred=='B')

{

b++;

printf ("%s mendapat B\n",p.nama);

}

else if (p.gred=='C')

{

c++;

printf ("%s mendapat C\n",p.nama);

}

else if (p.gred=='D')

{

d++;

printf ("%s mendapat D\n",p.nama);

)

else if (p.gred=='E')

{

e++;

printf (" %s mendapat E\n", p.nama);

}

}

printf("Bilangan pelajar yang mendapat gred A ialah seramai :%d\n",a)

printf("Bilangan pelajar yang mendapat gred B ialah seramai :%d\n",B)

printf("Bilangan pelajar yang mendapat gred C ialah seramai :%d\n",c)

printf("Bilangan pelajar yang mendapat gred D ialah seramai :%d\n",d)

printf("Bilangan pelajar yang mendapat gred E ialah seramai :%d\n",e)

}

void kiraperatus(int v, int w, int x, int y, int z)

{

printf("Peratus pelajar yang mendapat gred A ialah : %.1f % peratus\n", (float)v* 100/MAK);

printf("Peratus pelajar yang mendapat gred B ialah : %.1f % peratus\n", (float)w* 100/MAK);

printf("Peratus pelajar yang mendapat gred C ialah : %.1f % peratus\n", (float)x* 100/MAK);

printf("Peratus pelajar yang mendapat gred D ialah : %.1f % peratus\n", (float)y* 100/MAK);

printf("Peratus pelajar yang mendapat gred E ialah : %.1f % peratus\n", (float)z* 100/MAK);

}

tapi bila saya run aturcara kat atas.dia cakap declaraion syntax error.kat maner silapnya? nak tanya member nie balik dia tengah exam...malas nak kacau plak..

Edited by marionette

Share this post


Link to post
Share on other sites

#include <stdio.h>

#define MAK 20

struct kursus

{

char nama[20];

int markah;

char gred;

};

struct kursus cbds[MAK];

void bacadata(struct kursus p[]);

void kiragred(struct kursus p[]);

void kiraperatus(int v, int w, int x, int y, int z);

void bacadata (struct kursus p[])

{

FILE *fail;

int i;

fail = fopen("pelajar.dat","r");

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

{

  fgets(p.nama, 20, fail);

  fscanf(fail, "%d", &(p.markah));

  fscanf(fail, "%c", &(p.gred));

}

fclose (fail);

}

void kiragred (struct kursus p[])

{

int i,a,b,c,d,e;

a=b=c=d=e=0;

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

{

  if (p.gred=='A')

  {

  a++;

  printf("%s mendapat A\n",p.nama);

  }

  else if (p.gred=='B')

  {

  b++;

  printf ("%s mendapat B\n",p.nama);

  }

  else if (p.gred=='C')

  {

  c++;

  printf ("%s mendapat C\n",p.nama);

  }

  else if (p.gred=='D')

  {

  d++;

  printf ("%s mendapat D\n",p.nama);

  }

  else if (p.gred=='E')

  {

  e++;

  printf (" %s mendapat E\n", p.nama);

  }

}

printf("Bilangan pelajar yang mendapat gred A ialah seramai :%d\n",a);

printf("Bilangan pelajar yang mendapat gred B ialah seramai :%d\n",cool.gif;

printf("Bilangan pelajar yang mendapat gred C ialah seramai :%d\n",c);

printf("Bilangan pelajar yang mendapat gred D ialah seramai :%d\n",d);

printf("Bilangan pelajar yang mendapat gred E ialah seramai :%d\n",e);

}

void kiraperatus(int v, int w, int x, int y, int z)

{

printf("Peratus pelajar yang mendapat gred A ialah : %.1f % peratus\n", (float)v* 100/MAK);

printf("Peratus pelajar yang mendapat gred B ialah : %.1f % peratus\n", (float)w* 100/MAK);

printf("Peratus pelajar yang mendapat gred C ialah : %.1f % peratus\n", (float)x* 100/MAK);

printf("Peratus pelajar yang mendapat gred D ialah : %.1f % peratus\n", (float)y* 100/MAK);

printf("Peratus pelajar yang mendapat gred E ialah : %.1f % peratus\n", (float)z* 100/MAK);

}

int main( void )

{

return true;

}

ada banyak syntax error.

dah modify dah code sampai boleh run. tinggal isikan mainnya sahaja. ok;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...