Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
#1

Программа телефонный номер - C++

04.09.2009, 20:01. Просмотров 1750. Ответов 24
Метки нет (Все метки)

Тут столкнулся с проблемой. Программа не выводит телефонный номер, при вводе русских символов, реагирует только на английский ввод.
Не знаю, вроде всё должно работать.Вот исходник:

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
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
    setlocale(0,"");
    int i;
    char str[80];
    char numbers[10][80] = {
    "Том","555-332",
    "Мария","555-8976",
    "Джон","555-1037",
    "Раиса","555-1400",
    "Golovastik","222-5050"
    };
    cout<<"Введите имя:  ";
    cin>>str;
    for(i = 0; i < 10; i+=2)
    if(!strcmp(str,numbers[i]))
    {
        cout<<"Телефонный номер: "<<numbers[i+1]<<'\n';
        break;
    }
    if(i==10) cout<<"Отсутствует в каталоге. \n";
    cin.ignore();
    cin.get();
}

http://www.cyberforum.ru/cpp-beginners/thread1132684.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2009, 20:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа телефонный номер (C++):

Посмотрите код! (используя функцию strtok, разбить телефонный номер формата (555) 555-5555, введенный как строку, на лексемы)
Посмотрите код все правильно ли??? Задание звучит так, используя функцию...

Реализовать связь классов "телефонная книга" и родительский класс "телефонный номер"
Суть проблемы:есть дочерний класс &quot;телефонная книга&quot; и родительский класс...

Программа, запрашивающую номер месяца (1-12)
Создайте программу, запрашивающую номер месяца (1-12) и выводящую на экран...

Программа находит макс. номер в файле...
Написал программу с классами fstream, которая в определенном файле находит мин....

первая программа попытка номер три)
здравствуйте! начал читать книгу по c++ там предлагается написать программу для...

24
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
04.09.2009, 20:26 #2
Цитата Сообщение от Golovastik Посмотреть сообщение
Программа не выводит телефонный номер, при вводе русских символов, реагирует только на английский ввод.
Дело в том, что латинница корректно работает потому, что код символов на вводе и на выводе совпадает, а вот с кириллицей такого нет, код символа при вводе не совпадает с кодом того же символа при выводе. Поэтому так и получается
Вот для лучшего понимания посмотри эту
программку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
int main()
{
    setlocale(0,"");
    char a[] = "привет", b[7];
    char c[] = "privet", d[7];
    std::cout<<"Введи слово \"privet\":\n";
    std::cin>>d;
    std::cout<<"Введи слово \"привет\":\n";
    std::cin>>b;
    system("cls");
    std::cout<<"Начальное слово \"привет\":\n"<<a<<"\nВведенное слово \"привет\":\n"<<b<<'\n';
    std::cout<<"Символ\tВывод\tВвод\n";
    for(int i = 0; i < 6; ++i)
        std::cout<<a[i]<<'\t'<<(int)a[i]<<'\t'<<(int)b[i]<<'\n';
    std::cout<<"\nНачальное слово \"privet\":\n"<<c<<"\nВведенное слово \"privet\":\n"<<d<<'\n';
    std::cout<<"Символ\tВывод\tВвод\n";
    for(int i = 0; i < 6; ++i)
        std::cout<<c[i]<<'\t'<<(int)c[i]<<'\t'<<(int)d[i]<<'\n';
    system("pause");
    return 0;
}
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 20:36  [ТС] #3
Как тогда изменить данную программу,чтоб можно было вводить русские символы и получать результат - телефон?
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
04.09.2009, 20:47 #4
Golovastik, ну где-то
так
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
#include <iostream>
#include<windows.h>
 
char bufRus[256];
 
char* Rus(const char* text)
{
    CharToOemA(text, bufRus);
    return bufRus;
}
using namespace std;
 
