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

Программа перевода регистра символов - C++

Восстановить пароль Регистрация
 
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
28.08.2013, 19:39     Программа перевода регистра символов #1
Задача: Написать программу с использованием предирективы cctype, которая читает клавиатурный ввод до символа @ и
повторяет его, за исключением десятичных цифр, преобразуя каждую букву верхнего регистра в букву нижнего регистра и наоборот.

При отладке выходит ошибка (см. ниже). Нашел на этом форуме подобное решение этой задачи, думал у меня неправильный код, все равно та же ошибка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    char ch;
    cout << "Вводите текст: ";
    while (cin.get(ch) && ch != '@')
    {
        if (isdigit(ch) != 0)
            continue;
        else if (islower(ch) != 0)
        {
            ch = toupper(ch);
        }
        else if (isupper(ch) != 0)
        {
            ch = tolower(ch);
        }
    }
    cout << ch;
    system("pause");
}
Миниатюры
Программа перевода регистра символов  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 19:39     Программа перевода регистра символов
Посмотрите здесь:

C++ Программа перевода числа из 10 СС в 2 СС
C++ Программа для распознавания регистра
C++ Си, программа перевода в другие СС
C++ Программа перевода чисел из СС
Программа перевода чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
28.08.2013, 19:59     Программа перевода регистра символов #2
Скорей всего ты используешь русскую раскладку в программе. Хочу дать совет, пока изучаешь C++ по книжке, постарайся смерится с кодировкой и использовать только английскую раскладку. Ты можешь конечно искать костели, как это все обойти, но это совершенно отдельная тема, которой ты спокойно можешь заняться, изучив теорию C++.
Я пока смерился с проблемой кодировок, потому, что она только отвлекает от процесса изучения основ.

В будущем, сам напишешь модуль для новичков, что бы у них не возникало таких проблем =)
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
28.08.2013, 20:08     Программа перевода регистра символов #3
попробуйте перевести сообщение на скриншоте, или вы понимаете что пишет вам компилятор?

PS если прога компилируется на gcc то это проблема Visual C++(он слишком муторный для начинающих)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 20:16     Программа перевода регистра символов #4
C++
1
else if (isupper(unsigned char(ch))!= 0)
И в других функциях cctype также сделать.
Arwing
Сообщений: n/a
28.08.2013, 20:17     Программа перевода регистра символов #5
Скиньте код целиком: от подключения библиотек до конца
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 20:26     Программа перевода регистра символов #6
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
все равно та же ошибка.
Это из-за знакового char и кодов символов больше 127 (например, коды русских символов).
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
28.08.2013, 20:36  [ТС]     Программа перевода регистра символов #7
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
[QUOTE=Arwing;4996082]Скиньте код целиком: от подключения библиотек до конца[/QUOTE]
 
#include <iostream>
#include <Windows.h>
#include <string>
#include <cctype>
 
using namespace std;
 
