2013-04-19 28 views
5

Bu program, kullanıcıdan girdiye girişi yakalar ve ardından verilen bilgilerin bir histogramını yazdırır. Her şey şu ana kadar gayet iyi çalışıyor çünkü histogramı yazdırmaya çalıştığımda tüm '*' karakterleri, öğrencinin notu ne olursa olsun F notunun altına düşer. Ne olduğunu düşünüyorum, öğrencinin dizi indeksi, gerçek değişkenin kendisi yerine geçiyor, ama kafam karıştı çünkü histogramın yazdırılmasından önce çıktıda doğru değeri gösteriyor. Baska öneri?Yapı dizisi öğelerine erişme

#include <stdio.h> 
#include <stdlib.h> 
#define MAXSIZE 28 
#define MAXGRADE 100 

struct studentData{ 
    char studentID[MAXSIZE]; 
    char studentName[MAXSIZE]; 
    int examPercent; 
} studentRecords[MAXSIZE]; 

// function prototype for histogram 
void displayHist(struct studentData *records, int classSize); 

int main() 
{ 
    int i, students = -1; 
    //struct studentData *studentRecords[MAXSIZE]; 
    while(students < 0 || students > MAXSIZE) 
    { 
     printf("Please enter the number of students in your class:\n"); 
     scanf("%d", &students); 

     if(students > MAXSIZE || students <= 0) 
     { 
      printf("Try again..\n"); 
      scanf("%d", &students); 
     } 

    } 

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

     printf("Please enter the student #%d's lastname:\n", i+1); 
     scanf("%s", &studentRecords[i].studentID); 


     printf("Please enter the student #%d's ID#:\n", i+1); 
     scanf("%s", &studentRecords[i].studentName); 

     printf("Please enter the student's exam percent:\n"); 
     scanf("%d", &studentRecords[i].examPercent); 

} 

//This is just here to view the input... 
for(i=0;i<students;i++) { 

     printf("Student #%d's name is %s\n", i+1, studentRecords[i].studentName); 
     printf("student #%d's ID#:%s\n", i+1, studentRecords[i].studentID); 
     printf("student #%d's grade was %d\n", i+1, studentRecords[i].examPercent); 

    } 

    displayHist(&studentRecords[students], students); 

    return 0; 
} 

void displayHist(struct studentData *records, int classSize) 
{ 
    int i; 


     printf("A:"); 
    for(i=0;i<classSize;i++) 
    { 

     if(records[i].examPercent >=90) 
     { 
      printf("*"); 
     } 

    } 


     printf("\n"); 
     printf("B:"); 
    for(i=0;i<classSize;i++) 
    { 
     if(records[i].examPercent< 90 && records[i].examPercent >= 80) 
     { 
      printf("*"); 
     } 
    } 

     printf("\n"); 
     printf("C:"); 
    for(i=0;i<classSize;i++) 
    { 
     if(records[i].examPercent < 80 && records[i].examPercent >= 70) 
     { 
      printf("*"); 
     } 

    } 

    printf("\n"); 
    printf("D:"); 
    for(i=0;i<classSize;i++) 
    { 
     if(records[i].examPercent< 70 && records[i].examPercent >= 60) 
     { 
      printf("*"); 
     } 

    } 

    printf("\n"); 
    printf("F:"); 
    for(i=0;i<classSize;i++) 
    { 
     if(records[i].examPercent < 60) 
     { 
      printf("*"); 
     } 

    } 
} 

cevap

2
displayHist(&studentRecords[students], students); 

&studentRecords[students] Dizinizdeki studentRecords sonra bir adrestir. displayHists'da, records[i] erişim, dizininizin sınırları dışında olan studentRecords[students+i] dereference denemeye çalışır.

Doğru çağrı olabilir:

displayHist(&studentRecords[0], students); 

eşdeğerdir: Bu arada

displayHist(studentRecords, students); 

, char (*)[] ve char * farklı olabilir, çünkü char * ile scanf yılında & kullanmaya gerek hafıza gösterimleri. yani &

+1

Aaaa! Lol teşekkürler, bunu bilmeliydim. Bu hata için kafama kendim tokat veriyorum. Çok teşekkürler – KryptNick

0
scanf("%s", &studentRecords[i].studentID); 

scanf("%s", &studentRecords[i].studentName); 

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[28]’ [-Wformat] 

adres-kullanımı, bu değil ne scanf beklediği olan char ** olur.

Bu şekilde kullanmayı deneyin.

scanf("%s", &(*studentRecords[i].studentID)); 

ve

displayHist(studentRecords, students); 
+0

Not "char **'; hata mesajında ​​olduğu gibi char (*) [28] '(28 karakterlik bir dizi için bir işaretçi) olur. Scanf() 'ın beklediği şeyin doğru olmadığı doğru (ama, geçilen adresin aynı olduğu merakla). –