int main()
{
    setlocale(0,"");
    int i;
    char str[80];
    char numbers[10][80] = {
        "Том","555-332",
        "Мария","555-8976",
        "Джон","555-1037",
        "Раиса","555-1400",
        "Golovastik","222-5050"
    };
    cout<<"Введите имя:  ";
    cin>>str;
    for(i = 0; i < 10; i+=2)
        if(!strcmp(str,Rus(numbers[i])))
        {
            cout<<"Телефонный номер: "<<numbers[i+1]<<'\n';
            break;
        }
        if(i==10) cout<<"Отсутствует в каталоге. \n";
        cin.ignore();
        cin.get();
}
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 20:58  [ТС] #5
Странно,работает по вашей идее. Вы не дадите, если не трудно комент по вот этому. Рашифруйте что здесь происходит, если не трудно.

C++
1
2
3
4
5
char* Rus(const char* text)
{
        CharToOemA(text, bufRus);
        return bufRus;
}
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
04.09.2009, 21:20 #6
Преобразует входную строку в ASCII кодировке. Грубо говоря копирует text в bufRus с изменением кодов символов
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 21:35  [ТС] #7
Можно ли использовать setlocale с указателем вместо CharToOem?

Расшифруйте пожалуйста подробней,вот это,что на что указывает:
C++
1
char* Rus(const char* text)
0
Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
04.09.2009, 21:44 #8
Rus - это функция которая возвращает указатель на char, входящим параметром является переменная типа char *(указатель).
В теле функции используется фукция CharToOemA из windows.h которая копирует содержимое строки text в массив bufRus[256], при этом перекодирует в ASCII.
После чего возвращает указатель на первый елемент bufRus.
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 22:03  [ТС] #9
Rus - это функция с именем Rus которая указывает на то,что возвращает функция?
C++
1
char *Rus
0
AnonymC
1178 / 461 / 86
Регистрация: 23.06.2009
Сообщений: 6,363
Завершенные тесты: 1
04.09.2009, 22:21 #10
Golovastik, прочитай тему,русские шрифты в конслои....
так попробуй,этот никогда не подвел
Код
// установить вручную шрифт Lucida Console в свойствах окна консоли 
// и запомнить это для всех окон с этим именем
// записать в начале программы строку 
 #include <windows.h>
// записать в начале функции main ( после строки с символом { ) 
// две следующих строки 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 23:47  [ТС] #11
Вроде с этим разобрался,последний вопрос. Какую роль играет выражение i = 10 из строки:
C++
1
 if(i==10) cout<<"Отсутствует в каталоге. \n";
Почему,если поставить i<10 или i>10 не будет выдавать фразу:
Отсутствует в каталоге.
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
04.09.2009, 23:58 #12
Golovastik, ты не прав.
Поставь условие i<10 и ты увидеш эту фразу в любом случае.
Поставь i>10 и ты не увидиш ее никогда, потому как i никогда не будет больше 10
Поставил i==10 потому, что когда цикл заканчивается и при этом не находится совпадений, то у i значение будет 10. Если совпадения есть, то значение будет меньше 10
0
AnonymC
05.09.2009, 13:47
  #13

Не по теме:

Golovastik, а за что ты меня за все сообщения сказал Спасибо?Приятно конечно спасибо,но что я такого сдела?

0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 15:52  [ТС] #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
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <windows.h>
#include <string>
 
using namespace std;
char maska[256];
 
