1 Востаннє редагувалося Skyzerks Synx (29.10.2014 21:10:31)

Тема: Проблеми з кодуванням символів (або щось типу того) на С++. Help

В мене виникла проблема з тим як відрізняти певні символи в С++. Наприклад як виловити символ латинського алфавіту і кирилиці в одному рядку. Або ще банальніше як задати програмі щоб вона відрізнила цифри від букв.
Наскільки пам'ятаю для того щоб перевірити чи елемент рядка є цифрою використовуємо вибірку

if(a[i]>=0&&a[i]<=9)

Але як бути з буквами? Може є якісь певні функції для ліпшого пошуку цих символів окрім циклу for для пошуку по кодуванню ASCII.

"P.S."

Така таблиця підійде? http://sbiii.com/pix/asciichr.gif

"P.P.S."

Ця таблиця для кодування символів кирилиці підійде? (з 192 по 255) Тільки як задати це  кодування з 1 по 255? http://school497.ru/download/u/02/img/asc1.gif

2

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

1. Продивіться функції в cctype.
2. Порівняння з інтервалом трохи краще записувати як

if(  ( 0 <= a[ i ] ) && ( a[ i ] <= 9 ) )

одразу видно, що мова йде про a[ i ] між 0 і 9.
3. Кирилічні символи залежать від кодової сторінки, яку ви використовуєте (це, швидше за все, cp866 чи win1251). Якщо компілятор C++ новий, то встановлення локалі має змінювати поведінку відповідних функцій.

Подякували: Skyzerks Synx1

3

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:

1. Продивіться функції в cctype.
2. Порівняння з інтервалом трохи краще записувати як

if(  ( 0 <= a[ i ] ) && ( a[ i ] <= 9 ) )

одразу видно, що мова йде про a[ i ] між 0 і 9.
3. Кирилічні символи залежать від кодової сторінки, яку ви використовуєте (це, швидше за все, cp866 чи win1251). Якщо компілятор C++ новий, то встановлення локалі має змінювати поведінку відповідних функцій.

Ну я задавав

setlocale(LC_CTYPE, "rus");

то тоді треба міняти на

setlocale(LC_CTYPE, cp866);

?
в сp866 це 41(0-9, A-F), 42 і 43?

тільки як задати цей діапазон 16-ої системи кодування (від 0 до 9 ще зрозуміло, а як ще включити A-F)?

4

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

В стандартній консолі Windows використовується cp866, достатньо мову перемкнути.
І ви чесно-чесно не знаєте, як переводити з 16-річної в 10-кову систему? Тоді, на крайній випадок, C++ сприймає і 16-річні числа - з префіксом 0x:
0xA == 10

5

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:

В стандартній консолі Windows використовується cp866, достатньо мову перемкнути.
І ви чесно-чесно не знаєте, як переводити з 16-річної в 10-кову систему? Тоді, на крайній випадок, C++ сприймає і 16-річні числа - з префіксом 0x:
0xA == 10

можете, будь-ласка, дати посилання на ресурси де про це можна по-детальніше ознайомитись?

6 Востаннє редагувалося Joker (29.10.2014 21:58:10)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

можете, будь-ласка, дати посилання на ресурси де про це можна по-детальніше ознайомитись?

Здається я раніше створював тему з такою інфою.

Joker:
Потрібно написати функцію на С++ яка отримує такі аргументи : ціле число, систему числення в яку потрібно перевести це число. Приклади: 27  у систему числення 16 отримаємо 1В. 13 у 5-U  --> 23.
Киньте лінк на якусь статтю, щоб я хоча б зрозумів алгоритм я кожна з них працює.
P.S. Можливо тема не підходить до розділу, але на цю проблему я наштовхнувся вивчаючи С++ і програм відповідно повинна бути на С++.



koala написав:

Товсто.
Алгоритм розбирається тут.
Ну і itoa.

p.S.Підходить? Я не впевнений, що правильно зрозумів те що вам потрібно?

7 Востаннє редагувалося Skyzerks Synx (29.10.2014 22:12:34)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Joker написав:

можете, будь-ласка, дати посилання на ресурси де про це можна по-детальніше ознайомитись?

