我正在制作简单的C程序。该程序应该能够将数据存储在内存中(不使用数据库)。但是当我测试它时,它不能存储超过1个数据。每当我存储新数据时,旧数据都会被替换。我希望这些屏幕截图可以帮助您理解我的意思。
如您所见,我输入了第一组数据。毫无问题。
然后,我添加了第二组数据。第一个数据在哪里? 2号数据应该在1号数据之后。但是最初的数据完全丢失了。
这是我的输入代码:
//this is function for the input
void masukan() {
n=n+1; //use n as index for the struct (mhsw)
printf("\n");
printf("Masukkan NIM : "); scanf("%s", mhsw[n].nim);
printf("Masukkan Nama : "); scanf("%s", mhsw[n].nama);
printf("Masukkan Golongan UKT : "); scanf("%d", &mhsw[n].golUKT);
mhsw[n].nominalUKT = nominal(mhsw[n].golUKT)*100000;
printf("");
}
//the nominal UKT = factorial of golUKT
int nominal(int n) {
int hasil = 0;
if (n == 1) return 15;
else {
hasil = ((n*n) + nominal(n-1));
return hasil;
}
}
这是我的输出代码:
//this is for the output
void tampil() {
if (!kbhit()) {
printf("\n");
printf(" ===========================================================================\n");
printf(" DATA MAHASISWA \n");
printf("|====|================|====================|==============|=================|\n");
printf("| No | NIM | Nama | Golongan UKT | Nominal UKT |\n");
printf("|====|================|====================|==============|=================|\n");
for(i=0; i<n; i++); //to display record
{
printf("%5d", i);
printf("%17s", mhsw[i].nim);
printf("%20s", mhsw[i].nama);
printf("%15d", mhsw[i].golUKT);
printf("%18d", mhsw[i].nominalUKT);
printf("\n");
}
printf("|====|================|====================|==============|=================|\n");
printf("\n \nPencet sembarang tombol untuk kembali ke Home");
getch();
} else {
menu();
}
}
这是整个代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <windows.h>
//global variable
struct mahasiswa
{
char nim[10];
char nama[50];
int golUKT;
long int nominalUKT;
};
struct mahasiswa mhsw[50];
int i, n, nim;
bool ada = false;
char carinim[10];
//prototype
void login();
void menu();
void gotoxY(int, int);
void loading();
void masukan();
int nominal(int);
void tampil();
void cari();
//main function
void main() {
login();
}
void login() {
char user[10], pass[10];
int x, y;
printf("Masukkan Username : "); scanf("%s", user);
printf("Masukkan Password : "); scanf("%s", pass);
x = strcmp(user, "admin");
y = strcmp(pass, "admin123");
if (x == 0 && y == 0) {
menu();
}
else {
system("cls");
printf("Gagal Login, Ulangi Proses\n");
login();
}
}
void menu()
{
int pilih;
system("cls");
printf(" ____________________________________________________\n");
printf("| Siukat Lite |\n");
printf("|____________________________________________________|\n");
printf("|_______________________Home_________________________|\n");
printf("| 1. Pendaftaran Mahasiswa |\n");
printf("| 2. Daftar Golongan UKT |\n");
printf("| 3. Cari NIM |\n");
printf("| 4. Cetak Data Siukat |\n");
printf("| Ketik sembarang nomor untuk keluar |\n");
printf("|____________________________________________________|\n");
printf("Masukkan Pilihan Nomor : ");
scanf("%d",&pilih);
switch(pilih)
{
case 1:
//loading();
printf("\nPendaftaran Mahasiswa");
masukan();
menu();
break;
case 2:
case 3:
printf("Cari NIM");
cari();
break;
case 4:
//loading();
printf("\nData Siukat");
tampil();
default:
menu();
}
}
void gotoxy (int x,int y)
{
HANDLE hConsoleOutput;
COORD dwCursorPosition;
dwCursorPosition.X = x;
dwCursorPosition.Y = y;
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput,dwCursorPosition);
}
void loading() {
int a;
char x;
gotoxy(1,12);
for(a=0;a<=5;a++)
{
usleep(500000);
printf("*",x);
}
}
//for input record
void masukan() {
printf("\n");
printf("Masukkan NIM : "); scanf("%9s", mhsw[n].nim);
printf("Masukkan Nama : "); scanf("%49s", mhsw[n].nama);
printf("Masukkan Golongan UKT : "); scanf("%d", &mhsw[n].golUKT);
mhsw[n].nominalUKT = nominal(mhsw[n].golUKT)*100000;
printf("");
n=n+1;
}
int nominal(int n) {
int hasil = 0;
if (n == 1) return 15;
else {
hasil = ((n*n) + nominal(n-1));
return hasil;
}
}
//for find NIM
void cari() {
printf("\nMasukkan NIM :"); scanf("%s", carinim);
printf("\n");
if (!kbhit()) {
for(i=0; i<n; i++) {
if (strcmp(carinim, mhsw[i].nim) == 1) {
ada = true;
} else {
ada = false;
}
}
if(ada) {
printf("NIM : %s \n", mhsw[i].nim);
} else {
printf("Data Tidak Ditemukan");
}
} else {
menu();
}
}
//for showing the record
void tampil() {
if (!kbhit()) {
printf("\n");
printf(" ===========================================================================\n");
printf(" DATA MAHASISWA \n");
printf("|====|================|====================|==============|=================|\n");
printf("| No | NIM | Nama | Golongan UKT | Nominal UKT |\n");
printf("|====|================|====================|==============|=================|\n");
for(i=0; i<n; i++);
{
printf("%5d", i);
printf("%17s", mhsw[i].nim);
printf("%20s", mhsw[i].nama);
printf("%15d", mhsw[i].golUKT);
printf("%18d", mhsw[i].nominalUKT);
printf("\n");
}
printf("|====|================|====================|==============|=================|\n");
printf("\n \nPencet sembarang tombol untuk kembali ke Home");
getch();
} else {
menu();
}
}
感谢您的帮助
更新:我试图在插入后增加增量,并查看n的值。仍然不起作用。这是一些屏幕截图。
插入前的n值仍为0
答案 0 :(得分:1)
这是由于您在插入n = n+1
之前执行了masukan()
指令。您必须在函数末尾移动此指令。
程序启动时,n的值为0。插入新的一组值时,首先递增n并因此将值存储在索引1中。索引0处的值是默认值。
打印值时,将打印索引为0到n-1的值。这不包括您刚刚插入的索引n处的值。
通过在新值插入结束时移动n的增量,将在索引位置0插入第一个值集,并且n是表中值的数量。 n也是表中倒数第二个值的索引。在此位置,您将在增加n之后插入下一个值。
编辑:另一个错误是;在for(i=0; i<n; i++)
函数中tampil
之后。这就是无论n的值如何都打印一行的原因。
答案 1 :(得分:1)
在;
中,for
之后有一个tampil()
。
for(i=0; i<n; i++);
这导致循环主体为空,因此tampil()
内没有任何内容。
要防止此类错误,请使用优质的编译器gcc并启用所有警告(对于gcc,它为-Wall -Wextra
)。例如gcc
输出以下有用的警告消息:
1.c: In function ‘tampil’:
1.c:167:9: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
167 | for(i=0; i<n; i++);
| ^~~
1.c:168:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘for’
168 | {
| ^