char*aladin(const char *balada)
{
    CharToOem(balada,maska);
    return maska;
}
 
 
int main()
{
 
setlocale(0,"");
    string t;
int i;
char vvod[15];  
char a[10][20] = {
    "Казбек","888-99",
    "Павел","111-222",
    "Колобок","5-97-35",
    "Папа","978-255",
    "Суслик","239-655"
};
 
do{
 
cout<<"Введите имя, для поиска номера телефона -> ";
cin>>vvod;
for(i = 0; i < 10; i+=2)
{
    
    if(!strcmp(vvod,aladin(a[i])))
        cout<<"Телефонный номер "<<a[i]<<" = "<<a[i+1]<<endl;
    break;
}
 
if(i == 15) cout<<"\nОтсутсвует в каталоге. "; 
 
cout<<"Продолжить запрос? Если да, введите слово 'fanta' \n\t-> ";
cin>>t;
 
} while(t == "fanta");
cin.ignore();
cin.get();
}
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
05.09.2009, 16:14 #15
Golovastik, вот почему
C++
1
2
3
4
5
if(!strcmp(vvod,aladin(a[i])))
{
        cout<<"Телефонный номер "<<a[i]<<" = "<<a[i+1]<<endl;
        break;
}
брейк отрабатывал сразу после первой итерации, а надо чтобы отрабатывал только при совпадении. Поэтому ты просто забыл поставить скобки
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:21  [ТС] #16
Вроде всё работает, последний момент. Почему,если поставить условие
Код
 while(t == "сила");
программа перестанет продолжать работать?
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
05.09.2009, 16:25 #17
Цитата Сообщение от Golovastik Посмотреть сообщение
программа перестанет продолжать работать?
Наверно имеет смысл написать так
C++
1
while(t == aladin("сила"));
Ведь заметь, то что написано в коде кириллицей корректно сравнивается с введенным текстом только после преобразования с помощью CharToOemA. Это стоит в будущем учитывать
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:36  [ТС] #18
Странно, не думал,что нужно передавать в функцию слово сила. Ещё один вопросик и всё.
Скажите, можно ли использовать setlocale() вместо CharTOOem?
Что именно даёт:
C++
1
if(i == 10]) cout<<"\nОтсутсвует в каталоге. ";
Вроде написал, но понять не могу эту строку. Можно ли использовать cin.fail(), слышал вроде есть такая функция. Дайте расшифровку,если не затруднит,ещё раз понятнее по строке выше if(i == 10]. Благодарю заранее.
0
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
05.09.2009, 17:41 #19
по поводу cin.fail() cin
setlocale("сила") так что ли? Тогда нет. Или как, уточни вопрос?
if(i == 10]) во первых квадратной скобки там быть не может, во вторых i будет равно 10 тогда и только тогда, когда пройден весь массив и не найдено ни одного совпадения(если оно будет найдено, то цикл прервется и i не будет дальше увеличиватся и, следовательно, будет i < 10)
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 17:59  [ТС] #20
По поводу i = 10, понятно,тоесть когда пройден весь массив и не найдено ни одного совпадения,тогда i не будет увеличиваться, следовательно и выдаст сообщение, с этим уяснил.
По поводу cin.fail,у вас не работает ссылка, я так и не смог прочитать. Теперь по поводу setlocale
Я имею ввиду,если описать как-то функцию(всю), с использованием её, возможно ли это?
Тоесть можно ли с помощью её переделать вот это:
C++
1
2
3
4
5
char*aladin(const char *balada)
{
        CharToOem(balada,maska);
        return maska;
}
Последний вопрос.
Почему,если изменить строку:
Код
char *aladin(const char *balada)
на строку
Код
char aladin(const char *balada)
Программа перестанет работать?
Выдаст ошибку:
cannot convert from 'char [256]' to char
0
05.09.2009, 17:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2009, 17:59
Привет! Вот еще темы с решениями:

Программа вычисляющая номер позиции первого символа 0
Доброго времени суток Требуется написать такую программу: Используя тип...

Программа, показывающая номер человека в очереди по его фамилии
Помогите, пожалуйста! Нужно написать программу, показывающую номер человека...

ввести номер машины и программа должна удалить строку
создаёт файл и мы записываем туда структуру, но мне надо потом ввести номер...

Определить номер наименьшего числа последовательности (программа работает но не правильно)
Дана последовательность из целых чисел, за которой следует 0. Определите номер...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru