Why are some grade (Hurup Mutu) column items getting printed with the mark (Angka Mutu) column items (for example B+3,5
where B+ is the grade and 3,5 is the mark), even though in my data struct
, I have defined the grade (Hurup Mutu) char array to have only 2 characters, but it's storing up to 5.
This doesn't occur on every line, so I'm having a hard time finding the error, please help me.
You can see it in the following output, I have highlighted the results that are wrong:
This is my C Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct data
{
char nim[13];
char nama[50];
float uts, uas, tugas, kuis,total;
char grade[2], angka[4], status[14];
};
void tampil();
void data(struct data[], int );
char* hurupMutu(int);
char* nilaiMutu(int);
char* status(int);
int main() {
tampil();
return 0;
}
void tampil(){
int p;
char *a;
printf("+----------------------------------+\n");
printf("| Masukan Data Mahasiswa +\n");
printf("+----------------------------------+\n");
printf("Masukan Banyak Data Mahasiswa : ");
scanf("%d", &p);
if (p < 1){
printf("Data Mahasiswa harus lebih besar dari 0 ");
exit(0);
}
struct data d[p];
for(int i = 0; i < p; i++){
int total = 0;
printf("Data ke %d : \n", i+1);
printf("Masukan NIM : ");
fflush(stdin);
gets(d[i].nim);
printf("Masukan Nama : ");
fflush(stdin);
gets(d[i].nama);
printf("Masukan Nilai UTS : ");
scanf("%f", &d[i].uts);
total += d[i].uts * 0.3;
printf("Masukan Nilai UAS : ");
scanf("%f", &d[i].uas);
total += d[i].uas * 0.3;
printf("Masukan Nilai Tugas : ");
scanf("%f", &d[i].tugas);
total += d[i].tugas * 0.2;
printf("Masukan Nilai Kuis : ");
scanf("%f", &d[i].kuis);
total += d[i].kuis * 0.2;
d[i].total = total;
strcpy(d[i].grade, hurupMutu(d[i].total));
strcpy(d[i].status, status(d[i].total));
strcpy(d[i].angka, nilaiMutu(d[i].total));
}
data(d, p);
}
char* hurupMutu(int a){
if (a >= 80 && a <= 100){
return "A";
}else if(a >= 70 && a < 80){
return "B+";
}
else if(a >= 65 && a < 70){
return "B";
}else if(a >= 60 && a < 65){
return "C+";
}else if(a >= 55 && a < 60){
return "C";
}else if(a >= 50 && a < 55){
return "D+";
}else if(a >= 45 && a < 50){
return "D";
}else if( a < 45){
return "E";
}else{
return "?";
}
}
char* nilaiMutu(int a){
if (a >= 80 && a <= 100){
return "4,0";
}else if(a >= 70 && a < 80){
return "3,5";
}else if(a >= 65 && a < 70){
return "3,0";
}else if(a >= 60 && a < 65){
return "2,5";
}else if(a >= 55 && a < 60){
return "2,0";
}else if(a >= 50 && a < 55){
return "1,5";
}else if(a >= 45 && a < 50){
return "1,0";
}else if( a < 45){
return "0";
}else{
return "?";
}
}
char* status(int a){
if (a >= 80 && a <= 100){
return "Istimewa";
}else if(a >= 70 && a < 80){
return "Sangat Baik";
}
else if(a >= 65 && a < 70){
return "Baik";
}else if(a >= 60 && a < 65){
return "Cukup Baik";
}else if(a >= 55 && a < 60){
return "Cukup";
}else if(a >= 50 && a < 55){
return "Kurang Cukup";
}else if(a >= 45 && a < 50){
return "Kurang";
}else if( a < 45){
return "Sangat Kurang";
}else{
return "Tidak Tau";
}
}
void data(struct data d[], int p){
printf("+------------------------------------------------------------------------------------------+\n");
printf("| NO | NIM | Nama | Total Nilai | Hurup Mutu | Angka Mutu | Gabungan Kemampuan |\n");
printf("+------------------------------------------------------------------------------------------+\n");
for(int i = 0; i < p; i++){
printf("| %d ", i + 1);
int a = strlen(d[i].nim);
int b = 10 - a;
printf("| %s ", d[i].nim);
for(int j = 0; j < b; j ++){
printf(" ");
}
int c = strlen(d[i].nama);
int e = 50 - c;
printf("| %s", d[i].nama);
for(int j = 0; j < e; j ++){
printf(" ");
}
printf(" |");
printf(" %.2f " ,d[i].total);
int f = strlen(d[i].grade);
int g = 12 - f;
printf("| %s" ,d[i].grade);
for(int j = 0; j < g; j++){
printf(" ");
}
int h = strlen(d[i].angka);
int k = 12 - h;
printf("| %s" ,d[i].angka);
for(int j = 0; j < k; j ++){
printf(" ");
}
int l = strlen(d[i].status);
int m = 20 - l;
printf("| %s" ,d[i].status);
for(int j = 0; j < m; j ++){
printf(" ");
}
printf("|\n");
printf("+------------------------------------------------------------------------------------+\n");
}
}