нет выходного результата при поиске в массиве или отображении массива

#c #visual-c -2010

#c #visual-c -2010

Вопрос:

Я создаю список, который позволяет мне вводить данные, а затем выполнять поиск или отображать введенные данные. По какой-то причине я не могу создать вывод. Проблема может заключаться в функции вывода. Как я могу это исправить? Вот код:

 #include<iostream>
#include<string>
#include<cstdlib>
#include <stdio.h>
#include <string.h>

using namespace std;

class contact{
private:
  string fn;
  string ln;
  string email;
  string number;
public:
  // Accessor and Mutator method for contacts variable
  void setfname(string f_n);
  string getfname();
  void setlname(string l_n);
  string getlname();
  void setemail(string emaila);
  string getemail();
  void setnumber(string num);
  string getnumber();
  // takes input entered for contacts
  void input();
  // display output
  void output();
  contact();

  contact(string f_n, string l_n, string emaila,string num);
};

void menu();
void EnterContact(contact contacts[], int size, intamp; numberUsed);
void show(contact contacts[], int sizeOfa);
int search_contacts(contact contacts[], stringamp; lastname, intamp; size);

int main(){
  string opt="";
  const int MAX=2;
  int size;
  contact contacts[MAX];
  contact c[MAX];
  for(int i=0; i<MAX; i  ){
    EnterContact(contacts, MAX, size);
  }
  menu();

  return 0;
}

//use these variables globally
const int MAX = 2;
contact contacts[MAX];

void EnterContact(contact contacts[], int size, intamp; numberUsed)
{
  char ans;
  bool done = false;
  int index = 0;
  cout << "Enter up to " << size << endl;
  while ((!done) amp;amp; (index < size))
  {
    contacts[index].input();
    cout << "Do you want to add another contact?(y/n followed by Return): ";
    cin >> ans;
    if ((ans == 'y') amp;amp; (ans == 'Y'))
      index  ;
    else
      done = true;
  }
  numberUsed = index 1;
}

int search_contacts(contact contacts[], stringamp; lastname, intamp; size)
{
  int index = 0;
  bool found = false;
  for(int index=0; index<size ; index  ){
    if (lastname == contacts[index].getlname()){
      found = true;
      cout<<"found";
      break;
    }
  }

  if (!found)
    cout<<"no";
  return index;
}
void show(contact contacts[], int sizeOfa)
{
  for (int index = 0; index < sizeOfa; index  )
    contacts[index].output();
}

void menu()
{
  cout<<"nContact Menu"<<endl;
  cout << "1. Add a New Contact. " << endl;
  cout << "2. Search for a Contact. " << endl;
  cout << "3. Delete Contact from list. " << endl;
  cout << "4. View All Contacts. " << endl;
  cout << "5. Exit the program. " << endl;
  cout << "Enter your choice: ";
  int opt; int result, a; char ans; string lastname;
  cin>>opt;
  switch (opt)
  {
  case 1: cout<<"func to Add a New Contact"<<endl;
    cout<<"nAdd another contact";
    break;
  case 2:
    do
    {
      cout << "nSearch contact by lastname: ";
      cin >> lastname;
      result = search_contacts(contacts, lastname, result);
      if (result == -1)
        cout << lastname << " Contact not found.n";
      else
        contacts[result].output();

      cout << lastname << " is stored in array position "<< result << endl;
      cout << "Search again? (y/n): ";
      cin >> ans;
    } while ((ans != 'n') amp;amp; (ans != 'N'));
    menu();
    break;
  case 3: cout<<"func to Delete Contact from list";
    break;
  case 4: cout<<"nAll Contacts"<<endl;
    show(contacts, MAX);
    cout<<endl;
    menu();
    break;
  case 5: cout<<"nContact Book is closed"<<endl;
    exit(1);
    break;
  default: cout<<"nInvalid entry...Closing Contact Book"<<endl;
  }
}
contact::contact()
{
  fn=""; ln=""; email=""; number="";
}
contact::contact(string f_n, string l_n, string emaila,string num)
{
  fn= f_n; ln= l_n; email= emaila;number= num;
}
void contact::input()
{
  cout<<"nFirst Name: ";
  cin>>fn;
  cout<<"Last Name: ";
  cin>>ln;
  cout<<"Email: ";
  cin>>email;
  cout<<"Phone number: ";
  cin>>number;
}

void contact::output()
{
  cout<<"nName: "<<fn<<" "<<ln;
  cout<<"nEmail: "<<email;
  cout<<"nPhone number: "<<number;
  cout<<endl;
}
void contact::setfname(string f_n)
{
  fn= f_n;
}
string contact::getfname();
{
  return fn;
}
void contact::setlname(string l_n)
{
  ln= l_n;
}
string contact::getlname()
{
  return ln;
}
void contact::setemail(string emaila)
{
  email= emaila;
}
string contact::getemail()
{
  return email;
}
void contact::setnumber(string num)
{
  number= num;
}
string contact::getnumber()
{
  return number;
}
  

Ответ №1:

