PDA

View Full Version : اشگال این برنامه ی من از کجاست؟!



ma)-(di
یک شنبه 21 تیر 1388, 14:45 عصر
سلام.
ببخشید میشه لطف کنید و به من بگید که اشگال این برنامه کجاست؟!
من از کامپایلر Borland استفاده میکنم.
هنگام کامپایل از من ایرادی نمیگیره، اما موقع Run کردن، برنامه اجرا نمیشه!
توی Microsoft Visual هم که error میگیره!
از کجای برنامه، نمیدونم!

ممنون میشم راهنمایی کنید، باور کنید من هرچی فکر میکنم اشگالی تو این برنامه نمیبینم!




#include<iostream.h>
int visit[100];
class graph
{

private:
int data;
graph*next;

public:
graph* read_graph(graph*);
void ftraverse(graph*);
void make(graph*);
}

*g[100];

//********************

graph* graph::read_graph(graph*head)
{
int x;
graph*last;
head=last=NULL;

cout<<"Enter adjecent node ,-1 to stop:\n";
cin>>x;
while(x!=-1)
{
graph*NEW;
NEW=new graph;
NEW->data=x;
NEW->next=NULL;

if(head==NULL)
head=NEW;
else
last->next=NEW;
last=NEW;

cout<<"Enter adjecent node ,-1 to stop:\n";
cin>>x;
}

return head;
}

//********************
void graph::ftraverse(graph*h)
{
while(h!=NULL)
{
cout<<h->data<<"->";
h=h->next;
}
cout<<"NULL"<<endl;
}

//********************
void graph::make(graph*)
{
int i;
cout<<"************************************************** ********\n";
cout<<"This program makes an unweighted graph \n";
cout<<"************************************************** ********\n";
cout<<"\n";
cout<<"Enter the no of nodes ::";
cin>>data;
for(i=1;i<=data;i++)
g[i]=NULL;

for(i=1;i<=data;i++)
{
cout<<"\n";
cout<<"Enter the adjacent nodes to node no. "<<i<<endl;
cout<<"***************************************\n";
cout<<"\n";
g[i]=read_graph(g[i]);
} //display the graph

cout<<"\n\nThe entered graph is ::\n";
for(i=1;i<=data;i++)
{
cout<<" < "<<i<<" > ::";
ftraverse(g[i]);
}
}

//********************
int main()
{
graph make();
return 0;
}

tdkhakpur
یک شنبه 21 تیر 1388, 17:36 عصر
سلام
خوب با کار شما هیچ تابعی صدا زده نمیشود سوای از این که برنامه شما چکار خواهد کرد کد زیر را داخل main عوض کنید.


graph make();
.. تبدیل به
graph g ;
g.make(&g);

ma)-(di
چهارشنبه 24 تیر 1388, 12:29 عصر
ببخشید، سلام.
من این برنامه رو جایی دیدم، زیادم برنامه نویسی من خوب نیست.
میشه راهنمایی کنید که اشگالات این برنامه کجاست؟!
یک دنیا سپاسگزار میشم.



#include<iostream.h>
#include<conio.h>
#define true 1
#define false 0

class node
{
int data; //each node contain adjancent vertex
node *link;
friend class graph;
};


class graph //we can use data link in graph class
{
private:
int n; //vertex
int e; //edge
sll<int> *a; //array of sll objects vertex num are integer
public:
graph(); //initialise n,e
~graph(); //delete all the linked list in the array
void create(); // create all the linked list
void display(); // display all the linked list
int degree(int i); //return the depth of ith vertex
void bft();
void dft();
void traverse(int j,int * visited);
void nov(); //return no of vertex
void noe(); //return no of edges
};

graph::graph()
{
cout<<"Enter the no of vertex\n";
cin>>n;
cout<<"Enter the no of edges of graph\n";
cin>>e;
a=new sll<int>[n];
}

void graph::create()
{
for(int i=0;i<=n-1;i++)
{
cout<<"Enter adjancent vertices of "<<i<<"in ascending order terminated -1"<<"\n";
a[i].create();
}
}

int graph::degree(int i)
{
return(a[i].length())
}

int graph::nov()
{
return(n);
}
int graph::noe()
{
return(e);
}

graph::~graph()
{
for(int i=0;i<n-1;i++)
a[i].erase();
delete[] a;
}

void graph::display()
{
for(int i=0;i<n-1;i++)
a[i].display(i);
}

template<class t>void sll<t>::display()
{
node *temp;
temp=first;
if(first==NULL)
cout<<" Adjancent \n";
else
while(temp!=NULL)
{
cout<<temp->data;
temp=temp->link;
}
}

void graph::bft()
{
node *temp;
int i,j;
queue<int> b;
int *visited;
visited =new int[n];

for(int i=0;i<n-1;i++)
visited[i]=false;

for(int i=0;i<=n-1;i++)
{
if(!visted[i])
{
b.insert(i);
while(!b.isempty())
{
j=b.del();
if(!visited[j])
{
cout<<j;
visited[j]=false;
for(temp=a[j].first;temp!=NULL;temp=temp->link)
{
if(!visited[temp->data])
b.insert(temp->data);
}
}
}
}
}
}
void graph::dft()
{
int *visited;int i;
visited=new int[n];
for(i=0;i<=n-1;i++)
visited[i]=false;
for(i=0;i<n-1;i++)
{
if(!visited[i])
traverse(i,visited);
}
}
void graph::travrse(int j,int visited[])
{
if(visited[j])
{
cout<<j;
visited[j]=true;
for(temp=a[j].first;temp!=NULL;temp=temp->link)
{
if(!visited[temp->data])
traverse(temp->data,visited);
}
}
}
void menu()
{
cout<<"1.Print the Graph\n";
cout<<"2.Display no of vertices and edges\n";
cout<<"3.Display Degree of each vertex\n";
cout<<"4.BFT\n";
cout<<"5.DFT\n";
cout<<"Exit\n";
}



main()
{
int ch;
graph a;
a.create();
menu();
cout<<"Enter Your Choice\n";
cin>>ch;
while(ch<6)
{
switch(ch)
{
case 1:
a.display();
break;
case 2:
cout<<"No of vertices :"<<a.nov();<<"\n";

cout<<"No of edges :"<<a.noe();<<"\n";
break;
case 3:
for(int i=0;i<=a.nov()-1;i++)
cout<<i<<"\t"<<a.degree(i)<<"\n";
break;
case 4:
a.bft();
cout<<"\n";
break;

case 5:
a.dft();
cout<<"\n";
break;

}
menu();
cout<<"Enter Your Choice\n";
cin>>ch;
}
getch();
return(0);
}

tdkhakpur
چهارشنبه 24 تیر 1388, 12:33 عصر
سلام
من از کجای برنامه رفع اشکال کنم.
ببینید شما برنامه را کامپایل کنید بعد هر جا که erore گرفت نوع خطا رو به همراه خط مورد نظر ارسال کنید.تا مشکل شما حل بشود .

ma)-(di
شنبه 27 تیر 1388, 16:03 عصر
ببخشید مجدد سوال میکنم!
تورو خدا این بار هم من رو مشمول لطف کنید!
راستش، بی خیال برنامه ی بالایی شدم.
الان یه مشگل جدید دارم!
اینجا توی Case 2 از من ایراد میگیره!
این ERROR رو میده:

case bypasses initialization of a local variable in function main()





#include <iostream.h>
#include <conio.h>
#include <stdio.h>

//***********************************************

struct krusper
{
int v1;
int v2;
int weight;
};

int g=0;

//***********************************************

void sort(struct krusper ed[],int m)
{
struct krusper temp;
for (int i=0;i<m;i++)
for (int j=i+1;j<m;j++)
if (ed[j].weight<ed[i].weight)
{
temp=ed[i];
ed[i]=ed[j];
ed[j]=temp;
}
}

//**************************************************

int kruskal_mst(int set[],struct krusper edge[],int n,int m)
{
int te=0;
int q=0;
struct krusper e;
while (te<n-1 && g<m)
{
e=edge[g++];
if (set[e.v1] != set[e.v2])
{
q+=e.weight;
int k=set[e.v1];
for (int i=0;i<n;i++)
if (set[i]==k)
set[i]=set[e.v2];
te++;
}
}
if(te==n-1)
return q;
else
return -1;
}


//***********************************************

int perim(int set2[],struct krusper edge2[],int nn,int mm)
{
int fe=0;
int p=0;
struct krusper ee;
while (fe<nn-1)
{
//********************************
int y=0;
ee.weight=0;
for (int ii=0;ii<mm;ii++)
if ((set2[edge2[ii].v1]==0 && set2[edge2[ii].v2]!=0) || (set2[edge2[ii].v2]==0 && set2[edge2[ii].v1]!=0))
{
if(y==0)
{
ee=edge2[ii];
y++;
}
else
if (ee.weight>edge2[ii].weight)
ee=edge2[ii];
}
//**********************************
if (y!=0)
{
p+=ee.weight;
cout<<"("<<ee.v1<<","<<ee.v2<<") => W :"<<ee.weight<<"\t";
set2[ee.v1]=0;
set2[ee.v2]=0;
fe++;
}
else
break;
}
return p;

}

//***********************************************
int menu();
//***********************************************
void main()
{
int n,m;
int nn,mm;

while (1)

{

switch (menu())

{


case 1:
cout<<"\n";
cout<<"************************************************** *****************\n";
cout<<"This program is to implement Kruskal Algorithm on a weighted graph \n";
cout<<"************************************************** *****************\n";


cout<<"\n";
cout<<"Enter no. of Vertex : ";
cin>>n;
int set[10];
for (int i=0;i<n;i++)
set[i]=i;

cout<<"Enter no. of Edge : ";
cin>>m;
struct krusper edge[20];

for (i=0;i<m;i++)
{
cout<<"\n";
cout<<"1st Vertex : ";
cin>>edge[i].v1;
cout<<"2nd Vertex : ";
cin>>edge[i].v2;
cout<<"Weight : ";
cin>>edge[i].weight;
}
sort(edge,m);

for (i=0;i<m;i++)
cout<<"("<<edge[i].v1<<","<<edge[i].v2<<") => W :"<<edge[i].weight<<"\n";
cout<<"Weight Is : "<<kruskal_mst(set,edge,n,m);

break;


case 2 :
cout<<"\n";
cout<<"************************************************** *****************\n";
cout<<"This program is to implement Kruskal Algorithm on a weighted graph \n";
cout<<"************************************************** *****************\n";


cout<<"Enter no. of Vertex : ";
cin>>nn;
int set2[10];
for (int ii=0;ii<nn;ii++)
set2[ii]=ii;

cout<<"Enter no. of Edge : ";
cin>>mm;
struct krusper edge2[20];

for (ii=0;ii<mm;ii++)
{
cout<<"\n";

cout<<" 1st Vertex : ";
cin>>edge2[ii].v1;

cout<<" 2nd Vertex : ";
cin>>edge2[ii].v2;

cout<<" Weight : ";
cin>>edge2[ii].weight;
}

for (ii=0;ii<mm;ii++)
cout<<"("<<edge2[ii].v1<<","<<edge2[ii].v2<<") => W :"<<edge2[ii].weight<<"\n";
cout<<"\nWeight Is : "<<perim(set2,edge2,nn,mm);

break;

}//end of switch
} //end of while
} // end of main

//********************
int menu()
{
int c;

cout << "\n";

cout << " 1 For Kruskal.\n";

cout << "\n";

cout << "2 For Perim.\n";

cout << "\n";

cout << "Now You can Enter your select Between 1 and 2 : ";

cout << "\t";

cin >> c;

return c;
}

Nima_NF
شنبه 27 تیر 1388, 18:57 عصر
با توجه به اینکه زبان C هست یا C++ و با توجه به کامپایلر این موضوع متفاوت هست.

توصیه می کنم اصلا متغیر ها را داخل case تعریف نکنید تا با همه کامپایلرها سازگار باشد. یعنی edge2 و set2 و غیره را بالای switch تعریف کنید نه داخل آن.

در صورتی که نمی خواهید مورد فوق را رعایت کنید، راه های دیگر به این شکل هست: متغیر ها را فقط اول case تعریف کنید و داخل یا لابلای کدهای داخل بلاک case تعریف نکنید. ضمنا در برخی موارد ناچار می شوید که بلاک را مشخص کنید یعنی باید با { } حوزه case را مشخص کنید



case 2:
{
// var
// codes
}

در کل پیشنهاد می کنم همان روش اول را انجام دهید تا سازگاری همه جا حفظ شود (یعنی خارج switch).

tdkhakpur
شنبه 27 تیر 1388, 19:12 عصر
سلام
شما سعی کنید متغییر ها را قبل از switch تعریف کنید و داخل case همیشه کد مربوطه را قرار دهید.


int set[10];

این متغییر را ببر بالای switch