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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
#1

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

04.09.2009, 20:01. Просмотров 1642. Ответов 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2009, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа телефонный номер (C++):

Создать структуру, содержаую данные фамилию, имя, дату рождения и телефонный номер - C++
Создать структуру, содержаую данные фамилию, имя, дату рождения и телефонный номер. Сортировать по номерам телефона и, если вводить...

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

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

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

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

Программа находит макс. номер в файле... - C++
Написал программу с классами fstream, которая в определенном файле находит мин. номер и макс. номер. (в файле - только целочисленные...

24
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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 / 0
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 20:36  [ТС] #3
Как тогда изменить данную программу,чтоб можно было вводить русские символы и получать результат - телефон?
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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 / 0
Регистрация: 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
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
04.09.2009, 21:20 #6
Преобразует входную строку в ASCII кодировке. Грубо говоря копирует text в bufRus с изменением кодов символов
0
Golovastik
11 / 11 / 0
Регистрация: 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 / 0
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 22:03  [ТС] #9
Rus - это функция с именем Rus которая указывает на то,что возвращает функция?
C++
1
char *Rus
0
AnonymC
1162 / 444 / 23
Регистрация: 23.06.2009
Сообщений: 6,278
Завершенные тесты: 1
04.09.2009, 22:21 #10
Golovastik, прочитай тему,русские шрифты в конслои....
так попробуй,этот никогда не подвел
Код
// установить вручную шрифт Lucida Console в свойствах окна консоли 
// и запомнить это для всех окон с этим именем
// записать в начале программы строку 
 #include <windows.h>
// записать в начале функции main ( после строки с символом { ) 
// две следующих строки 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
1
Golovastik
11 / 11 / 0
Регистрация: 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
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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 / 0
Регистрация: 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
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2009, 16:14
Привет! Вот еще темы с ответами:

Программа вычисляющая номер позиции первого символа 0 - C++
Доброго времени суток Требуется написать такую программу: Используя тип unsigned long int, выполнить с двоичным представлением...

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

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

Функция и программа для проверки, которая возвращает номер минимального элемента C++ - C++
Написать функцию и программу для ее проверки, которая возвращает номер минимального элемента в массиве целых чисел.


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
05.09.2009, 16:14
Ответ Создать тему
Опции темы

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