#define rus SetConsoleCP(1251);SetConsoleOutputCP(1251);
 
 
int main()
{
    char ch;
    cout << "Вводите текст: ";
    while (cin.get(ch) && ch != '@')
    {
        if (isdigit(ch) != 0)
            continue;
        else if (islower(ch) != 0)
        {
            ch = toupper(ch);
              cout << ch;
        }
        else if (isupper(ch) != 0)
        {
            ch = tolower(ch);
              cout << ch;
        }
    }
 
    system("pause");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 20:42     Программа перевода регистра символов #8
CHELOVEKPAUK, исправления где?
CHELOVEKPAUK
 Аватар для CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
28.08.2013, 20:51  [ТС]     Программа перевода регистра символов #9
Цитата Сообщение от alsav22 Посмотреть сообщение
CHELOVEKPAUK, исправления где?
функция cin.get перестает работать - "отсутствуют экземпляры, перегруженная функция"; ошибка с2664, с1903

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    char ch;
    while (cin.get(unsigned char(ch)) && unsigned char(ch) != '#')
    {
        if (isupper(unsigned char(ch)) != 0)
        {
            tolower(unsigned char(ch));
            cout << unsigned char(ch);
        }
        if (islower(unsigned char(ch)) != 0)
        {
            toupper(unsigned char(ch));
            cout << unsigned char(ch);
        }
        if (isdigit(unsigned char(ch)) != 0)
            continue;
    }
    system("pause");
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
28.08.2013, 20:52     Программа перевода регистра символов #10
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
else if (isupper(unsigned char(ch))!= 0)
И в других функциях cctype также сделать.
Это конечно избавит от ошибки, но не будет по прежнему выводить правильно русские символы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 21:09     Программа перевода регистра символов #11
Цитата Сообщение от Hugra Посмотреть сообщение
Это конечно избавит от ошибки, но не будет по прежнему выводить правильно русские символы.
Правильный вывод русских символов - другая тема (таких на форуме "море", поиск в помощь). Я ответ дал по конкретной ошибке (скрин в 1 посте).

Добавлено через 4 минуты
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
функция cin.get перестает работать - "отсутствуют экземпляры, перегруженная функция"; ошибка с2664, с1903
Цитата Сообщение от alsav22 Посмотреть сообщение
И в других функциях cctype также сделать.
Зачем везде сделали?

Добавлено через 3 минуты
Вот в этих функциях: isdigit(), islower(), isupper(), toupper(), tolower().

Добавлено через 1 минуту
И вот такое:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
 
int main()
{
  setlocale(0, "")
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
 
 В свойствах консоли выбрать шрифт: Lucida Console
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
28.08.2013, 21:15     Программа перевода регистра символов #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Правильный вывод русских символов - другая тема (таких на форуме "море", поиск в помощь). Я ответ дал по конкретной ошибке (скрин в 1 посте).
Я не правильно выразил свою мысль. Я о том, что tolower(), toupper() не будут работать с русскими символами вообще.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 21:19     Программа перевода регистра символов #13
Цитата Сообщение от Hugra Посмотреть сообщение
Я не правильно выразил свою мысль. Я о том, что tolower(), toupper() не будут работать с русскими символами вообще.
Никогда не будут? Или без настройки не будут?
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
#include <iostream>
#include <Windows.h>
#include <string>
#include <cctype>
 
using namespace std;
 
int main()
{
    setlocale(0, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char ch;
    cout << "Вводите текст: ";
    while (cin.get(ch) && ch != '@')
    {
        if (isdigit(unsigned char(ch)) != 0)
            continue;
        else if (islower(unsigned char(ch)) != 0)
        {
            ch = toupper(unsigned char(ch));
              cout << ch;
        }
        else if (isupper(unsigned char(ch)) != 0)
        {
            ch = tolower(unsigned char(ch));
              cout << ch;
        }
    }
 
    system("pause");
}
Миниатюры
Программа перевода регистра символов  
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
28.08.2013, 22:01     Программа перевода регистра символов #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
34
35
36
37
#include <iostream>
#include <Windows.h>
#include <string>
#include <cctype>
#include <conio.h>
#include <locale.h> 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    SetConsoleCP(866);
    char ch;
    cout << "Вводите текст: "<<endl;
 
    while (ch=_getch())
    {
        SetConsoleCP(866);
        if (isdigit(ch) != 0)
            continue;
        else if (islower(ch) != 0)
        {
            ch = toupper(ch);
              cout<<(ch);
        }
        else if (isupper(ch) != 0)
        {
            ch = tolower(ch);
              cout << ch;
        }
        if (ch=='@') break;
        
        SetConsoleCP(1251);
    }
 
    system("pause");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 22:06     Программа перевода регистра символов #15
Цитата Сообщение от akk Посмотреть сообщение
Вот мой вариант, он обрабатывает русские символы.
При начале ввода, выбрасывает ошибку из первого поста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 22:47     Программа перевода регистра символов
Еще ссылки по теме:

C++ Программа перевода
Инвертирование регистра символов C++
C++ Программа перевода из 10-ой с/с в n-ую и обратно

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

Или воспользуйтесь поиском по форуму:
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
28.08.2013, 22:47     Программа перевода регистра символов #16
Цитата Сообщение от alsav22 Посмотреть сообщение
При начале ввода, выбрасывает ошибку из первого поста.
В GCC работает нормально.
В MSVS проблема в том, что на русской раскладке getch возвращает отрицательное значение.
Вот код, который работает в MSVS
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
// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <cctype>
#include <conio.h>
#include <locale.h> 
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    SetConsoleCP(866);
 
    unsigned char ch;
    cout << "Вводите текст: "<<endl;
    SetConsoleCP(1251);
    while (ch=_getch())
    {
        SetConsoleCP(866);
        if (isdigit(ch) != 0)
            continue;
        else if (islower(ch) != 0)
        {
            ch = toupper(ch);
              cout<<(ch);
        }
        else if (isupper(ch) != 0) 
        {
            ch = tolower(ch);
              cout << ch;
        }
        if (ch=='@') break;
        
        SetConsoleCP(1251);
    }
 
    system("pause");
}
Yandex
Объявления
28.08.2013, 22:47     Программа перевода регистра символов
Ответ Создать тему
Опции темы

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