Здається я раніше створював тему з такою інфою.

Joker:
Потрібно написати функцію на С++ яка отримує такі аргументи : ціле число, систему числення в яку потрібно перевести це число. Приклади: 27  у систему числення 16 отримаємо 1В. 13 у 5-U  --> 23.
Киньте лінк на якусь статтю, щоб я хоча б зрозумів алгоритм я кожна з них працює.
P.S. Можливо тема не підходить до розділу, але на цю проблему я наштовхнувся вивчаючи С++ і програм відповідно повинна бути на С++.



koala написав:

Товсто.
Алгоритм розбирається тут.
Ну і itoa.

p.S.Підходить? Я не впевнений, що правильно зрозумів те що вам потрібно?

Це ваше 666 повідомлення. Можливо, це знак  :D

Прихований текст

І чому я завжди звертаю увагу не на те що треба...

8 Востаннє редагувалося Skyzerks Synx (30.10.2014 01:12:19)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Якось викрутився не використовуючи кодування ASCII (для кодування букв я ще занадто зелений)

{
    setlocale(LC_CTYPE, "rus");
    char *a= new char[];
    cout<<"Введите число: ";
    cin>>a;
    double v;
    int i;
    v=atof(a);
    i=atoi(a);
    if(i==v) cout<<"Введенная строка является целым числом";
    if(i!=v) cout<< "Введенная строка не является целым числом";
    system("pause");
    return 0;
}

І все ж таки, як мені зробити те саме, використовуючи кодування ASCII?   :)

P.S.

І так, перечитавши вже немало інфи про кодуванням ASCII, не розумію як його використовувати в коді  *WALL*
Однак, я дуже сильно хочу зрозуміти як воно працює. 

9 Востаннє редагувалося koala (30.10.2014 06:09:45)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Ви використали стандартні функції перетворення чисел, це не зовсім чесно :)
ну і

int i = 0;
//навіть якщо кодування не ASCII, але цифри там йдуть поспіль від 0 до 9 - спрацює
while( ( '0' <= a[ i ] ) && ( a[ i ] <= '9' ) )
{
  ++i;
}
if( ( i == 0  ) || ( a[ i ] != '\0' ) )//i не змінилося (жодної цифри) або a[ i ] - не кінець рядку (є щось, крім цифр)
else //ціле

10 Востаннє редагувалося Skyzerks Synx (30.10.2014 09:00:22)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:

Ви використали стандартні функції перетворення чисел, це не зовсім чесно :)
ну і

int i = 0;
//навіть якщо кодування не ASCII, але цифри там йдуть поспіль від 0 до 9 - спрацює
while( ( '0' <= a[ i ] ) && ( a[ i ] <= '9' ) )
{
  ++i;
}
if( ( i == 0  ) || ( a[ i ] != '\0' ) )//i не змінилося (жодної цифри) або a[ i ] - не кінець рядку (є щось, крім цифр)
else //ціле

Я вже пробував якось виловити різницю між цілими і числами з плаваючою точкою похожим способом.
Але я ніяк не міг правильно задати цю умову з '.', оскільки при роботі з самою програмою воно ніби брало просто першу з двох if.
і на тому все.
Вот ця оказія:

{
    {
    setlocale(LC_ALL, "rus");
    char a;
    cout<<"Введите число: "; cin>>a;
    char *b={&a};
    int len = sizeof(*b);
    int flag=0;
    for(int i=0; i<len; i++)
    {
        if(b[i]='.'&&(b[i+1]=>0&&b[i+1]<=9)) flag=1;
        else flag=0;
    }
    if(flag==1) printf("Введенная строка не является целым числом\n");
    if(flag==0) printf("Введенная строка является целым числом\n");
    system("pause");
    return 0;
}

в 11 рядку коду, що я тільки не ставив як умову. На мою думку одна з вдалих мала б бути лише '.', але воно працювало тільки якщо ця крапка писалась першою.   *SCRATCH*
наприклад: .157

11

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

char a;
cin>>a;

Це ввід одного символа, а не числа. Тобто якщо набрати 10, то буде a=='1' і в буфері вводу чекатиме '0'.

12

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:
char a;
cin>>a;

Це ввід одного символа, а не числа. Тобто якщо набрати 10, то буде a=='1' і в буфері вводу чекатиме '0'.

Гаразд, переробив:

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    char *a=new char[];
    cout<<"Введите число: "; cin>>a;
    int len = sizeof(*a);
    int flag=0;
    for(int i=0; i<len; i++)
    {
        if(a[i]='.'&&(a[i+1]>0&&a[i+1]<=9)) flag=1; 
        else flag=0;
    }
    if(flag==1) printf("Введенная строка не является целым числом\n");
    if(flag==0) printf("Введенная строка является целым числом\n");
    system("pause");
    return 0;
}

