Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435

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

04.09.2009, 20:01. Показов 5762. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.09.2009, 20:01
Ответы с готовыми решениями:

Объект – телефонный номер сотового телефона, определить количество абонентов МТС
Объект – телефонный номер сотового телефона. Известны фамилия и имя владельца, оператор сотовой связи, тариф, остаток на счете. Определить...

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

Программа, считывающая телефонный номер, пока не достигнет конца файла
Как лучше осуществить алгоритм данной задачи, например такой input.txt (8927)1234-567аааааааааааааааааааааа ...

24
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
04.09.2009, 20:26
Цитата Сообщение от 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  [ТС]
Как тогда изменить данную программу,чтоб можно было вводить русские символы и получать результат - телефон?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
04.09.2009, 20:47
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  [ТС]
Странно,работает по вашей идее. Вы не дадите, если не трудно комент по вот этому. Рашифруйте что здесь происходит, если не трудно.

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

Расшифруйте пожалуйста подробней,вот это,что на что указывает:
C++
1
char* Rus(const char* text)
0
 Аватар для Mozart
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
04.09.2009, 21:44
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  [ТС]
Rus - это функция с именем Rus которая указывает на то,что возвращает функция?
C++
1
char *Rus
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
04.09.2009, 22:21
Golovastik, прочитай тему,русские шрифты в конслои....
так попробуй,этот никогда не подвел
Code
1
2
3
4
5
6
7
8
// установить вручную шрифт Lucida Console в свойствах окна консоли 
// и запомнить это для всех окон с этим именем
// записать в начале программы строку 
 #include <windows.h>
// записать в начале функции main ( после строки с символом { ) 
// две следующих строки 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
1
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 23:47  [ТС]
Вроде с этим разобрался,последний вопрос. Какую роль играет выражение i = 10 из строки:
C++
1
 if(i==10) cout<<"Отсутствует в каталоге. \n";
Почему,если поставить i<10 или i>10 не будет выдавать фразу:
Отсутствует в каталоге.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
04.09.2009, 23:58
Golovastik, ты не прав.
Поставь условие i<10 и ты увидеш эту фразу в любом случае.
Поставь i>10 и ты не увидиш ее никогда, потому как i никогда не будет больше 10
Поставил i==10 потому, что когда цикл заканчивается и при этом не находится совпадений, то у i значение будет 10. Если совпадения есть, то значение будет меньше 10
0
05.09.2009, 13:47

Не по теме:

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

0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 15:52  [ТС]
Есть ещё вопрос. Попробовал реализовать данную программу таким способом, но что-то программа вообще стала хромать, не скажете,что в ней не так:
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
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
05.09.2009, 16:14
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  [ТС]
Вроде всё работает, последний момент. Почему,если поставить условие
Code
1
 while(t == "сила");
программа перестанет продолжать работать?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
05.09.2009, 16:25
Цитата Сообщение от Golovastik Посмотреть сообщение
программа перестанет продолжать работать?
Наверно имеет смысл написать так
C++
1
while(t == aladin("сила"));
Ведь заметь, то что написано в коде кириллицей корректно сравнивается с введенным текстом только после преобразования с помощью CharToOemA. Это стоит в будущем учитывать
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:36  [ТС]
Странно, не думал,что нужно передавать в функцию слово сила. Ещё один вопросик и всё.
Скажите, можно ли использовать setlocale() вместо CharTOOem?
Что именно даёт:
C++
1
if(i == 10]) cout<<"\nОтсутсвует в каталоге. ";
Вроде написал, но понять не могу эту строку. Можно ли использовать cin.fail(), слышал вроде есть такая функция. Дайте расшифровку,если не затруднит,ещё раз понятнее по строке выше if(i == 10]. Благодарю заранее.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
05.09.2009, 17:41
по поводу 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  [ТС]
По поводу i = 10, понятно,тоесть когда пройден весь массив и не найдено ни одного совпадения,тогда i не будет увеличиваться, следовательно и выдаст сообщение, с этим уяснил.
По поводу cin.fail,у вас не работает ссылка, я так и не смог прочитать. Теперь по поводу setlocale
Я имею ввиду,если описать как-то функцию(всю), с использованием её, возможно ли это?
Тоесть можно ли с помощью её переделать вот это:
C++
1
2
3
4
5
char*aladin(const char *balada)
{
        CharToOem(balada,maska);
        return maska;
}
Последний вопрос.
Почему,если изменить строку:
Code
1
char *aladin(const char *balada)
на строку
Code
1
char aladin(const char *balada)
Программа перестанет работать?
Выдаст ошибку:
cannot convert from 'char [256]' to char
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.09.2009, 17:59
Помогаю со студенческими работами здесь

Телефонный номер.
Математик решил позвонить своему другу в Москву (все телефонные номера в Москве семизначные), но номер телефона забыл. Зато он хорошо...

Телефонный номер
Здравствуйте, помогите пожалуйста с задачей, не могу понять как решается, спасибо! Дан телефонный номер. Напишите программу которая...

Телефонный номер на странице
Здравствуйте. Подскажите, есть страница на которой указан телефонный номер формируется VCARD'ом яндекса. В опере телефон показывается...

СтрЗаменить телефонный номер
У меня есть телефонный номер (012) 34-56-78. Чтобы остались одни цифры.Как удалить все лишние знаки. Например знаки &quot;:) (* -!...

Телефонный номер и теги (регулярка)
Помогите с регуляркой, пожалуйста. У меня есть строка с тегами: $text = 'Телефон: 8(800) 111-12-12....'; Нужно из этой строки...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru