2015-11-25 252 views
0

我正在處理我的學校項目表單數據結構,並且遇到long類型的問題。 我想設計一個像大學註冊系統這樣的小型項目。 首先,如果他想要註冊或退出,他可以選擇。 如果他想註冊,那麼他會輸入他的名字和GPA來選擇基於他的GPA可用的專業,系統會自動生成一個ID。使用long long型打印

問題是id沒有正確遞增。

附加信息: 我使用

#include<stdio.h> 
#include<stdlib.h> 
#include<conio.h> 
#include<string.h> 
struct student{ 
    char name[30]; 
    int GPA; 
    unsigned long ID; 
    char colloege[100]; 
    student *next, *prev; 
}; 
student *stu, *cur, *head, *tail; 
void insertfront(); 
void displaylist(){ 
    unsigned long id=214000000; 
    cur=head; 
    printf(" "); 
    if(cur==NULL) 
     printf(" "); 
    else 
     while(cur!=NULL){ 
      printf("Name:%s\t",cur->name); 
      printf("ID:%d\t",cur->ID=id++); 
      printf("GPA:%d\t",cur->GPA); 
      printf("Colloege of:%s\t",cur->colloege); 
      printf("\n"); 
      cur=cur->next; 
     } 
    } 

void main(){ 
    clrscr(); 
    int x; 
    printf("\n\t\t\t\t******* King Faisal University *********\n"); 
    while(x!=2){ 
     printf("\n press 1 to insert your information ,press 2 to exit\n"); 
     scanf("%d",&x); 
     insertfront(); 
     displaylist(); 
    } 

    stu=NULL; 
    cur=NULL; 
    head=NULL; 
    tail=NULL; 
    getch(); 
} 

void insertfront(){ 
    int x,c; 
    stu=(student*)malloc(sizeof(student)); 
    fflush(stdin); 
    printf("Enter your name:\n"); 
    scanf("%[^\n]%*c",stu->name); 
    printf("Enter your GPA:\n"); 
    scanf("%ul",&stu->GPA); 
    printf("\n Available Colloeges\n"); 

    if(stu->GPA>=85) 
    { 
     printf("1.Colloege of Medicine\n 2.Colloege of Engenering\n 3.Colloege of Computer Science\n 4.Colloege of Business\n 5.Colloege of Art\n"); 
     printf("Enter the colloege number \n"); 
     scanf("%d",&c); 
     switch(c){ 
      case 1: strcpy(stu->colloege,"Medicien");break; 
      case 2: strcpy(stu->colloege,"Engenering");break; 
      case 3: strcpy(stu->colloege,"Computer Science");break; 
      case 4: strcpy(stu->colloege,"Business");break; 
      case 5: strcpy(stu->colloege,"Art");break; 
     } 
    } 
    else if(stu->GPA>=75) 
    { 
     printf("1.Colloege of Computer Science\n 2.Colloege of Business\n 3.Colloege of Art\n"); 
     printf("Enter the colloege number\n"); 
     scanf("%d",&c); 
     switch(c){ 
      case 1: strcpy(stu->colloege,"Computer Science");break; 
      case 2: strcpy(stu->colloege,"Business");break; 
      case 3: strcpy(stu->colloege,"Art");break; 
     } 
    } 
    else 
     strcpy(stu->colloege,"Art"); 
    if(head==NULL) 
    { 
     stu->next=NULL; 
     stu->prev=NULL; 
     head=stu; 
     tail=stu; 
    } 
    else 
    { 
     stu->next=head; 
     stu->prev=NULL; 
     head->prev=stu; 
     head=stu; 
    } 
} 
+4

你能否詳細說明你遇到的問題。你有構建錯誤嗎?運行時錯誤或崩潰?意外的結果?您可能想要[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask),以及如何創建[最小,完整和可驗證示例](http:/ /stackoverflow.com/help/mcve)。最後,你應該學會如何格式化你的代碼,使其可讀性和縮進。 –

+1

您使用的是C++編譯器嗎?你的代碼是無效的C(結構名不會自動進入全局範圍C)!爲了您自己的理智,使用C編譯器的C代碼:-) – pmg

+1

在打印時設置記錄ID是純粹的邪惡。 –

回答

5

你在你的程序中使用了不正確的轉換雙向鏈表結構

printf("ID:%d\t",cur->ID=id++); 
// cur->ID is of type unsigned long 
// %d is used for values of type int 

long您需要打印類型的值在printf()轉換中使用"%ld"

long longvalue = 42; 
printf("%ld\n", lonvgalue); 

要打印類型的值unsigned long你需要在printf()轉換

unsigned long ulongvalue = 42; 
printf("%lu\n", ulongvalue); 
+0

它的工作,但現在我面臨着另一個問題:(每當我進入一個新的人的前一個人的ID增加:/ – Najla

+0

你必須注意你在哪裏做請參閱[Klas's answer](http://stackoverflow.com/a/33913766/25324)。 – pmg

1

除了格式說明是錯誤的使用"%lu",你有指定ID的問題:秒。

每次顯示列表時,您的代碼都會分配新ID:s。

當創建記錄時,我只會爲每個學生記錄生成一次ID。

所以在insertfront補充一點:

stu->ID=id++; 

displaylist改變印刷:

printf("ID:%lu\t",cur->ID); 

和移動的id無論是全球範圍內聲明(任何函數之外)或insertfront內部的靜態變量:

static unsigned long id=214000000; 
+0

好吧,我做了,但現在我得到了一個警告,ID被分配了一個永遠不會使用的值 – Najla

+0

是的,我已經添加到我的回答中,您需要移動'id'的聲明。 –

+0

好的非常感謝您的幫助:) – Najla