PDA

View Full Version : رفع اشکال پروژه با لیست پیوندی



leilast
یک شنبه 17 تیر 1386, 18:30 عصر
سلام
این پروژه مربوط به یک بانک سی دیه.
کسی میتونه برام درستش کنه؟
enter:کد سی دی را میگیرد و به لیست پیوندی به صورت مرتب اضافه میکند
del:حذف سی دی پس از یافتن آن
searcha:جستجو بر اساس موضوع ونمایش نتیجه آن
searchb:جستجو بر اساس نام سی دی ونمایش آن
get:امانت سی دی و کم کردن یک واحد از موجودی سی دی
ret:برگشت سی دی و اضافه کردن یک واحد به موجودی
show:نمایش تمام گره ها پس از انجام تغییرات


#include "conio.h"
#include "iostream.h"
#include "string.h"
#include "stdio.h"
class node {// ***********************************************
friend class cdbank;
int id;
char name[20];
char subject[20];
int num;
int date;
int other;
char exp[50];
class node* next;};
class cdbank{//********************************************
friend class node;
public:
cdbank();
~cdbank();
void show();
void enter();
void del();
void searcha();
void searchb();
void ret();
void get();
private:
node *first;};//*************************************
cdbank::cdbank(){
first='\0';}
cdbank::~cdbank(){ //**********************************
node *p;
p=first;
while(first!='\0'){
first=p->next;
delete p;
p=first;}}
void cdbank::show(){ //********************************
node *p;
p=first;
while(p){
p=p->next;
cout<<p->id<<p->name<<p->subject<<p->date<<p->other<<p->exp;}}
void cdbank::enter(){//***************************************
node *p,*q,*t;
int n,i;
cout<<"please enter n";
cin>>n;
for(i=0;i<=n;++i){
p=new node;
cout<<"p->id";
cin>>p->id;
if(p->id<1000)
cout<<"error";
else{
cout<<"your id is right";
cout<< "p->name"<<"p->subject"<<"p->date"<<"p->other"<<"p->exp";
cin>>p->id>>p->name>>p->subject>>p->date>>p->other>>p->exp;
p->next='\0';
if(!first)
first=p;
else{
q=first;
while(q&&q->id<p->id){
t=q;
q=q->next;}
if(q==first){
p->next=first;}
else{
p->next=t->next;
t->next=p;
}}}}
void cdbank::del(){ //***************************************
int cnt,j,idd;
node *p,*q;
cout<<"please enter cnt";
cin>>cnt;
for(j=0;j<=cnt;++j){
cout<<"enter idd";
cin>>idd;
p=first;
while(p){
p=p->next;
if(p->id=idd)
if(p=first)
first= p->next;
else
q->next=p->next;}}}
delete p;} //************************************************
void cdbank::searcha(){//namayesh gere ba mozoue morede nazar
node *p;
char s[20];
cout<< "s";
cin>>s;
p=first;
while(p){
p=p->next;
if(strcmp(s,p->subject)== 0)
cout<<p->id<<p->name<<p->subject<<p->date<<p->exp;
else
cout<<"your s not found";}}
void cdbank::searchb(){ //************************************
node *p;
char n[20];
cout<<"n";
cin>>n;
p=first;
while(p){
p=p->next;
if(strcmp(n,p->name)==0)
cout<<p->id<<p->name<<p->subject<<p->date<<p->exp;
else
cout<<"your n not found";}}
void cdbank::get(){ //******************************************
int id;node *p;
cout<<"id";
cin>>id;
p=first;
while (p){
p=p->next;
if(p->id==id){
p->other=0;//cd be amanat dade shode
p->num-=1;} //yek vahed az mojoudi kam mishavad
}}
void cdbank::ret(){//*****************************************
int code;node *p;
cout<<"code";
cin>>code;
p=first;
while (p){
p=p->next;
if(p->id==code){
p->other=1;
p->num+=1;}}}

void main(){//************************************************** **
cdbank c;
c.enter();
c.del();
c.searcha();
c.searchb();
c.get();
c.ret();
c.show();
getch();}

