标题:求解惑,关于long和unsigned long。。。
取消只看楼主
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
结帖率:100%
已结贴  问题点数:20 回复次数:2 
求解惑,关于long和unsigned long。。。
今天早上看见有人求图书馆管理程序的,就动手帮写了下,编译顺利通过了,可是却不能正常输出,没办法,排错弄了一白天,最后发现是数据类型的问题,代码如下
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Book{
    unsigned long num;  //就是这里出问题了,匪夷所思啊
    char name[30];
    char author[30];
    struct Book *next;
    }book;    // 定义结构体
book * make(book *head){
    book *p,*q;               //制作链表节点函数
    p=(book *)malloc(sizeof(book));
    printf("enter num:");
    fflush(stdin);
    scanf("%d",&p->num);
    fflush(stdin);
    printf("enter name:");
    gets(p->name);
    printf("enter author:");
    gets(p->author);
    p->next=NULL;
    if(head==NULL){head=p;return head;}//如果链表是第一次建立,即链表原来无内容
    else {q=head;
    while(q->next)q=q->next;//链表原来有内容
    q->next=p;return head;} }
book * find(book *head,char *s){//查找函数
    book *p;
    p=head;
    while(p){
    if(!(strcmp(s,p->name)))return p;//将字符串与链表内容比对,如一样,返回该节点指针
    p=p->next; }
    return NULL;//如比对结果都不一样,返回空指针
    }
book * del(book *head,book *p){//删除节点函数
    book *q;
    q=head;
    if(p==head){
        q=head;head=head->next;//如果删除的是头节点,返回新的头指针
        free(q);return head;}
    while(q->next!=p){q=q->next;continue;}//将q指向p的前一个节点
    q->next=p->next;
    free(p);return head;}
book * mod(book *head,book *p){//修改节点函数
    while(head==p)continue;
    printf("enter num");
    scanf("%d",&p->num);
    printf("enter name");
    scanf("%s",p->name);
    printf("enter author");
    scanf("%s",p->author);
    return head;}
void xianshi(book *p){//显示全部函数
    while(p){
        printf("No.:%d\nname:%s\nauthor:%s\n\n",p->num,p->name,p->author);
        p=p->next;}}
   
main(){
    int x,i,j;
    book *head=NULL,*p;
    char s1[30];
    for(;;){
    printf("=============enter what=================\n");
    printf("\t1:enter book.\n\t2:search book.\n\t3:delete book.\n\t4:modify book.\n\t5:xianshi\n");
    printf("========================================\n");
    fflush(stdin);
    scanf("%d",&x);
    switch(x){
        case 1:head=make(head);break;//建立节点
        case 2:
        case 3:
        case 4:if(head==NULL){printf("no have any book!\n");break;}
               printf("whitch book");fflush(stdin);
               scanf("%s",s1);p=find(head,s1);
              if(x==2)if(p)printf("NO.:%d\nname:%s\nautor:%s\n",p->num,p->name,p->author);
                        else printf("no find");
              if(x==3)head=del(head,p);
              if(x==4)head=mod(head,p);
              break;
        case 5:xianshi(head);break;
        default:printf("error");
        }
    printf("===========还有事吗?=============");
    printf("\n\t1:有.  0:没有\n========================================\n");
    fflush(stdin);
    scanf("%d",&x);
    if(!x)break;
    }
    }
    
原来我想书要是很多的话,int型不够就用的unsigned long,测试时也用的长整数(7,8位都),这样就发现输出的编号都不是我输入的数字。起初根本没想到类型的问题,到后来才发现不论我定义int还是unsigned long都只能输入5位数,可是我翻遍数都是unsigned有效位是十位啊,为什么我输入6位就不行了呢??求解惑??
搜索更多相关主题的帖子: color long 管理程序 
2012-12-15 17:07
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:0 
回复 楼主 yaobao
我用int,long,unsigned long都试过,结果都是超过五位就错误

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-15 17:34
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:0 
回复 5楼 小小战士
程序确实有问题,可这不能影响数据类型的有效位数啊,TNND我的编译器上int,short,long,unsigned long都是五位

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-16 16:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-391396-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023578 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved