[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Ему ж не делфи нужно)
     
  2. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Для начала сойдет и WinInet. http://www.rsdn.ru/article/inet/wininet.xml Сокеты для самого начала очень сложно будет
     
  3. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    возможно стоит изучить c#
     
  4. beard®

    beard® New Member

    Joined:
    20 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Всем доброго времени суток!
    Подскажите плиз. Есть код консольного приложения С++, сравнивающий заглавные и прописные буквы алфавита. Если сравнение идет латиницы - все работает. Если в сравнение подставлять кириллицу, то, символ вводимый с клавиатуры отображается в консоли, но либо не определяется кодом, либо определяется как нечто невразумительное. Компилятор MSVS 2010. Заранее признателен!

    PHP:
    //Ex3_01.cpp
    // Демонстрация вложенных операторов if

    #include "locale.h"
    #include <iostream>
    #include "windows.h"
    using namespace std;

    int main()
    {
        
    setlocale(LC_ALL"english");
        
    char letter 0;                // Для хранения введенного значения
        
    cout << endl
            
    << "Введите букву: ";        // Приглашение к вводу
        
    cin >> letter;                    // Считывание символа
        
    if(letter >= 'A')                // Больше или равно А
            
    if(letter <= 'Z')            // Меньше или равно Я
            
    {
                
    cout << endl 
                    
    << "Вы ввели заглавную букву: " << endl
                    
    << letter
                    
    << endl;
                return 
    0;
            }
            if(
    letter >= 'a')                // Больше или равно а
                
    if(letter <= 'z')            // Меньше или равно я
                
    {
                    
    cout << endl 
                        
    << "Вы вввели прописную букву: " << endl
                        
    << letter
                        
    << endl;
                    return 
    0;
                }
            
    cout << endl
                
    << "Вы ввели не букву, а х*ню!!!"
                
    << endl;
            return 
    0;
    }
     
  5. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    а ты знаешь что латинские буквы умеют последовательные коды, а кирилические имеют разрыв в числовых кодах гдето, поэтому для латиницы верно
    if(a > 'a' && a< 'a')
    а для кирилицы
    if(a > 'a' && a<'a')
    неверно. Распечатай коды всех символов и увидишь. Кстати Крилица вообще имеет отрицательные коды поэтому последний вариант вообще неверен.
    Code:
    for(int i = -128; i<128; i++)
        cout<<i<<" = "<<(char)i<<endl;
    Правда я у тебя в коде вообще ничего связанного с крилицей кроме комментариев не увидел, так что неуверен что именно ты имел в виду.
     
    #5685 cupper, 30 Sep 2010
    Last edited: 30 Sep 2010
  6. beard®

    beard® New Member

    Joined:
    20 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Выложен вариант для латиницы.
    Как сделать аналог для кирилицы?
     
  7. nitx

    nitx Elder - Старейшина

    Joined:
    4 Jan 2008
    Messages:
    214
    Likes Received:
    31
    Reputations:
    10
    Создай таблицу (а вернее массив) кириллицы, где каждой букве соответсвуют некоторые УПОРЯДОЧЕННЫЕ значения, которые будут совпдать с алфавитом.
    ну и, например, у тебя в int c, b - кириллическиe символы, тогда в коде будет так:
    (table[c].id < table.id) ? #doSomethingFor_c# : #doSomethingFor_b#

    То есть я предлагаю тебе иметь свою собственную таблицу кириллицы.
     
    #5687 nitx, 30 Sep 2010
    Last edited: 30 Sep 2010
  8. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5


    слишком роскошно. Нужно всего то чуть переделать проверки и все, а для этого нужно знать какие кода имеют кириллические символы, а для этого нужно их распечатать и самому посмотреть, что я посоветовал сделать
     
  9. beard®

    beard® New Member

    Joined:
    20 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Самое забавное, что, если вводить буквы от "р" до "я", программка сообщает о введении букв от "а" до "п"... И ругается на первую часть алфавита.
     
  10. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    A = -128 && Я = -97 || Ё = -16
    a = -96 && п = -81 || p = -31 && я = -17 || ё = 15

    проверка для кирилици будет выглядеть так
    Code:
    char a;
    cin>>a;
    if(a>='A' && a<='Я' || a == 'Ё')
       cout<<"Заглавная";
    else if (a >= 'a' && a<='п' || a>='p' && a<='я' || a == 'ё')
       cout<<"строчная";
    
    Code:
    #include <iostream.h>
    int main()
    {
        char a;
        for(int i=0; i<10; i++)
        {
            cin>>a;
            if(a>=-128 && a<=-97 || a == -16)
                std::cout<<"Big\n";
            else if (a >= -96 && a<=-81 || a>=-32 && a<=-17 || a == -15)
                std::cout<<"Litle\n";
        }
        return 0;
    }
    
    проверено - работает.
     
    #5690 cupper, 1 Oct 2010
    Last edited: 1 Oct 2010
    1 person likes this.
  11. beard®

    beard® New Member

    Joined:
    20 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Хм... Работает, но не совсем корректно. (может я не совсем точно обрисовал чего хотел добиться от программки... сорри за скудоумие)
    Т.е. определяется заглавная или прописная буква. С этим я разобрался.
    Смысл моего обращения был в том, что некорректно интерпритируются нажатия клавиш, т.е.
    - вводишь из диапазона р-я, пишет:
    "Вы ввели прописную букву:..." и выводит символы из диапазона а-п.
    - вводишь а-п:
    "Вы ввели прописную букву:"
    Смысл был в том, чтобы не только определять регистр символов, но и выводить ВВЕДЕННЫЙ символ в консоль после фразы "Вы ввели прописную букву:"
     
  12. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    3 раза перечитал прежде чем понял что у тебя за проблема;
    Ты нибось русские буквы в консоль выводишь так же как и латинские ?)
    Code:
    cout<<a;
    Ну так вот зная что cout не умеет русские буквы в консоль писать. Для этого нужно предварительно конвертировать текст. Вот те пример, а дальше ищи сам
    Code:
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    char str[10] = «мама мыла»;
    char buf[10];
    CharToOem(str, buf);
    cout << buf << endl;
    getch();
    return 0;
    }
    
     
    #5692 cupper, 1 Oct 2010
    Last edited: 1 Oct 2010
  13. beard®

    beard® New Member

    Joined:
    20 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Код взят из книги Хортона по VC++.
    Это пример применения вложенных операторов if.
    PHP:
    // Ex3_01.cpp  // A nested if demonstration
    #include <iostream>    
    using std::cin;  
    using std::cout;  
    using std::endl;    
    int main()  
    {     
      
    char letter 0;                      // Store input in here       
      
    cout << endl          
       
    << "Enter a letter: ";           // Prompt for the input     
      
    cin >> letter;                        // then read a character       
       
    if(letter >= 'A')                     // Test for 'A' or larger       
          
    if(letter <= 'Z')                  // Test for 'Z' or smaller        
         
    {           
             
    cout << endl                
                   
    << "You entered a capital letter."                
                   
    << endl;           
             return 
    0;        
         }       
           if(
    letter >= 'a')                     // Test for 'a' or larger        
              
    if(letter <= 'z')                  // Test for 'z' or smaller        
        
    {           
           
    cout << endl                
                  
    << "You entered a small letter."                
                 
    << endl;           
            return 
    0;        
         }       
            
    cout << endl << "You did not enter a letter." << endl;     
         return 
    0;  
    }  
    После приглашения вводим заглавную или строчную букву, программка распознает ее и выводит сообщение о том, в каком регистре введена буква.
    Захотелось не много подправить программку, а именно:
    во-первых - чтобы все приглашения и сообщения выводились на русском (элементарно решается);
    во-вторых - чтобы введенный символ не только распознавался по регистру, но и выводился на экран после опознания;
    Вот с последним пунктом и возникли проблемы. Не могу реализовать.
     
  14. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    ептать!!! да нахрена ты выкладываешь код который абсолютно правильно работает ??? Ты выложи тот где у тебя ошибки.
     
  15. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    Borland C++
    PHP:
    void main ()
    {
     
    unsigned char menu;
     do{
      
    cout << "Hello, world\n";
      
    cin >> menu;
     }while(
    menu != 5);
    }
    Не смотря на ввод пятёрки, цикл продолжает "крутиться", что не так то ? o_0
     
  16. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Вы вводите не 5 а символ '5'.
    т.к. unsigned char menu;
    =>while(menu != '5')
    или
    unsigned int menu;
    while(menu != 5)
     
    1 person likes this.
  17. llexus

    llexus Member

    Joined:
    19 Sep 2010
    Messages:
    57
    Likes Received:
    6
    Reputations:
    10
    Меню типа чар, сравниваешь с интом. Компилятор не ругался?

    Упд. Опередили:)
     
  18. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Точно не ругался.
     
  19. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    ах блин, точно)) Irdis, спасибо!
    --
    А правда, почему он не ругается, если я сравниваю разные типы данных ?
     
  20. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    и не должен происходит простое расширение char в int вот если бы int в char приводился то тогда еще можно выдать предупреждение и то даже int в char например так
    int in = ~0u / 2;
    char c = in;
    компиятор C/C++ глотает если только включить самый высокий уровеь предупреждений попробовать а все потому что миллионы строк кода спокойно присваивают int в char поэтому в С++ решили не выдавать предупреждение на этот счет так пишет страуструп а в Си вообще фиолетово было всегда
     
    #5700 greki_hoy, 1 Oct 2010
    Last edited: 1 Oct 2010
Thread Status:
Not open for further replies.