emad_67
یک شنبه 17 تیر 1386, 21:08 عصر
اون فسمتی رو که مشکل داری کدش رو بزار این جوری بهتر نتیجه میگیری

alireza643
دوشنبه 18 تیر 1386, 07:43 صبح
سلام
شما تو تابع main() از getch() استفاده کردید که برای این کار باید هدر conio.h رو هم به برنامه اضافه کنید که شما این هدر رو اضافه نکردید.
تو تابع enter یه } باز کرده بودی که براش { نگذاشته بودی و این باعث میشد برنامه تموم شدن این تابع رو متوجه نشه و توابعی که بعد از اون نوشته شده بود مثل Del داخل بدنه این تابع در نظر گرفته بشه و برنامه مشکل پیدا کنه.
در شمن تو تابع Del دو تا شرط داشتی که نوشته بودی


if(p->id=idd)
if(p=first)

این شرط ها برای برنامه شما مشکل منطقی به وجود میاره. برنامه شما رو من به شکل زیر اصلاح کردم که براتو میگذارم.


//---------------------------------------------------------------------------

#include <vcl.h>
#include "iostream.h"
#include "string.h"
#include "stdio.h"
#include "conio.h"

//---------------------------------------------------------------------------
class node
{
friend class cdbank;
int id;
char name[20];
char subject[20];
int num;
int date;
int other;
char exp[50];
class node* next;
};
//---------------------------------------------------------------------------
class cdbank
{
friend class node;
node *first;
public:
cdbank();
~cdbank();
void show();
void enter();
void del();
void searcha();
void searchb();
void ret();
void get();
};
//---------------------------------------------------------------------------
cdbank::cdbank()
{
first='\0';
}
//---------------------------------------------------------------------------

cdbank::~cdbank()
{
node *p;
p=first;
while(first!='\0')
{
first=p->next;
delete p;
p=first;
}
}
//---------------------------------------------------------------------------
void cdbank::show()
{
node *p;
p=first;
while(p)
{
p=p->next;
cout<<p->id<<p->name<<p->subject<<p->date<<p->other<<p->exp;
}
}
//---------------------------------------------------------------------------
void cdbank::enter()
{
node *p,*q,*t;
int n,i;
cout<<"please enter n";
cin>>n;
for(i=0;i<=n;++i)
{
p=new node;
cout<<"p->id";
cin>>p->id;
if(p->id<1000)
{
cout<<"error";
}
else
{
cout<<"your id is right";
cout<< "p->name"<<"p->subject"<<"p->date"<<"p->other"<<"p->exp";
cin>>p->id>>p->name>>p->subject>>p->date>>p->other>>p->exp;
p->next='\0';
}
if(!first)
{
first=p;
}
else
{
q=first;
while(q&&q->id<p->id)
{
t=q;
q=q->next;
}
if(q==first)
{
p->next=first;
}
else
{
p->next=t->next;
t->next=p;
}
}
}
}
//---------------------------------------------------------------------------
void cdbank::del()
{
int cnt,j,idd;
node *p,*q;
cout<<"please enter cnt";
cin>>cnt;
for(j=0;j<=cnt;++j)
{
cout<<"enter idd";
cin>>idd;
p=first;
while(p)
{
p=p->next;
if(p->id==idd)
if(p==first)
first= p->next;
else
q->next=p->next;
}
}
delete p;
}
//---------------------------------------------------------------------------
void cdbank::searcha()
{//namayesh gere ba mozoue morede nazar
node *p;
char s[20];
cout<< "s";
cin>>s;
p=first;
while(p)
{
p=p->next;
if(strcmp(s,p->subject)== 0)
cout<<p->id<<p->name<<p->subject<<p->date<<p->exp;
else
cout<<"your s not found";
}
}
//---------------------------------------------------------------------------
void cdbank::searchb()
{
node *p;
char n[20];
cout<<"n";
cin>>n;
p=first;
while(p)
{
p=p->next;
if(strcmp(n,p->name)==0)
cout<<p->id<<p->name<<p->subject<<p->date<<p->exp;
else
cout<<"your n not found";
}
}
//---------------------------------------------------------------------------
void cdbank::get()
{
int id;node *p;
cout<<"id";
cin>>id;
p=first;
while (p)
{
p=p->next;
if(p->id==id)
{
p->other=0;//cd be amanat dade shode
p->num-=1;
} //yek vahed az mojoudi kam mishavad
}
}
//---------------------------------------------------------------------------
void cdbank::ret()
{
int code;node *p;
cout<<"code";
cin>>code;
p=first;
while (p)
{
p=p->next;
if(p->id==code)
{
p->other=1;
p->num+=1;
}
}
}
//---------------------------------------------------------------------------
void main()
{
cdbank c;
c.enter();
c.del();
c.searcha();
c.searchb();
c.get();
c.ret();
c.show();
getch();
}
//---------------------------------------------------------------------------

در ضمن اگر برنامه هاتون رو یه کمی مرتب تر بنویسید این اشکالات رو خودتون به سادگی متوجه میشید.
موفق باشید.

alireza643
دوشنبه 18 تیر 1386, 07:47 صبح
یه نکته هم که یادم رفت بگم من به شخصه تو جاهایی که فقط یک سری متغیر دارم و تابعی نداردم ترجیح میدم از Struct به ای class استفاده کنم. مثل node که شما از کلاس استفاده کرده بودید. البته این مشکلی ایجاد نمیکنه و فقط به تکنیک برنامه نویسی شما برمیگرده که چه چیزی رو ترجیح میدید.

leilast
دوشنبه 18 تیر 1386, 16:21 عصر
ممنون از راهنماییتون.
درسته، من اصلا دندانه گذاری یاد ندارم!!
اما در قسمت وارد کردن اطلاعات(تابع enter)نام و عنوان(name,subject)از نوع کاراکتر تعریف شدند.اما هنگام وارد کردن کاراکتر ها کل اجرای برنامه به هم میریزه.یعنی همه داده ها رو باید عدد بدیم.
میشه در این مورد هم کمکم کنید؟

leilast
دوشنبه 18 تیر 1386, 16:26 عصر
#include <vcl.h>
در مورد این هد هم errorمیده؟حتما لازمه باشه؟
(conio.hرو هم نوشته بودم اما توی پستم نیومده)
بازم ممنون

emad_67
دوشنبه 18 تیر 1386, 18:40 عصر
اما در قسمت وارد کردن اطلاعات(تابع enter)نام و عنوان(name,subject)از نوع کاراکتر تعریف شدند.اما هنگام وارد کردن کاراکتر ها کل اجرای برنامه به هم میریزه.یعنی همه داده ها رو باید عدد بدیم.
میشه در این مورد هم کمکم کنید؟

مشکل از این خطه :


else
{
cout<< "p->name"<<"p->subject"<<"p->date"<<"p->other"<<"p->exp";
cin>>p->id>>p->name>>p->subject>>p->date>>p->other>>p->exp;
p->next='\0';
}

به چیزی که تو cout و cin نوشتی دقت کن p->id توی cin وجود داره ولی از کاربر نخواستی که واردش کنه در واقع توی cout از name شروع کردی به گرفتن
در مورد هدر vcl هم فکر نمیکنم همچین هدری تو c++ وجود داشته باشه البته ممکنه مال .net باشه ولی به هر حال لازم نیست تو این مثال باشه حالا نمیدونم چرا دوست قبلی اینو قرار داده بودن

alireza643
سه شنبه 19 تیر 1386, 07:44 صبح
این هدر مال محیط borland و من یادم رفت پاکش کنم. شرمنده.


به چیزی که تو cout و cin نوشتی دقت کن p->id توی cin وجود داره ولی از کاربر نخواستی که واردش کنه در واقع توی cout از name شروع کردی به گرفتن

در مورد وارد کردم داده هم اگر emad درست بگن فقط اولی داده باید مشکل داشته باشه نه کل داده ها.
من تا جایی که یادم هست اگر یه عدد رو میخواستیم از روی صفحه بخونی و کاربر به جای عدد حرف وارد میکرد این حرف همون کاری رو میکرد که Space برای متغیر های کاراکتری یعنی پایان ورود اطلاعات به این متغیر.
حالا شما اگر میشه بگید دقیقا چه اتفاقی میوفته تا بشه راهنمایی کرد.