Але все одно у коді висять завідомо неправильні умови.  *SCRATCH*

13

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

char *a=new char[100];

наприклад
Інакше - UB.
Та й нащо вам та динаміка?

char a[100];

і все.
І sizeof повертає розмір змінної, а не довжину рядка. Для цього є strlen.

14

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:
char *a=new char[100];

наприклад
Інакше - UB.
Та й нащо вам та динаміка?

char a[100];

і все.
І sizeof повертає розмір змінної, а не довжину рядка. Для цього є strlen.

Поміняти змінні поміняв, а за функції забув  *PARDON*

15

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Навіщо так складно, як можна просто порівняти double==int ось так

int main()
{
    setlocale(LC_ALL, "rus");
    double num;
    cout << "Введите число: "; cin >> num;
    if ((int)num == num)
        cout<<"Введенная строка не является целым числом\n";
    else
        if ((int)num != num)
            cout<<"Введенная строка является целым числом\n";
    getch();
    return 0;
}

16

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Betterthanyou написав:

Навіщо так складно, як можна просто порівняти double==int ось так

int main()
{
    setlocale(LC_ALL, "rus");
    double num;
    cout << "Введите число: "; cin >> num;
    if ((int)num == num)
        cout<<"Введенная строка не является целым числом\n";
    else
        if ((int)num != num)
            cout<<"Введенная строка является целым числом\n";
    getch();
    return 0;
}

Ви запускали? Бо я запускав: http://ideone.com/8wEqX7

Подякували: koala1

17

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

quez написав:

Ви запускали? Бо я запускав: http://ideone.com/8wEqX7

Упс

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    setlocale(LC_ALL, "rus");
    double num;
    cout << "Введите число: "; cin >> num;
    if ((int)num != num)
        cout<<"Введенная строка не является целым числом\n";
    else
        if ((int)num == num)
            cout<<"Введенная строка является целым числом\n";
    getch();
    return 0;
}

18

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

Betterthanyou написав:

Навіщо так складно, як можна просто порівняти double==int ось так

Завдання ніби-то було відрізнити цифри від інших символів...

19 Востаннє редагувалося Skyzerks Synx (30.10.2014 21:35:38)

Re: Проблеми з кодуванням символів (або щось типу того) на С++. Help

koala написав:
Betterthanyou написав:

Навіщо так складно, як можна просто порівняти double==int ось так

Завдання ніби-то було відрізнити цифри від інших символів...

Так, і в результаті я просто звів все розв'язання до пошуку цих цифр, а все інше (else) - букви і інші символи. Однак пошук різниці між символами виявився трошки закавиристим, я попробував використовувати decimal кодування символів ASCII для того щоб розпізнати символ латинського алфафіту діапазону 65-122. Вот:

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE, "rus");
    cout<<"Введите символ: ";
    int a = getchar();
    char b = putchar(a);
    if(a>=65&&a<=122)
    {
        cout<<"Введенно символ латинского алфавита: "<<b<<'\n';
    }
    else printf("Символ не преднадлежыт латинскому алфавиту");
    system("pause");
    return 0;
}

Один символ просто, можливо і не складніше коли ми вводимо слово з символами різного значення decimal-кодів ASCII. Але якщо ми запишемо кілька слів відділених наприклад пробілами, як знайти кількість різних символів окремо у кожному з слів? Десь я прознав що використовується strtok(), але як його корректно використовувати я не можу зрозуміти.  *SCRATCH*