ваша проблема в том, как вы используете свою функцию меню, попробуйте использовать меню выбора в своей основной функции вместо объявления его как функции. если вы хотите использовать его как функцию, рассмотрите возможность использования оператора if else. это должно позаботиться о вашем вводе и выводе.

 int main(){
  string opt="";
  const int MAX=2;
  int size;
  contact contacts[MAX];
contact c[MAX];
for(int i=0; i<MAX; i  ){
  EnterContact(contacts, MAX, size);
}
cout<<"nContact Menu"<<endl;
cout << "1. Add a New Contact. " << endl;
cout << "2. Search for a Contact. " << endl;
cout << "3. Delete Contact from list. " << endl;
cout << "4. View All Contacts. " << endl;
cout << "5. Exit the program. " << endl;
cout << "Enter your choice: ";
int opt; int result, a; char ans; string lastname;
cin>>opt;
switch (opt)
{
case 1: cout<<"func to Add a New Contact"<<endl;
  cout<<"nAdd another contact";
  break;
case 2:
  do
  {
    cout << "nSearch contact by lastname: ";
    cin >> lastname;
    result = search_contacts(contacts, lastname, result);
   if (result == -1)
     cout << lastname << " Contact not found.n";
   else
     contacts[result].output();

   cout << lastname << " is stored in array position "<< result << endl;
   cout << "Search again? (y/n): ";
   cin >> ans;
 } while ((ans != 'n') amp;amp; (ans != 'N'));
 menu();
 break;
case 3: cout<<"func to Delete Contact from list";
 break;
case 4: cout<<"nAll Contacts"<<endl;
 show(contacts, MAX);
cout<<endl;
menu();
break;
case 5: cout<<"nContact Book is closed"<<endl;
exit(1);
break;
default: cout<<"nInvalid entry...Closing Contact Book"<<endl;
}
return 0;
  

}

кроме того, у вас уже есть функция, которая обрабатывает ваш ввод, вам не нужно помещать его в цикл for в основной функции.

Комментарии:

1. спасибо, это действительно сработало, извините за поздний ответ, я был почти готов сдаться..

Ответ №2:

В вашей программе несколько ошибок. Тот, который мешает вам отображать список контактов, заключается в следующем:

У вас есть две переменные с именами contacts . Во-первых, у вас есть локальная переменная в main() , объявленная таким образом:

   contact contacts[MAX];
  

Далее, у вас есть глобальная переменная, объявленная сразу после main() таким образом:

 contact contacts[MAX];
  

Эти две переменные различны — они никак не связаны, за исключением совпадения по имени. EnterContact выполняет запись в один из массивов, но show отображает значения из другого.

Вероятно, вам следует переместить все ваши глобальные объявления в перед любым вашим кодом и удалить объявления с аналогичными именами из main() .

Комментарии:

1. я думаю, вы пропустили чтение вопроса. пользователь спрашивает о выводе, который не отображается. не так, как он обрабатывает свою переменную. ваш ответ не имеет отношения к вопросу

2. Вывод не отображается, потому что он неправильно обрабатывает свою переменную. В частности, процедура отображения вывода считывает из ::contacts , в то время как процедура ввода записывает в main::contacts . Если следовать совету, который я перечисляю в последнем абзаце, это исправляет ошибку, на которую жалуется OP. Затем необходимо исправить ошибку, найденную Махешем. (P.s. «неправильно прочитано», а не «пропустить чтение».)

3. опечатка, в любом случае, если вы присмотритесь повнимательнее, вы поймете, что его глобальное объявление о его функциях не является ссылкой на рисунок EnterContact, это ссылка на его функцию меню. единственная причина, по которой ОП сделал бы это, заключается в том, что он не планирует использовать его где-то еще ниже своего основного.

Ответ №3:

 contact contacts[MAX];  

for(int i=0; i<MAX; i  ){
    EnterContact(contacts, MAX, size);
}
  

Я думаю, вам нужно передать i функцию EnterContact, чтобы вводить входные данные для каждого объекта в массиве contacts . На данный момент вы перезаписываете один и тот же объект на каждой итерации цикла.

Комментарии:

1. На самом деле, C может это сделать. постоянный интеграл, назначенный при объявлении, рассматривается в C как константа времени компиляции.

2. VS 2010 этого не допускает. Позвольте мне проверить все предупреждения в gcc.

3. Я делаю это постоянно в MSVC108 и MSVC10, и работает на Ideone.com а также: ideone.com/elc7Q

4. У меня нет под рукой VS 2010. Если у вас есть, не могли бы вы, пожалуйста, попробовать этот код — ideone.com/Liiiu на VS2010. Я исправлю ответ, если я ошибаюсь.

5. Этот код не должен компилироваться. const int name = compile-time-constant-expression обрабатывается как константа времени компиляции, и параметры функции не имеют такой формы. Однако я еще не нашел подтверждения в спецификации. В любом случае, его код действителен. Вы также можете заметить, что пока вы единственный, кто упоминает ошибки компилятора, все остальные описывают ошибки времени выполнения.