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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 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;
}
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 20:36  [ТС]     Программа телефонный номер #3
Как тогда изменить данную программу,чтоб можно было вводить русские символы и получать результат - телефон?
M128K145
Эксперт С++
8283 / 3502 / 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();
}
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;
}
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
04.09.2009, 21:20     Программа телефонный номер #6
Преобразует входную строку в ASCII кодировке. Грубо говоря копирует text в bufRus с изменением кодов символов
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 21:35  [ТС]     Программа телефонный номер #7
Можно ли использовать setlocale с указателем вместо CharToOem?

Расшифруйте пожалуйста подробней,вот это,что на что указывает:
C++
1
char* Rus(const char* text)
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.
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 22:03  [ТС]     Программа телефонный номер #9
Rus - это функция с именем Rus которая указывает на то,что возвращает функция?
C++
1
char *Rus
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,230
Завершенные тесты: 1
04.09.2009, 22:21     Программа телефонный номер #10
Golovastik, прочитай тему,русские шрифты в конслои....
так попробуй,этот никогда не подвел
Код
// установить вручную шрифт Lucida Console в свойствах окна консоли 
// и запомнить это для всех окон с этим именем
// записать в начале программы строку 
 #include <windows.h>
// записать в начале функции main ( после строки с символом { ) 
// две следующих строки 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
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 не будет выдавать фразу:
Отсутствует в каталоге.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
04.09.2009, 23:58     Программа телефонный номер #12
Golovastik, ты не прав.
Поставь условие i<10 и ты увидеш эту фразу в любом случае.
Поставь i>10 и ты не увидиш ее никогда, потому как i никогда не будет больше 10
Поставил i==10 потому, что когда цикл заканчивается и при этом не находится совпадений, то у i значение будет 10. Если совпадения есть, то значение будет меньше 10
^Tecktonik_KiLLeR
05.09.2009, 13:47
  #13

Не по теме:

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

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();
}
M128K145
Эксперт С++
8283 / 3502 / 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;
}
брейк отрабатывал сразу после первой итерации, а надо чтобы отрабатывал только при совпадении. Поэтому ты просто забыл поставить скобки
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:21  [ТС]     Программа телефонный номер #16
Вроде всё работает, последний момент. Почему,если поставить условие
Код
 while(t == "сила");
программа перестанет продолжать работать?
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
05.09.2009, 16:25     Программа телефонный номер #17
Цитата Сообщение от Golovastik Посмотреть сообщение
программа перестанет продолжать работать?
Наверно имеет смысл написать так
C++
1
while(t == aladin("сила"));
Ведь заметь, то что написано в коде кириллицей корректно сравнивается с введенным текстом только после преобразования с помощью CharToOemA. Это стоит в будущем учитывать
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:36  [ТС]     Программа телефонный номер #18
Странно, не думал,что нужно передавать в функцию слово сила. Ещё один вопросик и всё.
Скажите, можно ли использовать setlocale() вместо CharTOOem?
Что именно даёт:
C++
1
if(i == 10]) cout<<"\nОтсутсвует в каталоге. ";
Вроде написал, но понять не могу эту строку. Можно ли использовать cin.fail(), слышал вроде есть такая функция. Дайте расшифровку,если не затруднит,ещё раз понятнее по строке выше if(i == 10]. Благодарю заранее.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
05.09.2009, 17:41     Программа телефонный номер #19
по поводу cin.fail() cin
setlocale("сила") так что ли? Тогда нет. Или как, уточни вопрос?
if(i == 10]) во первых квадратной скобки там быть не может, во вторых i будет равно 10 тогда и только тогда, когда пройден весь массив и не найдено ни одного совпадения(если оно будет найдено, то цикл прервется и i не будет дальше увеличиватся и, следовательно, будет i < 10)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2009, 17:59     Программа телефонный номер
Еще ссылки по теме:

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

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

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

Программа не работает (описать класс с именем NOTE (фамилия и инициалы; номер телефона; дата рождения)) - C++
Задание: Описать класс, объявить массив из 10 объектов. Написать программу в которой обеспечить ввод данных в массив с клавиатуры,...


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

Или воспользуйтесь поиском по форуму:
Golovastik
11 / 11 / 0
Регистрация: 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
Yandex
Объявления
05.09.2009, 17:59     Программа телефонный номер
Ответ Создать тему
Опции темы

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