#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
обрабатывается как константа времени компиляции, и параметры функции не имеют такой формы. Однако я еще не нашел подтверждения в спецификации. В любом случае, его код действителен. Вы также можете заметить, что пока вы единственный, кто упоминает ошибки компилятора, все остальные описывают ошибки времени выполнения.