Форум программистов, компьютерный форум CyberForum.ru

не выполняется switch - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
01.12.2011, 08:14     не выполняется switch #1
первый вложенный цикл выполняется корректно, но второй - после выбора вылетает из программы, т.е. ввожу константу и все - блок {} не выполняется, почему?????

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
int main(int argc, char* argv[])
{
    setlocale( LC_ALL,"Russian" );
  Notebook note;
  int ch1,ch2,ch3; 
  start:   // Вывод меню 
  system("cls"); 
  cout << "\n\nВведите нужный номер пункта меню.";
  cout << "\n1. Создать запись";
  cout << "\n2. Удалить запись";
  cout << "\n3. Просмотреть все записи";
  cout << "\n4. Изменить номер телефона";
  cout << "\n5. Поиск";
  cout << "\n6. Сортировать ";
  cout << "\n7. Завершить программу";
  cout << "\n\nВведите номер: ";
  cin >> ch1;
  cout << "\n\n";
  switch(ch1)
  {
    case 1: system("cls");
      note.add();
      break;
    case 2: system("cls");
      note.deleted();
      break;
    case 3: system("cls");
      note.print();
      break;
    case 4: system("cls"); 
      note.changes_number();
      break;
    case 5: system("cls");
        cout << "\n1. по имени";
        cout << "\n2. по номеру телефона";
        cout << "\n3. по дате рождения";
        cout << "\nВведите номер пункта подменю: ";
        cin >> ch2;
        switch(ch2)
        {
          case 1: system("cls");
            note.search_by_name();
            break;
          case 2: system("cls");
            note.search_by_number();
            break;
          case 3: system("cls");
            note.search_by_date();
            break; 
        }
        cout << "\n\nХотите вернуться в меню ?(y/n)";
            if(_getch() == 'y') goto start;
    case 6: system("cls");
        cout << "\n1. по имени";
        cout << "\n2. по фамилии";
        cout << "\n3. по дате рождения";
        cout << "\nВведите номер пункта подменю: ";
        cin >> ch3;
        switch(ch3)
        {
          case 1: 
            note.sort_by_name();
            break;
          case 2: 
            note.sort_by_last_name();
            break;
          case 3: 
            note.sort_by_date();
            break; 
        }
    case 7: return 0; 
      break;
    default:
      cout << "\nТакого пункта меню нет.";  
  }
  cout << "\n\nХотите вернуться в меню ?(y/n)";
  if(_getch() == 'y') goto start;
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2011, 08:14     не выполняется switch
Посмотрите здесь:

C++ switch
C++ Switch C++
Switch C++
switch C++
C++ Код не выполняется в одном месте, но выполняется в другом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2011, 13:16     не выполняется switch #21
Цитата Сообщение от irina3456 Посмотреть сообщение
если ответ не равен 'y' , то выходим из программы
не, я про внутренний вопрос, там ошибка

Цитата Сообщение от irina3456 Посмотреть сообщение
а что тогда вместо goto?
цикл всегда вместо goto
цикл всегда имеет начало и конец, тогда как goto не имеет ни того, ни другого
в нескольких циклах легко разобраться, в нескольких goto нереально разобраться

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

Цитата Сообщение от irina3456 Посмотреть сообщение
в свич даже не заходит(((
откуда ты знаешь ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
01.12.2011, 13:39  [ТС]     не выполняется switch #22
???????

Добавлено через 3 минуты
не могу просмотреть сообщения на 3ей странице
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2011, 13:42     не выполняется switch #23
чего ?
нажми обновить
почисти кеш
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
01.12.2011, 14:11  [ТС]     не выполняется switch #24
вы хотите сказать, что все дело в goto??
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2011, 14:20     не выполняется switch #25
не, непонятно, как ты узнала, что внутренний switch не срабатывает
ведь у тебя там ничего нет, никакого вывода
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
01.12.2011, 14:37  [ТС]     не выполняется switch #26
sleep(1);
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2011, 14:41     не выполняется switch #27
во внутреннем switch сделай cout << "inner" << endl;
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
01.12.2011, 23:59  [ТС]     не выполняется switch #28
даже вставляю
C++
1
2
default:
        cout << "\nТакого пункта меню нет.";
и
C++
1
cout << "inner" << endl;
и ничего, опять : Хотите вернуться в меню ?

Добавлено через 22 минуты
сделала так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(ch3)
        {
          case '1': 
            note.sort_by_name();
            break;
          case '2': 
                              note.sort_by_last_name();
                              break;
                            case '3': 
                              note.sort_by_date();
                              break; 
                           default:
                     cout << "\nТакого пункта меню нет."; 
        }
теперь в свич заходит, но на 1,2,3 - выводит Такого пункта меню нет,значит он просто не понимал те символы,кот вводятся, но почему и что слелать??

Добавлено через 3 часа 8 минут
????????

Добавлено через 1 час 7 минут
Я понятия не имею что делать, почему так происходит и как это исправить????

Добавлено через 14 минут
еще такое наблюдение
если у единицы убрать ' '
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
case 5: 
system("cls");
cout << rus(L"\n1. Сортировка по имени");
cout << rus(L"\n2. Сортировка по фамилии");
cout << rus(L"\n3. Сортировка по дате рождения");
cout << rus(L"\n\nВведите номер пункта подменю: ");
cin >> chs;
switch(chs)
{
case 1: 
note.sort_by_name();
break;
case '2': 
note.sort_by_last_name();
break;
case '3': 
note.sort_by_date();
break; 
default:
cout << rus(L"\nТакого пункта меню нет."); 
}
break;
case 6: note.changes_number();
break;
case 7: return 0; 
break;
default:
cout << rus(L"\nТакого пункта меню нет."); 
  }
  cout << rus(L"\n\nХотите вернуться в меню ?(y/n)");
  if(_getch() == 'y') goto start;
  return 0;
}
при нажатии 1 - выходит Хотите вернуться в меню ?,
при нажатии 2 или 3 - выходит Такого пункта меню нет.
Почему?????
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2011, 00:02     не выполняется switch #29
нет, вставляй в каждый case
это отладочные сообщение, которые ты уберёшь, когда отладишь программу
одинарные кавычки тебе не нужны (они нужны тогда, когда ты используешь char, а не int)

сделай везде цифры без кавычек (совет неправильный)
Цитата Сообщение от irina3456 Посмотреть сообщение
при нажатии 1 - выходит Хотите вернуться в меню ?,
при нажатии 2 или 3 - выходит Такого пункта меню нет.
это значит, что вход в switch есть
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
02.12.2011, 00:47  [ТС]     не выполняется switch #30
я убираю кавычки и при нажатии 1,2 либо 3 в "case 5" выводится " Хотите вернуться в меню ?", получется switch(chs) просто игнорируется

Добавлено через 2 минуты
а с кавычками заходит в тело, но пишет что Такого пункта меню нет.
два аналогичных case'а 4 и 5, а второй не работает(( почему?

Добавлено через 25 минут
что делать то??????????????
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2011, 01:40     не выполняется switch #31
Цитата Сообщение от irina3456
получется switch(chs) просто игнорируется
как это получается, почему ты думаешь, что он не работает ?
чтобы в догадки не играть, запиши туда вывод сообщений
если он работает, то он будет их выводить
если он не работает, то он не будет их выводить

Цитата Сообщение от irina3456 Посмотреть сообщение
что делать то
написано уже несколько раз
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
02.12.2011, 08:09  [ТС]     не выполняется switch #32
со свичем разобралась, он работает, спасибо accept.
вся проблема в выполнении функции сортировки(((

Добавлено через 35 секунд
поможете разобраться???

Добавлено через 17 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <conio.h>
#include <fstream>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
#include <windows.h>
using namespace std;
 
 
// Структура описывающая запись в Записной книжке
struct _notebook
{
  char name[100],
       last_name[100],
       date[50],
       city[50];
  unsigned long int number;
  // перегруженый опертор "меньше"
  bool operator <(const _notebook &_2) const
  {
    return strcmp(name, _2.name) < 0;
  }
};
 
// Предикат для сортировки по имени
bool cmp_1(_notebook &_1, _notebook &_2)
{
  return tolower(_1.name[0]) < tolower(_2.name[0]);
}
 
// Предикат для сортировки по фамилии
bool cmp_2(_notebook &_1, _notebook &_2)
{
  return tolower(_1.last_name[0]) < tolower(_2.last_name[0]);
}
 
// Предикат для сортировки по дате рождения
bool cmp_3(_notebook &_1, _notebook &_2)
{
  char tokens_1[3][5], tokens_2[3][5];
  char tok_1[50], tok_2[50];
  int i = 0;
  strcpy(tok_1, _1.date); strcpy(tok_2, _2.date);
  for(char *p = strtok(tok_1, "."); p;  p = strtok(NULL, "."))
    strcpy(tokens_1[i++], p);
  i = 0;
  for(char *_p = strtok(tok_2, "."); _p;  _p = strtok(NULL, "."))
    strcpy(tokens_2[i++], _p);
  if(atoi(tokens_1[2]) != atoi(tokens_2[2]))
    return atoi(tokens_1[2]) < atoi(tokens_2[2]);
  else if(atoi(tokens_1[1]) != atoi(tokens_2[1]))
    return atoi(tokens_1[1]) < atoi(tokens_2[1]);
  return atoi(tokens_1[0]) < atoi(tokens_2[0]);
}
 
// Основной класс
class Notebook
{
private:
  _notebook data;
  void print_node(_notebook &n)
  {
    cout << "\nIm`9 - " << n.name << "\nFamiliya - " << n.last_name <<
    "\nData rowdenia - " << n.date << "\nNomer telefona - " << n.number <<
    "\nGorod - " << n.city;
  }
public:
  // Метод сортировки записей за именем
  void sort_by_name()
  {
    ifstream ifs("base", ios::in | ios::binary);
    vector<_notebook> vec;
    while(ifs.read((char *)&data, sizeof(_notebook)))
      vec.push_back(data);
    sort(vec.begin(), vec.end(), cmp_1);
    ifs.close();
    ofstream ofs("base", ios::out | ios::binary);
    for(int i = 0; i < vec.size(); ++i)
      ofs.write((char *)&vec[i], sizeof(_notebook));
  }
  // Метод сортировки записей за фамимлией
  void sort_by_last_name()
  {
    ifstream ifs("base", ios::in | ios::binary);
    vector<_notebook> vec;
    while(ifs.read((char *)&data, sizeof(_notebook)))
      vec.push_back(data);
    sort(vec.begin(), vec.end(), cmp_2);
    ifs.close();
    ofstream ofs("base", ios::out | ios::binary);
    for(int i = 0; i < vec.size(); ++i)
      ofs.write((char *)&vec[i], sizeof(_notebook));
  }
  // Метод сортировки записей за датой рождения
  void sort_by_date()
  {
    ifstream ifs("base", ios::in | ios::binary);
    vector<_notebook> vec;
    while(ifs.read((char *)&data, sizeof(_notebook)))
      vec.push_back(data);
    sort(vec.begin(), vec.end(), cmp_3);
    ifs.close();
    ofstream ofs("base", ios::out | ios::binary);
    for(int i = 0; i < vec.size(); ++i)
      ofs.write((char *)&vec[i], sizeof(_notebook));
  }
вот часть программы, проверяю Cout'ом,вставляю в функцию void sort_by_name()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void sort_by_name()
  {
    ifstream ifs("base", ios::in | ios::binary);
    vector<_notebook> vec;
    while(ifs.read((char *)&data, sizeof(_notebook)))
      vec.push_back(data);
    sort(vec.begin(), vec.end(), cmp_1);
    ifs.close();
    ofstream ofs("base", ios::out | ios::binary);
    for(int i = 0; i < vec.size(); ++i)
        cout << "SORTIR" << endl;   
       /* именно здесь ошибка, i - необъявленная переменная, а когда объявляю, то программа вынужденно завершается*/
      ofs.write((char *)&vec[i], sizeof(_notebook));
  }
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2011, 08:34     не выполняется switch #33
C++
1
2
3
4
5
6
    for(int i = 0; i < vec.size(); ++i) {
        cout << "SORTIR" << endl;   
        /* именно здесь ошибка, i - необъявленная переменная,
           а когда объявляю, то программа вынужденно завершается */
        ofs.write((char *)&vec[i], sizeof(_notebook));
    }
файлы нужно проверять на открытие, чтобы не получилось так, что у неоткрывшегося потока вызывается метод
функцию сортировки можно одну сделать и три обёртки, вызывающие общую функцию сортировки, передавая в неё свою функцию сравнения
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
02.12.2011, 16:05  [ТС]     не выполняется switch #34
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void sort_by_name()
{
  ifstream ifs("base", ios::in | ios::binary);
  cout << "SORTIR" << endl;  
  if (!ifs) 
  {  
    cout << "Файл не открыт.\n";
    return;
   } 
  cout << "SORTIR" << endl;  
  vector<_notebook> vec;
  while(ifs.read((char *)&data, sizeof(_notebook)))
  vec.push_back(data);
  sort(vec.begin(), vec.end(), cmp_1);
  ifs.close();
  ofstream ofs("base", ios::out | ios::binary);
     for(int i = 0; i < vec.size(); ++i)
     ofs.write((char *)&vec[i], sizeof(_notebook));
}
файл на открытие проверила, и так каждый раз при открытии файла для ввода?

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
функцию сортировки можно одну сделать и три обёртки, вызывающие общую функцию сортировки, передавая в неё свою функцию сравнения
т.е. можно сделать так
C++
1
2
3
sort(vec.begin(), vec.end(), cmp_1);
sort(vec.begin(), vec.end(), cmp_2);
sort(vec.begin(), vec.end(), cmp_3);
Добавлено через 6 минут
кстати, на строку
C++
1
for(int i = 0; i < vec.size(); ++i)
VS ругается так "1>: warning C4018: <: несоответствие типов со знаком и без знака"

Добавлено через 51 минуту
с warning C4018 разобралась,
Это – предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).
а с сортировкой нет((

Добавлено через 52 минуты
?????????????

Добавлено через 5 часов 3 минуты
я разобралась, спасибо всем большое
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2011, 16:28     не выполняется switch #35
Цитата Сообщение от irina3456 Посмотреть сообщение
файл на открытие проверила, и так каждый раз при открытии файла для ввода?
всегда нужно проверять, нельзя допускать, чтобы неоткрывшийся файл как-либо использовался
можно ещё исключение выбрасывать

Цитата Сообщение от irina3456 Посмотреть сообщение
т.е. можно сделать так
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void sort_by_name()
{
    sort_records(cmp_1);
}
 
void sort_by_lastname()
{
    sort_records(cmp_2);
}
 
void sort_by_date()
{
    sort_records(cmp_3);
}
 
void sort_records(bool (*cmp)(_notebook &, _notebook &))
{
    ifstream ifs;
    ofstream ofs;
    vector <_notebook> vec;
 
    ifs.open("base", ios::binary);
    if (ifs) {
        while(ifs.read((char *) &data, sizeof(_notebook)))
            vec.push_back(data);
        sort(vec.begin(), vec.end(), cmp);
        ifs.close();
        ofs.open("base", ios::binary);
        if (ofs) {
            for(size_t i = 0; i < vec.size(); ++i)
                ofs.write((char *) &vec[i], sizeof(_notebook));
            ofs.close();
        }
    }
}


Цитата Сообщение от irina3456 Посмотреть сообщение
VS ругается так "1>: warning C4018: <: несоответствие типов со знаком и без знака"
size_t можно применить (в примере есть)
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
02.12.2011, 17:19  [ТС]     не выполняется switch #36
а как же
Настоящий тип size_t платформо-независим; распространенной ошибкой является подразумевать под size_t беззнаковое целое (unsigned int), что может привести к ошибкам программирования,[3] причём в первую очередь это касается 64-битных архитектур.
это никак не повлияет на работу программы?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2011, 17:28     не выполняется switch #37
он беззнаковый, имеется в виду, что он может быть равен unsigned int, unisigned long или unsigned long long
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2011, 17:42     не выполняется switch
Еще ссылки по теме:

C++ switch
Switch C++
C++ Switch case внутри switch case

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
02.12.2011, 17:42  [ТС]     не выполняется switch #38
ясно)
Yandex
Объявления
02.12.2011, 17:42     не выполняется switch
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru