I am trying to create a program to represent Graph using Adjacency List. In that I have created a menu-driven program and implemented non-class functions to create the graph, create edges between the vertices and to display the graph.
The main question is to represent a map of area in the form of graph and use single characters (like 'a','b' or 'c' etc) to represent the cities. Following is the code:
#include<iostream>
using namespace std;
class Graph
{
public:
char city;
int distance;
Graph *next;
};
Graph **graph=new Graph*[20];
int size;
void display()
{
for(int i=0;i<size;i++)
{
Graph *temp=graph[i];
while(temp!=NULL)
{
cout<<temp->city<<"--"<<temp->distance<<"--";
if(temp->next==NULL)
cout<<"NULL"<<endl;
}
}
}
void edges()
{
for(int i=0;i<size;i++)
{
for(int j=0;j<i;j++)
{
if(i==j)
continue;
Graph *temp=graph[i],*node=new Graph;
char input;
cout<<"\nIs there connection between " << graph[i]->city << " and " << graph[j]->city << "? Enter y or n: ";
cin>>input;
if(input=='y' || input=='Y')
{
cout<<"\nEnter the distance between them:";
cin>>node->distance;
temp->next=node;
temp=temp->next;
temp->next=NULL;
}
}
cout<<endl;
}
cout<<"Edges Created Successfully\n";
}
void create()
{
cout<<"Enter the number of cities:";
cin>>size;
cout<<"Enter "<<size<<" cities\n";
for(int i=0;i<size;i++)
{
cout<<"City number "<<i+1<<":";
cin>>graph[i]->city;
cout<<endl;
}
}
int main()
{
while(true)
{
int choice;
cout<<"\n1.Create a graph\n";
cout<<"2.Create the connections between the vertices\n";
cout<<"3.Display the graph\n";
cout<<"4.Exit\n";
cout<<"Enter your choice:";
cin>>choice;
switch(choice)
{
case 1:
create();
break;
case 2:
edges();
break;
case 3:
display();
break;
case 4:
exit(0);
break;
default:
cout<<"Invalid Choice"<<endl;
break;
}
}
}
The error I am getting is : Whenever I run the program, the program terminates unexpectedly after taking 3rd city as input. It does not allow me to take further inputs as well as to perform other operations.
Please help me as this error is quite new to me. I think the cause of the error might be due to dynamically created Graph pointers array. But it is just a guess and I do not know the real cause of this problem.
Related
I'm trying to develop a program that, in case 2, after an array has been "filled" it adds another space so you are able to add another value to your original array. I tried my best but failed miserably. I cannot use std::copy to just copy the array and add it to a new one with more space in it. Any help is appreciated, thanks!
#include <iostream>
#include <string>
using namespace std;
void stampa (string x[], int q){ //Cout all inserted names
int i;
cout<<"Your names are: "<<endl;
for (i=0; i<q; i++){
cout<<x[i]<<endl;
}
}
void carica(string x[], int q){ //Function to insert the names
int i;
for(i=0; i<q; i++){
cout<<"Insert the "<<i+1<<" name:"<<endl;
cin>>x[i];
}
}
void controllo (int &x){ //Error if a negative number is inserted
while (x<=0) {cout<<"Error! Insert a positive number:"<<endl;
cin>>x;
}
}
int main(){
int scelta, n;
string nome;
bool exit=false;
cout<<"How many names do you want to enter?"<<endl;
cin>>n;
controllo(n);
string a[n];
carica(a,n);
do{
system("cls");
cout<<"1) Print your names"<<endl;
cout<<"2) Insert a new name"<<endl;
cout<<"3) Exit"<<endl<<endl;
cin>>scelta;
switch (scelta){
case 1:
stampa(a,n);
system("pause");
break;
case 2:
cout << "Enter new name to insert: " << endl;
cout<<"Done!"<<endl;
system("pause");
break;
case 3:
exit=true;
cout<<"Goodbye!"<<endl;
break;
}
}while (!exit);
system("pause");
}
Try using std::vector instead of a simple array, or create an array through pointers.
vector: https://www.youtube.com/watch?v=Jh2urtP00Zg
Pointers: https://www.programiz.com/cpp-programming/memory-management
A basic student database using classes, I accept
name,
roll number, and
sgpa(cgpa equivalent but out of 10).
I used while loop, and switch case,but if the code for sgpa validation, and code for displaying all students with same sgpa is removed, the program works neatly, but if not, the program goes into continuous loop, the while loop inside the main, as it accepts the options itself and keeps doing it.
The code fails when i accept the sgpa(while taking the student data) or call the displaySGPA fucntion(option 3)
int totalStudents=0;
class database{
float sgpa;
int roll;
string name;
public:
void getSGPA();
void getData(database []);
friend void displaySGPA(int,database []);
};
//Display Students with same SGPA
void displaySGPA(int temp,database students[]){
int i,sameSGPA=0;
for(i=0;i<totalStudents;i++){
if(students[i].sgpa==temp){
sameSGPA+=1;
}
}
if(sameSGPA>1){
cout<<"\nStudents with SGPA "<<temp<<"."<<endl;
for(i=0;i<totalStudents;i++){
if(students[i].sgpa==temp){
cout<<" "<<students[i].roll<<" "<<students[i].name;
}
}
}
else if(sameSGPA==1){
cout<<"Only one student with the SGPA , "<<temp<<". :"<<endl;
for(i=0;i<totalStudents;i++){
if(students[i].sgpa==temp){
cout<<" "<<students[i].roll<<" "<<students[i].name;
break;
}
}
}
else{
cout<<"No Student with given SGPA."<<endl;
}
}
void database :: getData(database students []){
cout<<"\nEnter Name : ";
cin>>name;
cout<<"Enter Roll. ";
cin>>roll;
getSGPA();
}
//SGPA validation
void database :: getSGPA(){
int x=1,temp;
while(x==1){
cout<<"Enter SGPA : ";
cin>>temp;
if(temp<=10){
sgpa=temp;
break;
}
else{
cout<<"Please enter a valid SGPA.";
}
}
}
//main Loop
int main() {
int x,temp;
database students[50];
while (x!=5){
cout<<"\n1.Enter a New Student.\n3.Display students with same SGPA.\n5.Exit.\n\nYour Choice : ";
cin>>x;
switch(x){
case 1:
students[totalStudents].getData(students);
totalStudents++;
break;
case 3:
cout<<"\nEnter the SGPA.";
cin>>temp;
displaySGPA(temp,students);
break;
case 5:
cout<<"Exiting the program.....";
break;
default:
cout<<"Please select a valid option."<<endl;
}
}
}
I found the bug, it was a type conversion bug, i was accepting a float value but passing it as a int,just worked, don't know why.But thanks for each comment and suggestion.
vector<int> var;
int numb;
cout<<"Enter number: ";
while (cin>>numb) {
if (cin.get()==char(32)) {
var.push_back(numb);
shellsort(var);
for (int i=0; i<var.size(); i++) {
cout<<var[i]<<" ";
}
} else if (cin.get()=='\n') {
break;
}
}
I used ascii code 32 to read space and a sort function. Loop the value to show current list. The problem is the current sorted list wont show during input of value. What to do?
You are calling, cin.get(), twice unnecessarily, fix that, and you are good to go.
Here is the fixed code:
vector<int> var;
int numb;
cout<<"Enter number: ";
while(cin>>numb)
{
char c = cin.get();
if(c==char(32))
{
var.push_back(numb);
shellsort(var);
for(int i=0;i<var.size();i++)
{
cout<<var[i]<<" ";
}
cout<<endl;
}
else if(c=='\n')
{
break;
}
}
Why is the following code not giving results and how to get results?
Whenever I run the code, it first asks for the names of the players of two teams playing the match, then it shows the menu from which if we select any one of the option it again asks for the batsman name which is not according to the program designed. My research on the code and the problem is that I think buffer memory is full but I don't know how to free it, any help would be beneficial. Thank you
#include<iostream>
#include<string.h>
#include<conio.h>
using namespace std;
class scorecard{
char batname[11][20];
int runscored[11];
char situation[11][10];
char mode[11][15];
char bowlername[11][20];
float oversplayed[11];
int maiden[11];
int runsgiven[11];
int wicketstaken[11];
public:
void updatebatsman(void);
void updatebowler(void);
void displaybat(void);
void displaybowl(void);
void menu(void);
scorecard()
{for(int n=0;n<12;n++)
{
runscored[n]={0};
oversplayed[n]={0};
maiden[n]={0};
runsgiven[n]={0};
wicketstaken[n]={0};
}
}
};
int main()
{
int jb=0;
scorecard s1;
int kb;
s1.menu();
do
{
cout<< "Enter the option"<<endl;
cout<<"(1) Display batting score"<<endl<<"(2) Display Bowling score"<<endl<<"(3) Update batting score"<<endl;
cout<<"(4) Update Bowling score"<<endl;
cin >>kb;
switch(kb)
{
case 1 : s1.displaybat();
break;
case 2 :s1.displaybowl();break;
case 3:s1.updatebatsman();break;
case 4:s1.updatebowler();break;
default:cout<<"Wrong choice";
}
}while (jb<1);
}
void scorecard::updatebowler(void)
{char bowlname[20];
int str,k,option,overnumbers,maidenumb,uprun,upwicket;
cout<<"Enter Bowler name:";
cin.getline(bowlname,20);
for( k=0;k<11;k++)
{str= strcmp(bowlername[k],bowlname);
if (str== 0)
{
cout<<"Menu for Bowler information update "<<endl;
cout<<"(1) Update Number of overs"<<endl<<"(2) Update maiden overs"<<endl<<"(3) Update runs given"<<endl;
cout<<"(4) Update wickets taken"<<endl;
cin >> option;
switch(option)
{
case 1:{cout<<"Enter Numbers of overs to be updated:";
cin >>overnumbers;
cout<<endl;
oversplayed[k]+=overnumbers;
break;
}
case 2:{cout <<"Enter the number of maiden overs to be updated:";
cin>>maidenumb;
cout<<endl;
maiden[k]+=maidenumb;
break;
}
case 3:{cout <<"Enter the number of runs to be added:";
cin>>uprun;
cout<<endl;
runsgiven[k]+=uprun;
break;
}
case 4: {cout<<"Enter number of wickets to be updated:";
cin >>upwicket;
cout<<endl;
wicketstaken[k]+=upwicket;
}
default:cout<<"wroung choice";
}
break;
}
}
if (str!=0)
cout <<"You entered wrong player."<<endl;
}
void scorecard::updatebatsman(void)
{char batsmaname[20];
int str,k;
cout<<"Enter Batsman name:";
cin.getline(batsmaname,20);
for( k=0;k<11;k++)
{str= strcmp(batname[k],batsmaname);
if (str== 0)
{
cout<<"enter runs scored:";
cin>>runscored[k];
cout<<endl<<"enter weather out or not out:";
cin>>situation[k];
cout<<endl<<"enter mode(if batsman out) by which batsman was out:";
cin>>mode[k];
break;
}
}
if (str!=0)
cout <<"You entered wrong player."<<endl;
}
void scorecard::displaybat(void)
{
cout << "Batsman name"<<'t'<<"Runs scored"<<'t'<<"situation"<<'t'<<"mode"<<endl;
for(int j=0;j++;j<12)
{
cout<<batname[j]<<'t'<<runscored[j]<<'t'<<situation[j]<<'t'<<mode[j]<<endl;
}
}
void scorecard::displaybowl(void)
{
cout << "Bowler name"<<'t'<<"overs played"<<'t'<<"maiden overs"<<'t'<<"wicket taken"<<'t'<<"Runs given"<<endl;
cout<<endl;
for(int j=0;j++;j<12)
{
cout<<bowlername[j]<<'t'<<oversplayed[j]<<'t'<<maiden[j]<<'t'<<wicketstaken[j]<<'t'<<runsgiven[j]<<endl;
}
}
void scorecard::menu(void)
{
cout<<"Enter the name of players of batting team"<<endl;
for (int k=0;k<11;k++)
{
cout <<"Enter name of player "<<k+1<<":";
cin>>batname[k];
}
cout <<"Enter the name of players of bowling team"<<endl;
for (int n=0;n<11;n++)
{
cout <<"Enter name of player "<<n+1<<":";
cin>>bowlername[n];
}
}
This is very wrong:
for(int j=0;j++;j<12)
It should be:
for(int j=0; j < 11; j++)
You are also missing a break in your case 4 statement for the options:
case 4: {cout<<"Enter number of wickets to be updated:";
cin >>upwicket;
cout<<endl;
wicketstaken[k]+=upwicket;
break;
}
default:cout<<"wroung choice";
Without the break you will see also the output wrong choice when the user selects option 4.
How Can I return all the structures when i choose 7.Logout after i insert a record from the Admin menu, and if i return to the admin menu, i'll see the record again.
For Example
User:Admin
Pass:Admin
then i choose 2.Insert Product after that Ill go choose 1.display , after that i 7.log out. now i want to login again as Admin but i want to see all the data again.please help this is our thesis project.
#include <iostream>
#include <string>
#include <iomanip>
#include <conio.h>
using namespace std;
struct product{
string pname,pid;
int qnty;
double price;
product *ptr;
};
//Function Declaration
void Menu(string username);
void InsertProduct();
void DeleteProduct();
void DisplayProduct();
void SearchProduct();
void PurchaseProduct();
//
product *head;
int main() //Account Login
{
int pw=0,n;
char pwc=' ';
string username,password;
cout<<"\n ==============================================================================="<<endl<<endl;
cout<<"\t\t\t LICA'S GROCERY STORE"<<endl<<endl;
cout<<" ==============================================================================="<<endl<<endl;
cout<<"\t\t\t Username: ";
getline(cin, username);
cout<<"\n\t\t\t Password: ";
do
{
pwc=getch();
if(pwc==13||pwc==' ')
{
break;
}
cout<<"*";
password+=pwc;
pw++;
}
while(pwc!=13||pwc!=' ');
n=username.length();
for(int a=0; a!=n; a++)
{
if(isupper(username.at(a)))
{
username.at(a) = tolower(username.at(a));
}
}
if(username=="admin" && password=="Admin")
{
system("CLS");
cout<<"\n ==============================================================================="<<endl<<endl;
cout<<"\t\t\t\t WELCOME ADMIN!"<<endl<<endl;
cout<<" ==============================================================================="<<endl<<endl;
Menu(username);
return main();
}
else if(username=="cashier" && password=="Cashier")
{
system("CLS");
cout<<"\n ==============================================================================="<<endl<<endl;
cout<<"\t\t\t\t WELCOME CASHIER!"<<endl<<endl;
cout<<" ==============================================================================="<<endl<<endl;
Menu(username);
}
else
{
system("CLS");
cout
<<"\n\t\t Invalid Username or Password. Please Try Again"<<endl;
return main();
}
system("pause");
return 0;
}
//
//
//
//
//
void Menu(string username)
{
head=NULL;
int menu;
if(username=="admin")
{
do
{
cout
<<"\t MENU: "
<<"\n\n\t\t\t A. FILE MAINTENANCE" <<endl
<<"\n\t\t\t\t 1. Display All Products"<<endl
<<"\t\t\t\t 2. Insert New Product"<<endl
<<"\t\t\t\t 3. Delete A Product" <<endl
<<"\t\t\t\t 4. Search A Product"<<endl
<<"\n\t\t\t B. SALES MODULE"<<endl
<<"\n\t\t\t\t 5. Cashier"<<endl
<<"\t\t\t\t 6. Print Receipt."<<endl
<<"\n\t\t\t C. EXIT"<<endl
<<"\n\t\t\t\t 7. Log Out"<<endl;
cout<<"\n\t Choose an option (1 to 7 only): ";
cin>>menu;
cin.ignore();
switch(menu)
{
case 1:
cout<<"\n ============================================================================="<<endl<<endl;
cout<<"\t\t\t DISPLAY ALL PRODUCTS"<<endl<<endl;
cout<<" ============================================================================="<<endl<<endl;
DisplayProduct();
system("pause");
system("CLS");
break;
case 2:
cout<<"\n ============================================================================="<<endl<<endl;
cout<<"\t\t\t INSERT NEW PRODUCT"<<endl;
cout<<" ============================================================================="<<endl<<endl;
InsertProduct();
break;
case 3:
cout<<"\n ============================================================================="<<endl<<endl;
cout<<"\t\t\t DELETE A PRODUCT"<<endl;
cout<<" ============================================================================="<<endl<<endl;
DeleteProduct();
break;
case 4:
cout<<"\n ============================================================================="<<endl<<endl;
cout<<"\t\t\t SEARCH A PRODUCT" <<endl;
cout<<" ============================================================================="<<endl<<endl;
SearchProduct();
break;
case 5:
cout<<"\n ============================================================================="<<endl<<endl;
cout<<"\t\t\t PURCHASE PRODUCTS"<<endl;
cout<<" ============================================================================="<<endl<<endl;
PurchaseProduct();
case 7:
cout<<"\n\n THANK YOU ADMIN!"<<endl<<endl;
break;
default:
cout<<"\n\n INVALID INPUT!"<<endl<<endl;
}
}while(menu!=7);
}
else
{
cout
<<"Choose an Option"
<<"\n1.Sales Module"
<<"\n2.Exit"<<endl;
cin>>menu;
switch(menu)
{
case 1:
cout<<"Sales Module";
break;
case 2:
cout<<"Exit!";
break;
default:
cout<<"Invalid Input!";
}
}
}
void InsertProduct()
{
product *newproduct;
newproduct=new product;
cout<<"\n\n\tEnter Product Name:";getline(cin,newproduct->pname);
cout<<"\n\tEnter Product Quantity:";cin>>newproduct->qnty;
cout<<"\n\tEnter Product ID:";cin>>newproduct->pid;
cout<<"\n\tEnter Product Price:";cin>>newproduct->price;
cin.ignore();
newproduct->ptr=NULL;
if(head==NULL)
head=newproduct;
else
{
product *lastproduct;
lastproduct=head;
while(lastproduct->ptr!=NULL)
lastproduct=lastproduct->ptr;
lastproduct->ptr=newproduct;
}
cout<<"\n\tProduct is inserted"<<endl;
system("pause");
system("CLS");
}
void DeleteProduct()
{
DisplayProduct();
product *current,*previous;
current=head;
int x;
if (current==NULL)
{
cout<<"\n\t\tNo Products Found.";
}
else
{
cout<<"\n\t\tEnter Product No. to delete:";
cin>>x;
int i=1;
if(x==1)
{
head=current->ptr;
delete current;
cout<<"\n\t\tProduct is deleted";
DisplayProduct();
}
else
{
while(i<x&¤t!=NULL)
{
previous=current;
current=current->ptr;
i=i++;
}
if(current==NULL)
{
cout<<"\n\t\tProduct does not Exist";
}
else
{
previous->ptr=current->ptr;
delete current;
cout<<"\n\t\tProduct is deleted";
DisplayProduct();
}
}
}
system("pause");
system("CLS");
}
void DisplayProduct()
{
product *current;
current=head;
int i=1;
cout<<setiosflags(ios::left);
while(current!=NULL)
{
cout<<"\n\t\t"<<setw(4)<<i;
cout<<setw(25)<<current->pname<<setw(3)<<current->qnty <<setw(3)<<current->pid <<setw(3)<<current->price;
current=current->ptr;
i++;
}
}
void SearchProduct()
{
string sid;//Name to search
product *current;
current=head;
if (current==NULL)
cout<<"\n\t\tNo Products Found";
else
{
cout<<"\n\t\tEnter product to search: ";
cin>>sid;
int i=1;
while(sid.compare(current->pid))
{
current=current->ptr;
if (current==NULL)
break;
i++;
}
if(current!=NULL)
cout<<"\n\t\t"<<current->pid<<" is Product No."<<i;
else
cout<<"\n\t\t"<<sid<<" is not in the list.";
DisplayProduct();
cout<<endl;
}
system("pause");
system ("CLS");
}
void PurchaseProduct()
{
}
Your data is in memory until you save it to hardk disk, so you need to implement some mechanism for doing that.
You can choose among several options such as using data bases, plain files(XML, YAML, JSON, etc ...) and object searialization wich I think it's your best option right now. There are several libraries out there for doing that, but for start I recommend you use this tutorial. Then move to A practical guide to C++ serialization.
I recommend serialization because I realized you are just starting with C++. And others options like data bases and formated files(xml, Yaml, etc...) require more complex code.
Have fun!!! After you read all this stuff and (try to put it in practice), if you still can't solve your problem, come back here, and we will happy to help you.