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

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

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

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

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...

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

24
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 20:36  [ТС] 3
Как тогда изменить данную программу,чтоб можно было вводить русские символы и получать результат - телефон?
0
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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
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
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
04.09.2009, 21:20 6
Преобразует входную строку в ASCII кодировке. Грубо говоря копирует text в bufRus с изменением кодов символов
0
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 21:35  [ТС] 7
Можно ли использовать setlocale с указателем вместо CharToOem?

Расшифруйте пожалуйста подробней,вот это,что на что указывает:
C++
1
char* Rus(const char* text)
0
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
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
04.09.2009, 22:03  [ТС] 9
Rus - это функция с именем Rus которая указывает на то,что возвращает функция?
C++
1
char *Rus
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
04.09.2009, 22:21 10
Golovastik, прочитай тему,русские шрифты в конслои....
так попробуй,этот никогда не подвел
Код
// установить вручную шрифт Lucida Console в свойствах окна консоли 
// и запомнить это для всех окон с этим именем
// записать в начале программы строку 
 #include <windows.h>
// записать в начале функции main ( после строки с символом { ) 
// две следующих строки 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
1
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
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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
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
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
05.09.2009, 16:21  [ТС] 16
Вроде всё работает, последний момент. Почему,если поставить условие
Код
 while(t == "сила");
программа перестанет продолжать работать?
0
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
05.09.2009, 16:25 17
Цитата Сообщение от Golovastik Посмотреть сообщение
программа перестанет продолжать работать?
Наверно имеет смысл написать так
C++
1
while(t == aladin("сила"));
Ведь заметь, то что написано в коде кириллицей корректно сравнивается с введенным текстом только после преобразования с помощью CharToOemA. Это стоит в будущем учитывать
0
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
Эксперт JavaЭксперт С++
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
05.09.2009, 17:41 19
по поводу cin.fail() cin
setlocale("сила") так что ли? Тогда нет. Или как, уточни вопрос?
if(i == 10]) во первых квадратной скобки там быть не может, во вторых i будет равно 10 тогда и только тогда, когда пройден весь массив и не найдено ни одного совпадения(если оно будет найдено, то цикл прервется и i не будет дальше увеличиватся и, следовательно, будет i < 10)
0
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
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.09.2009, 17:59
Помогаю со студенческими работами здесь

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

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

СтрЗаменить телефонный номер
У меня есть телефонный номер (012) 34-56-78. Чтобы остались одни цифры.Как удалить все лишние...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru