![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Пользователь
Пол:
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
|
Всем доброго времени суток! В программировании почти не понимаю, подскажите плиз суть ишибки(С++, codeblocks v8)
||In function `int main()':| |39|error: invalid conversion from `char' to `char*'| |39|error: initializing argument 1 of `int prov(char*)'| |46|error: invalid conversion from `char' to `const char*'| |46|error: initializing argument 1 of `int atoi(const char*)'| |46|error: incompatible types in assignment of `int' to `char[20]'| ||=== Build finished: 5 errors, 0 warnings ===| Код:
#include <iostream>
#include <windows.h>
using namespace std;
struct res
{
int voz;
char pol[10];
char obr[10];
char otv[3];
};
struct Zap
{
res a;
Zap *next;
};
char* Rus(const char* text);
void DelAll(Zap **U);
void Add(Zap **U);
void print(Zap *U);
void stat(Zap **U);
int prov(char name[]);
void s1(Zap *U);
void s2(Zap *U);
void s3(Zap *U);
int main()
{
Zap *beg=0;//указатель на начало списка
char v[20];
char v1=1;
while (v1)//цикл для меню
{
cout << Rus("Возможные действия:\n");
cout << Rus("1-Добавление анкеты\n");
cout << Rus("2-Печать всех анкет\n");
cout << Rus("3-Вывод статистических данных\n");
cout << Rus("0-Выход\n");
cout << Rus("Выберите действие: ");
cin >> v1;
if(prov(v1)!=0)
{
cout << Rus("Действие не корреткно.\n");
cout << "---------------------------" << endl;
continue;
}
else
v=atoi(v1);
cout << "-------------------------------" << endl;
cin.ignore(1, 'n');
switch (v1)//меню
{
case 1:Add(&beg);break;
case 2:print(beg);break;
case 3:stat(&beg);break;
case 0:continue;break;
default: continue;
}
}
DelAll(&beg);
return 0;
}
void Add(Zap **U)
{
Zap *p=new Zap;
int ob=0;
int ot=0;
int po=0;
do
{
cout << Rus("Введите возраст респондента ");
cin >> p->a.voz;
}
while((p->a.voz<0)||(p->a.voz>99));
do
{
cout << Rus("Введите пол респондента(1-м,2-ж) ");
cin >> po;
}
while((po!=1)&&(po!=2));
if(po==1)
strcpy(p->a.pol,Rus("мужской"));
if(po==2)
strcpy(p->a.pol,Rus("женский"));
do
{
cout << Rus("Введите образование респондента(1-начальное,2-среднее или 3-высшее) ");
cin >> ob;
}
while((ob!=1)&&(ob!=2)&&(ob!=3));
if(ob==1)
strcpy(p->a.obr,Rus("начальное"));
if(ob==2)
strcpy(p->a.obr,Rus("среднее"));
if(ob==3)
strcpy(p->a.obr,Rus("высшее"));
do
{
cout << Rus("Введите ответ респондента на вопрос анкеты(1-д,2-н) ");
cin >> ot;
}
while((ot!=1)&&(ot!=2));
if(ot==1)
strcpy(p->a.otv,Rus("да"));
if(ot==2)
strcpy(p->a.otv,Rus("нет"));
if (*U==0)
{
*U=p;
p->next=0;
}
else
{
p->next=*U;
*U=p;
}
cout << Rus("Анкета внесена в список.\n");
cout << "------------------------" << endl;
}
void print(Zap *U)
{
if(U==0)
cout << Rus("Нет анкет в базе.");
else
{
Zap *p=U;
while (p)
{
cout << Rus("Возраст ") << p->a.voz << endl;
cout << Rus("Пол ") << p->a.pol << endl;
cout << Rus("Образование ") << p->a.obr << endl;
cout << Rus("Ответ на вопрос анкеты ") << p->a.otv << endl;
cout << endl;
p=p->next;
}
}
cout << "-------------------------------" << endl;
}
void stat(Zap **U)
{
int v=1;
while (v)//цикл для меню
{
cout << Rus("Возможные данные:\n");
cout << Rus("1-Сколько мужчин старше 40 лет, имеющих высшее образование, ответили Да на вопрос анкеты\n");
cout << Rus("2-Сколько женщин моложе 30 лет, имеющих среднее образование, ответили Да на вопрос анкеты\n");
cout << Rus("3-Сколько мужчин моложе 25 лет, имеющих начальное образование, ответили Да на вопрос анкеты\n");
cout << Rus("0-Выход\n");
cout << Rus("Выберите действие: ");
cin >> v;
cout << "-------------------------------" << endl;
switch (v)//меню
{
case 1:s1(*U);break;
case 2:s2(*U);break;
case 3:s3(*U);break;
case 0:continue;break;
default:continue;
}
}
}
void s1(Zap *U)
{
Zap *p=U;
int s=0;
while(p)
{
if((!strcmp(p->a.pol,Rus("мужской")))&&(p->a.voz>40)&&(!strcmp(p->a.obr,Rus("высшее")))&&(!strcmp(p->a.otv,Rus("да"))))
s++;
p=p->next;
}
cout << Rus("Кол-во мужчин старше 40 лет, имеющих высшее образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
cout << "-------------------" << endl;
}
void s2(Zap *U)
{
Zap *p=U;
int s=0;
while(p)
{
if((!strcmp(p->a.pol,Rus("женский")))&&(p->a.voz<30)&&(!strcmp(p->a.obr,Rus("среднее")))&&(!strcmp(p->a.otv,Rus("да"))))
s++;
p=p->next;
}
cout << Rus("Кол-во женщин моложе 30 лет, имеющих среднее образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
cout << "-------------------" << endl;
}
void s3(Zap *U)
{
Zap *p=U;
int s=0;
while(p)
{
if((!strcmp(p->a.pol,Rus("мужской")))&&(p->a.voz<25)&&(!strcmp(p->a.obr,Rus("начальное")))&&(!strcmp(p->a.otv,Rus("да"))))
s++;
p=p->next;
}
cout << Rus("Кол-во мужчин моложе 25 лет, имеющих начальное образование, которые ответили Да на вопрос анкеты равно ") << s << endl;
cout << "-------------------" << endl;
}
void DelAll(Zap **U)//Очищение памяти от динамических структур
{
Zap *p=*U;
Zap *t=p;
while(p)
{
p=p->next;
delete t;
t=p;
}
*U=0;
}
int prov(char name[])
{
int i=0;
int dlina;
dlina=strlen(name);
for (i=0;i<dlina;i++)
{
if(name[i]<'0'||name[i]>'9')
return 1;
}
return 0;
}
char buf[600];
char* Rus(const char* text)
{
CharToOem(text, buf);
return buf;
}
|
|
|
|
| Реклама: |
|
|
#2
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
А чего хотим, спрашивается...? Учим мат. часть. Особое внимание уделяем главам "типы данных", "указатели". Страуструп тебе в помощь ![]()
Что за функция не помню честно говоря... Но, судя по всему, грабли те же... По этим функциям.. попробуй сделать нечто подобное: Код:
if(prov(&v1)!=0) ... v=atoi(&v1) Компилироваться будет но при выполнении может начать валиться с ошибкой. Если начнёт - придётся всё переписывать... Но лучше, раз уж у тебя используется только для обработки выбора пользователя сделать так: Код:
int prov(char name)
{
if(name<'0'||name>'9')
{
return 1;
}
return 0;
}
Тут вообще всё ясно написанно.. Функция возвращает целое, а ты пытаешься массиву из 20 символов это, возвращаемое, значение присвоить... |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
| Сказали спасибо: |
|
|
#3
|
|
Пользователь
Пол:
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
|
спасибо большое, ничерта не понял честно говоря, щас книжку дочитаю по плюсам, пересмотрю все, спсибо что откликнулся!
================================================== ================================================== я тоже хочу разбираться как ты =), короче я все сделал как ты сказал, все почти заработало! ---->>> -(1)"Тут вообще всё ясно написанно.. Функция возвращает целое, а ты пытаешься массиву из 20 символов это, возвращаемое, значение присвоить..." - вот тут я не понял(пока язык можно сказать не знаю), как это переправить? -(2)"Зачем тебе обрабатывать весь мусор, который введёт пользователь? Смотри только первый символ." - это делается для того чтобы программа реагировала только на нужные символы(1,2,3,4 помоему), сама прога это типа анкетирование простое, там сначала добавляешь человека, прога спрашивает - сколько этому человеку лет? - а юзер может ввести например буквы или 999 лет, и вот программа должна игнорировать такие вот вводы некорректные(правда это все только в одном вроде месте реализовано, а в остальных местах прога зависает, цифры бегут по экрану...) Последний раз редактировалось msk; 22.12.2009 в 11:57.. |
|
|
|
|
|
#4
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Все гораздо проще.
В функции prov() и atoi() Вы передаете одиночный символ, а надо массив (символьную строку). Да, и функция atoi() возвращает переменную типа int, а не указатель на строку.
__________________
Сергей Сергеевич |
|
|
|
|
|
#5
|
|||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
Тут нужно смотреть что, по замыслу, должна вернуть функция и для чего это, опять же по замыслу, нужно... atoi, думается мне переводит ansi-символ в целое. Тут уж нужнос мотреть. На сколько я понял(не вчитывался в код глубоко), выглядеть должно так: Код:
v1=atoi(v1); Код:
v1=(char)atoi(v1); У тебя функция prov используется только когда проверяет что ввёл пользователь в ответ на приглашение выбрать действие) Пусть что хочет вводит) Если первый (он же единственный символ) будет числом то она отработает в том виде, в каком я написал) Если пользователь дальше что-то навводит то это отбросится. В любом случае сейчас реально он анализирует только один символ (погоняй в дебаггере или введи "1a" строчку в ответ на приглашение - убедишься ) |
|||||||||||||||||||||||
|
|
|
|
|
#6
|
|||||||||||||||||||
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Цитата из MSDN
Так что Вы неправы. atoi преобразует строку в целое число. А цифру в число можно преобразовать так: char v1='5'; int k=v1-'0';
__________________
Сергей Сергеевич |
|||||||||||||||||||
|
|
|
|
|
#7
|
|
Пользователь
Пол:
Регистрация: 20.10.2006
Сообщений: 42
Репутация: 2
|
пипец я попал...беда какая.. всем спаисбо большое, буду разбираться
================================================== ======== а как должна выглядеть проверка на то что ввел пользователь? например вопро такой - какого пола тестируемый? (1-м, 2-ж) - я хочу например чтобы остальные символу, будь то буквы, другие цифры кроме 1 или 2 игнорировались и заново вопрос задавался? как это реализовать в коде? заранее благодарен |
|
|
|
|
|
#8
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
Символ в целое, строку в целое... по сути это и имел ввиду) Хотя, наверное, не точно выразился) Здесь главное что становится понятно, что должна делать функция. Как её применять я, похоже, угадал...
Можно) Можно ещё многими способами Один из которых использовал автор)
Можно сделать опять же по-разному... Где пользователь может ввести как цифру так и букву (как в примере: 1/2/м/ж) я бы читал символ а потом проверял бы вручную что там ввелось. К примеру, switch'ем. Только учти, что 'М' и 'м' - разные символы. Где должен ввести что-то конкретное, к примеру число я бы делал форматированный ввод и использовал конструкцию попытка-исключение. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
| Сказали спасибо: |
|
|
#9
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Строка и символ в С понимаются по-разному.
Строка - это массив символов, в конце которого стоит число 0 (не буква ноль, а именно число 0). А Ваш кусок ввода должен быть примерно таким: Код:
int v1=1;
while (v1)//цикл для меню
{
cout << Rus("Возможные действия:\n");
cout << Rus("1-Добавление анкеты\n");
cout << Rus("2-Печать всех анкет\n");
cout << Rus("3-Вывод статистических данных\n");
cout << Rus("0-Выход\n");
cout << Rus("Выберите действие: ");
cin >> v1;
if(v1<0 || v1>3)
{
cout << Rus("Действие не корреткно.\n");
cout << "---------------------------" << endl;
continue;
}
else
{
v=v1;
.....
__________________
Сергей Сергеевич |
|
|
|
| Сказали спасибо: |
|
|
#10
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
Безусловно, в корне меняет дело.... Раз уж на то пошло, естественно, проще и надёжнее объявить интом и не мучаться. Правда не знаю, как cin отреагирует на ввод вместо целого скажем строки (да! я старообрядец который использует функции семейства scanf. Ну удобнее мне так! но сканф обижался на такие вот вводы). Что я писал про попытку-исключение - писал как раз чтобы отработать можно было подобную ситуацию в любом случае. Символ лучше использовать если есть двоякость выбора.. т.е. может ввести "1" а может "м" и тут уж никуда не денешься. Про строку... Да строка это массив символов. Но что есть указатель на "единичный символ"? Массив состоящий из одного элемента.... |
||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
#11
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
v=v1;
там было написано v=atoi(... ну я и не проверил, а действительно ли v целое ![]()
__________________
Сергей Сергеевич |
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Проблема при компиляции binutils-2.17 | neonman | Вопросы и проблемы | 8 | 23.04.2008 22:51 |
| Дистрибутив для кросс компиляции(debian vs slackware) | Xmakc | UNIX, Linux, MacOs для PC и другие ОС | 4 | 25.03.2008 12:10 |
| Ошибки компиляции Delphi 2007 Help! | Terio | Delphi | 8 | 27.02.2008 00:09 |
|
|