新数据替代旧数据,而不是在C中添加新数据

时间:2019-11-30 07:36:36

标签: c

我正在制作简单的C程序。该程序应该能够将数据存储在内存中(不使用数据库)。但是当我测试它时,它不能存储超过1个数据。每当我存储新数据时,旧数据都会被替换。我希望这些屏幕截图可以帮助您理解我的意思。

First Data Input

如您所见,我输入了第一组数据。毫无问题。

Second Data Input

然后,我添加了第二组数据。第一个数据在哪里? 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 before insertion

插入前的n值仍为0

After insertion 插入后的n值增加到1。但是根本没有记录数据。

2 个答案:

答案 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 |         {
      |         ^