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

Стоит задача сравнение и подсчета символов строки. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
11.09.2011, 14:09     Стоит задача сравнение и подсчета символов строки. #1
Стоит задача сравнение и подсчета символов строки. Получается, сравнить только всю строку. Подскажите пожалуйста, как сравнивать символы строки, а не всю строку целиком, но при этом программа выполняла бы туже функцию, что и ниже приведенная. То есть массив А инициализировать как
C++
1
А [][] = {{'0','1','0','1'}, {'0','1','0','1'}, и т.д}
и С как
C++
1
C [][] = {{'0','0','0','0'}, {'0','0','0','1'}, и т.д}
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <conio.h>
#include <cstring>
#include <cstdio>
#include <clocale>
 
using namespace std;
 
const int size = 20;
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    char A [size][5] = {{"0000"},{"0001"},{"0001"},{"0111"},{"0001"},{"0001"},{"1111"},{"1001"},{"0101"},{"0111"},
    {"0111"},{"1111"},{"1001"},{"0111"},{"1101"},{"0111"},{"1111"},{"1101"},{"0101"},{"0111"}};
        
    for (int i=0; i<size; i++) cout << A[i] << " ";
    cout << endl<< endl;
    
    int count_0=0, count_1=0,count_2=0,count_3=0,count_4=0,count_5=0,count_6=0,count_7 = 0,count_8=0,count_9=0,count_10 =0, count_11=0,count_12=0,count_13=0,count_14=0,count_15 =0;
      
    char C[16][5] = {{"0000"},{"0001"},{"0010"},{"0011"},{"0100"}, {"0101"}, {"0110"}, {"0111"}, {"1000"}, {"1001"}, {"1010"},
 {"1011"}, {"1100"}, {"1101"}, {"1110"}, {"1111"}};
    
    for (int i=0; i<size; i++){
        //for (int j=0; j<16; j++){
    if (!strcmp (A[i],C[0])) count_0 = ++count_0;   
    else if (!strcmp (A[i],C[1])) count_1 = ++count_1;  
    else if (!strcmp (A[i],C[2])) count_2 = ++count_2;  
    else if (!strcmp (A[i],C[3])) count_3 = ++count_3;  
    else if (!strcmp (A[i],C[4])) count_4 = ++count_4;  
    else if (!strcmp (A[i],C[5])) count_5 = ++count_5;  
    else if (!strcmp (A[i],C[6])) count_6 = ++count_6;  
    else if (!strcmp (A[i],C[7])) count_7 = ++count_7;  
    else if (!strcmp (A[i],C[8])) count_8 = ++count_8;  
    else if (!strcmp (A[i],C[9])) count_9 = ++count_9;
    else if (!strcmp (A[i],C[10])) count_10 = ++count_10;
    else if (!strcmp (A[i],C[11])) count_11 = ++count_11;
    else if (!strcmp (A[i],C[12])) count_12 = ++count_12;
    else if (!strcmp (A[i],C[13])) count_13 = ++count_13;
    else if (!strcmp (A[i],C[14])) count_14 = ++count_14;
    else if (!strcmp (A[i],C[15])) count_15 = ++count_15;
    //}
    }
    cout <<"В массиве элементов равных 0 = " <<count_0 << " " << endl;
    cout <<"В массиве элементов равных 1 = " <<count_1 << " " << endl; 
    cout <<"В массиве элементов равных  2 = " <<count_2 << " " << endl; 
    cout <<"В массиве элементов равных 3 = " <<count_3 << " " << endl; 
    cout <<"В массиве элементов равных 4 = " <<count_4 << " " << endl; 
    cout <<"В массиве элементов равных  5 = " <<count_5 << " " << endl; 
    cout <<"В массиве элементов равных 6 = " <<count_6 << " " << endl; 
    cout <<"В массиве элементов равных 7= " <<count_7 << " " << endl; 
    cout <<"В массиве элементов равных  8 = " <<count_8 << " " << endl; 
    cout <<"В массиве элементов равных  9 = " <<count_9 << " " << endl; 
    cout <<"В массиве элементов равных  10 = " <<count_10 << " " << endl; 
    cout <<"В массиве элементов равных 11 = " <<count_11 << " " << endl; 
    cout <<"В массиве элементов равных 12 = " <<count_12 << " " << endl; 
    cout <<"В массиве элементов равных  13 = " <<count_13 << " " << endl; 
    cout <<"В массиве элементов равных 14 = " <<count_14 << " " << endl; 
    cout <<"В массиве элементов равных  15 = " <<count_15 << " " << endl; 
    
    getch ();
    return 0;
}
PS: Модераторы извините что у темы такое название (при создании допустил ошибку), не могу найти как исправить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 14:09     Стоит задача сравнение и подсчета символов строки.
Посмотрите здесь:

C++ Программа для подсчета символов
Сравнение символов из строки C++
C++ строки С++(После каждого символов '.' вставить два пробела, подсчитать, сколько раз пара символов 'C+' стоит перед символом 'D')
задача стоит так : Список фамилий вводится через запятую в виде строки. Упорядочить фамилии по алфавиту C++
организовать функцию подсчета символов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13967 / 8798 / 1224
Регистрация: 24.12.2010
Сообщений: 15,941
11.09.2011, 14:13     Стоит задача сравнение и подсчета символов строки. #2
C
1
2
3
char A[10], B[20];
 if (A[5]==B[4]) ...
 if (A[i]==B[j]) ...
Если я правильно понял вопрос
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
11.09.2011, 14:45  [ТС]     Стоит задача сравнение и подсчета символов строки. #3
Наверное, я Вас не правильно понял или неправильно написал программу. Ниже приведенная программа считает сколько нолей и единиц.

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
#include <iostream>
#include <conio.h>
#include <cstring>
#include <cstdio>
 
using namespace std;
 
int main ()
{
    char A [2][4] = {{'0','0','0','0'},
                    {'0','0','0','1'}};
    for (int j=0; j<2; j++){
    for (int i=0; i<4; i++) {
     cout << A[j][i] << " ";
    }
    cout << endl;
    }
    cout << endl;
    int count_0 = 0;
    int count_1 = 0;
    
    char C1 [1][4] = {'0','0','0','0'};
    char C2 [1][4]= {'0','0','0','1'};
    
    for (int j=0; j<2; j++){
    for (int i=0; i<4; i++){
    if (A[j][i]== C1[0][i]) count_0 = ++count_0;
    else if (A[j][i]== C2[0][i] ) count_1 = ++count_1;
    }
    }
    cout <<"V massive elementov 0=" <<count_0 << " " << endl;
    cout <<"V massive elementov 1=" <<count_1 << " " << endl;
    
    
    
    getch ();
    return 0;
}
А мне требуется из массива сравнивать по 4 символа с числами от 0000 до 1111 и записывать частоту их появления, что делает первая указанная программа. Но все проблема в том, что там инициализация массива выглядит как

C++
1
char A [size][5] = {{"0000"},{"0001"},{"0001"},
а мне нужно, что бы инициализация выглядела как

C++
1
char A [][] = {{'0','1','0','1'}, {'0','1','0','1'}}
Заранее благодарю, за помощь.
-=ЮрА=-
Заблокирован
Автор FAQ
11.09.2011, 18:19     Стоит задача сравнение и подсчета символов строки. #4
Цитата Сообщение от Corvette Посмотреть сообщение
А мне требуется из массива сравнивать по 4 символа с числами от 0000 до 1111 и записывать частоту их появления, что делает первая указанная программа. Но все проблема в том, что там инициализация массива выглядит как
А - вектор на каждой итерации сдвигай указатель в нём на один символ, и выполняй сравнение своих шаблонов "0000" до "1111" с первыми 4-мя символами вектора, делов - 2 минуты работы
Указатель в строке char * str сдвигаем так str++; Четыре первых символа обрабатываем в цикле.

Corvette, тебе нужен подсчёт числа встречающихся в тексте подстрок "0000" до "1111"???
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
11.09.2011, 20:56  [ТС]     Стоит задача сравнение и подсчета символов строки. #5
Спасибо!
Да, мне надо входной массив символов разбить на тетрады и посчитать частоту появлений строк от 0000 до 1111 .
-=ЮрА=-
Заблокирован
Автор FAQ
11.09.2011, 21:04     Стоит задача сравнение и подсчета символов строки. #6
Цитата Сообщение от Corvette Посмотреть сообщение
разбить на тетрады
- рассматривать тетрадами или сдвинули на символ и снова тетрадами смотрим, поясню на рисунке

Вариант 1 123456789... = 1234 5678 9.... //перемещаемся на 4 элемента
Вариант 2 123456789... = 1234 56789 -> 2345 6789..

Какой именно вариант нужен, мне без разницы какой реализовывать, только логику сравнения уточняю, жду ответ!
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
11.09.2011, 23:51  [ТС]     Стоит задача сравнение и подсчета символов строки. #7
Вариант №1. с перемещением на 4 элемента и сравнение каждой четверки с шаблонами.

Спасибо за помощь!!!

Добавлено через 22 минуты
Попытался вот но не считает, где ошибка?

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <conio.h>
#include <cstring>
#include <cstdio>
#include <clocale>
 
using namespace std;
 
const int size = 21;
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    char A [size] = {"01010100011010101010"};
        
    for (int i=0; i<size; i++) cout << A[i] << " ";
    cout << endl<< endl;
    
    int count_0=0, count_1=0,count_2=0,count_3=0,count_4=0,count_5=0,count_6=0,count_7 = 0,count_8=0,count_9=0,count_10 =0, count_11=0,count_12=0,count_13=0,count_14=0,count_15 =0;
      
    char C[16][5] = {{"0000"},{"0001"},{"0010"},{"0011"},{"0100"}, {"0101"}, {"0110"}, {"0111"}, {"1000"}, {"1001"}, {"1010"},
 {"1011"}, {"1100"}, {"1101"}, {"1110"}, {"1111"}};
    
    char temp [5][4];
    int temp_i=0;
    int temp_j=0;
        for (int i=0; i<20; i++) {
                if (i%4==0 && i)
                {
                        temp_i++;
                        temp_j=0;
                }
                temp[temp_i][temp_j++]=A[i];
        }
 
        for (int i=0; i<5; i++) {
        for (int j=0; j<4; j++){
        cout << temp[i][j] << ' ';
        }
        cout << '\0' << endl;
        }
        cout << endl;
   
   for (int i=0; i<5; i++){
        //for (int j=0; j<16; j++){
    if (!strcmp (temp[i],C[0])) count_0 = ++count_0;   
    else if (!strcmp (temp[i],C[1])) count_1 = ++count_1;  
    else if (!strcmp (temp[i],C[2])) count_2 = ++count_2;  
    else if (!strcmp (temp[i],C[3])) count_3 = ++count_3;  
    else if (!strcmp (temp[i],C[4])) count_4 = ++count_4;  
    else if (!strcmp (temp[i],C[5])) count_5 = ++count_5;  
    else if (!strcmp (temp[i],C[6])) count_6 = ++count_6;  
    else if (!strcmp (temp[i],C[7])) count_7 = ++count_7;  
    else if (!strcmp (temp[i],C[8])) count_8 = ++count_8;  
    else if (!strcmp (temp[i],C[9])) count_9 = ++count_9;
    else if (!strcmp (temp[i],C[10])) count_10 = ++count_10;
    else if (!strcmp (temp[i],C[11])) count_11 = ++count_11;
    else if (!strcmp (temp[i],C[12])) count_12 = ++count_12;
    else if (!strcmp (temp[i],C[13])) count_13 = ++count_13;
    else if (!strcmp (temp[i],C[14])) count_14 = ++count_14;
    else if (!strcmp (temp[i],C[15])) count_15 = ++count_15;
    //}
    }
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 0 = " <<count_0 << " " << endl;
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 1 = " <<count_1 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 2 = " <<count_2 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 3 = " <<count_3 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 4 = " <<count_4 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 5 = " <<count_5 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 6 = " <<count_6 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 7 = " <<count_7 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 8 = " <<count_8 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 9 = " <<count_9 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 10 = " <<count_10 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 11 = " <<count_11 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 12 = " <<count_12 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 13 = " <<count_13 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 14 = " <<count_14 << " " << endl; 
    cout <<"Г‚ Г¬Г*Г±Г±ГЁГўГҐ ýëåìåГ*òîâ Г°Г*ГўГ*ûõ 15 = " <<count_15 << " " << endl; 
    
    getch ();
    return 0;
}
Добавлено через 2 часа 6 минут
Разбить на тетрады вроде получается, а вот сравнить с шаблонами нет. Я так понимаю, что когда я разбиваю на тетрады получаются строки вида {'0','1','0','1'} , а сравниваю я со строкой вида {"0101"}. Поэтому и не работает наверное! Как, при разбивки на тетрады в конце каждой четверки добавить элемент '\0'. Чтобы сравнение с строкой {"0101"} было корректным.

Хотя может я и не прав (у меня опыта на С++ ооочень мало).
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 12:46     Стоит задача сравнение и подсчета символов строки. #8
Цитата Сообщение от Corvette Посмотреть сообщение
Вариант №1. с перемещением на 4 элемента и сравнение каждой четверки с шаблонами.
, вот лови код
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <windows.h>//malloc realloc
#include <stdio.h>  //i\o
#include <ctype.h>  //toupper
#include <conio.h>  //getch
 
//Ввод тектса пока не встретим ch_end
char * GetInputText(char * str, long &sLen, char ch_end);
//Получение тетрады из 10-го числа
char * DecToBinTetr(long num);
bool CompStrTetrada(char * str, const char * sTetrada);
 
int main()
{
    long i,j,sLen,n = 16;
    //Всего тетрад 16 : 1111 = 2^0 + 2^1 + 2^2 + 2^3 = 15
    int iTetrads[16];//Число каждой тетерады в тектсе 
    
    char buf[4];
    char * s;
    char * str = (char *)malloc(sizeof(char));
    do
    {
        for(j = 0; j < n; j++)
            iTetrads[j] = 0;//Обнуляем счётчики тетерад
 
        printf("Enter text\r\n:>");
        str = GetInputText(str, sLen, '\n');
        //Добавляем текст нулями текст если строка содержала не кратное 4 число символов
        if((j = sLen % 4) != 0)
        {
            str = (char *)realloc(str,(sLen + (4 - j))/sizeof(char));
            for(i = sLen; i < sLen + (4 - j); i++)
                str[i] = '0';
            str[sLen + (4 - j)] = '\0';
        }
 
        printf("\tSplit string on tetrads\r\n");
        for(i = 0; i < sLen; i += 4)
        {
            s = str + i;
            printf("%c%c%c%c ",s[0],s[1],s[2],s[3]);
            for(j = 0; j < n; j++)
            {
                strcpy(buf,DecToBinTetr(j));
                //Если нашли тетраду увеличиваем счётчик соответсвующей тетрады на 1-цу
                if(CompStrTetrada(s, buf))
                    iTetrads[j] += 1;
            }
        }
        printf("\r\n\tList of tetrads in text\r\n");
        for(j = 0; j < n; j++)
        {
            strcpy(buf,DecToBinTetr(j));
            printf("%s : %d\r\n", buf, iTetrads[j]);
        }
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    free((void *)str);
    free((void *)iTetrads);
    return 0;
}
 
char * GetInputText(char * str, long &sLen, char ch_end)
{
    if(str != NULL)
    {
        sLen = 0;
        while((str[sLen] = getchar()) != ch_end)
            str = (char *)realloc(str,(1 + (sLen = sLen + 1))*sizeof(char));
        str[sLen] = '\0';//Убрали мусор вконце
    }
    return str;
}
 
char * DecToBinTetr(long num)
{
    int i = 0;
    char bin[] = "0000";
    do
    {
        bin[i] = '0';
        if(num%2)
            bin[i] = '1';
        num /= 2;
        i++;
    }
    while(0 < num);
    return &bin[0];
}
 
bool CompStrTetrada(char * str, const char * sTetrada)
{
    bool bRet = false;
    char sCmp[4];
    strncpy(sCmp,str,4);//Копируем 4 первых символа строки str
    if(strcmp(sCmp,sTetrada) == 0)
        bRet = true;
    return bRet;
}
Миниатюры
Стоит задача сравнение и подсчета символов строки.  
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
12.09.2011, 16:44  [ТС]     Стоит задача сравнение и подсчета символов строки. #9
Спасибо огромное за помощь новичку в С++!!!

У меня программа компилируется но выдает предупреждение: [Warning] address of local variable `bin' returned строка №80 в функции char * DecToBinTetr(long num) и не считает частоту тетрад (на тетрады разбивает). Компилятор DEV-C++. Попробовал char bin[] инициализировать в main функции, но не помогло. Подскажите, пожалуйста, в чем может быть проблема?
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 16:52     Стоит задача сравнение и подсчета символов строки. #10
Цитата Сообщение от Corvette Посмотреть сообщение
Компилятор DEV-C++
- в программе использован компилятор от VS 6.0!
PS я писал не в С++ а Си, сейчас поддумаю почему твой компилятор не хочет считать тетрады

Добавлено через 2 минуты
Цитата Сообщение от Corvette Посмотреть сообщение
новичку в С++!
- могу переписать на С++ без
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
DecToBinTetr(long num)
- тетрады шаблона вбить заранее, 100%, почему мой алгоритм не отрабатывает не знаю - хрешу на компилятор (как видишь по скрину я не обманывал что алгоритм рабочий). Переписать?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.09.2011, 16:52     Стоит задача сравнение и подсчета символов строки. #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char * DecToBinTetr(long num)
{
        int i = 0;
        char bin[] = "0000";
        do
        {
                bin[i] = '0';
                if(num%2)
                        bin[i] = '1';
                num /= 2;
                i++;
        }
        while(0 < num);
        return &bin[0];
}
Массив создается в стеке. После выхода из функции его уже нет. Однако возвращается адрес первого элемента этого массива. Так делать нельзя.
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 16:55     Стоит задача сравнение и подсчета символов строки. #12
Цитата Сообщение от ForEveR Посмотреть сообщение
Массив создается в стеке. После выхода из функции его уже нет. Однако возвращается адрес первого элемента этого массива. Так делать нельзя.
- Уверен что его уже нет???Или я в пэйнте нарисовал скрин работы...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.09.2011, 16:57     Стоит задача сравнение и подсчета символов строки. #13
-=ЮрА=-, Его не должно быть. А так. Раз на раз не приходится. Не советую так делать. У тебя сработало - у других не сработает.

Он должен умирать после выхода из области видимости. Если не умирает и более того все работает отлично - стоит избавиться от такого компилятора.
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 17:01     Стоит задача сравнение и подсчета символов строки. #14
ForEveR, специально для тебя, откомпилируй этот код,

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <windows.h>//malloc realloc
#include <stdio.h>  //i\o
#include <ctype.h>  //toupper
#include <conio.h>  //getch
 
//Ввод тектса пока не встретим ch_end
char * GetInputText(char * str, long &sLen, char ch_end);
//Получение тетрады из 10-го числа
char * DecToBinTetr(long num);
bool CompStrTetrada(char * str, const char * sTetrada);
 
int main()
{
    long i,j,sLen,n = 16;
    //Всего тетрад 16 : 1111 = 2^0 + 2^1 + 2^2 + 2^3 = 15
    int iTetrads[16];//Число каждой тетерады в тектсе 
    
    char buf[4];
    char * s;
    char * str = (char *)malloc(sizeof(char));
    do
    {
        for(j = 0; j < n; j++)
        {
            printf("%s\r\n",strcpy(buf,DecToBinTetr(j)));
            iTetrads[j] = 0;//Обнуляем счётчики тетерад
        }
 
/*      printf("Enter text\r\n:>");
        str = GetInputText(str, sLen, '\n');
        //Добавляем текст нулями текст если строка содержала не кратное 4 число символов
        if((j = sLen % 4) != 0)
        {
            str = (char *)realloc(str,(sLen + (4 - j))/sizeof(char));
            for(i = sLen; i < sLen + (4 - j); i++)
                str[i] = '0';
            str[sLen + (4 - j)] = '\0';
        }
 
        printf("\tSplit string on tetrads\r\n");
        for(i = 0; i < sLen; i += 4)
        {
            s = str + i;
            printf("%c%c%c%c ",s[0],s[1],s[2],s[3]);
            for(j = 0; j < n; j++)
            {
                strcpy(buf,DecToBinTetr(j));
                //Если нашли тетраду увеличиваем счётчик соответсвующей тетрады на 1-цу
                if(CompStrTetrada(s, buf))
                    iTetrads[j] += 1;
            }
        }
        printf("\r\n\tList of tetrads in text\r\n");
        for(j = 0; j < n; j++)
        {
            strcpy(buf,DecToBinTetr(j));
            printf("%s : %d\r\n", buf, iTetrads[j]);
        }*/
        printf("Y - new input\r\n");
    }
    while(toupper(getch()) == 'Y');
    free((void *)str);
    free((void *)iTetrads);
    return 0;
}
 
char * GetInputText(char * str, long &sLen, char ch_end)
{
    if(str != NULL)
    {
        sLen = 0;
        while((str[sLen] = getchar()) != ch_end)
            str = (char *)realloc(str,(1 + (sLen = sLen + 1))*sizeof(char));
        str[sLen] = '\0';//Убрали мусор вконце
    }
    return str;
}
 
char * DecToBinTetr(long num)
{
    int i = 0;
    char bin[] = "0000";
    do
    {
        bin[i] = '0';
        if(num%2)
            bin[i] = '1';
        num /= 2;
        i++;
    }
    while(0 < num);
    return &bin[0];
}
 
bool CompStrTetrada(char * str, const char * sTetrada)
{
    bool bRet = false;
    char sCmp[4];
    strncpy(sCmp,str,4);//Копируем 4 первых символа строки str
    if(strcmp(sCmp,sTetrada) == 0)
        bRet = true;
    return bRet;
}
выйдет вот это
0000
1000
0100
1100
0010
1010
0110
1110
0001
1001
0101
1101
0011
1011
0111
1111
Y - new input

Добавлено через 2 минуты
Сейчас просто вобъю эти тетрады в константный массив и исключу DecToBinTetr, раз её не все компиляторы курят...

0000
1000
0100
1100
0010
1010
0110
1110
0001
1001
0101
1101
0011
1011
0111
1111
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.09.2011, 17:03     Стоит задача сравнение и подсчета символов строки. #15
И плюс.

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>
 
char * DecToBinTetr(long num)
{
        int i = 0;
        char bin[] = "0000";
        do
        {
                bin[i] = '0';
                if(num%2)
                        bin[i] = '1';
                num /= 2;
                i++;
        }
        while(0 < num);
        return &bin[0];
}
 
int main()
{
    std::cout << (void*)DecToBinTetr(32568) << std::endl;
}
Код
forever@pterois:~/My_pro1$ ./test_cpp 
*** stack smashing detected ***: ./test_cpp terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0xb7621df0]
/lib/i386-linux-gnu/libc.so.6(+0xe5d9a)[0xb7621d9a]
./test_cpp[0x80486c6]
./test_cpp[0x80486dd]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xb7552e37]
./test_cpp[0x80485c1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fb:03 5507222    /home/forever/My_pro1/test_cpp
08049000-0804a000 r--p 00000000 fb:03 5507222    /home/forever/My_pro1/test_cpp
0804a000-0804b000 rw-p 00001000 fb:03 5507222    /home/forever/My_pro1/test_cpp
09e3c000-09e5d000 rw-p 00000000 00:00 0          [heap]
b753a000-b753c000 rw-p 00000000 00:00 0 
b753c000-b7696000 r-xp 00000000 fb:01 654142     /lib/i386-linux-gnu/libc-2.13.so
b7696000-b7697000 ---p 0015a000 fb:01 654142     /lib/i386-linux-gnu/libc-2.13.so
b7697000-b7699000 r--p 0015a000 fb:01 654142     /lib/i386-linux-gnu/libc-2.13.so
b7699000-b769a000 rw-p 0015c000 fb:01 654142     /lib/i386-linux-gnu/libc-2.13.so
b769a000-b769d000 rw-p 00000000 00:00 0 
b769d000-b76b7000 r-xp 00000000 fb:01 654614     /lib/i386-linux-gnu/libgcc_s.so.1
b76b7000-b76b8000 r--p 00019000 fb:01 654614     /lib/i386-linux-gnu/libgcc_s.so.1
b76b8000-b76b9000 rw-p 0001a000 fb:01 654614     /lib/i386-linux-gnu/libgcc_s.so.1
b76b9000-b76ba000 rw-p 00000000 00:00 0 
b76ba000-b76de000 r-xp 00000000 fb:01 682081     /lib/i386-linux-gnu/libm-2.13.so
b76de000-b76df000 r--p 00023000 fb:01 682081     /lib/i386-linux-gnu/libm-2.13.so
b76df000-b76e0000 rw-p 00024000 fb:01 682081     /lib/i386-linux-gnu/libm-2.13.so
b76e0000-b77bf000 r-xp 00000000 fb:01 135842     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b77bf000-b77c3000 r--p 000de000 fb:01 135842     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b77c3000-b77c4000 rw-p 000e2000 fb:01 135842     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b77c4000-b77cb000 rw-p 00000000 00:00 0 
b77df000-b77e1000 rw-p 00000000 00:00 0 
b77e1000-b77e2000 r-xp 00000000 00:00 0          [vdso]
b77e2000-b77fe000 r-xp 00000000 fb:01 682083     /lib/i386-linux-gnu/ld-2.13.so
b77fe000-b77ff000 r--p 0001b000 fb:01 682083     /lib/i386-linux-gnu/ld-2.13.so
b77ff000-b7800000 rw-p 0001c000 fb:01 682083     /lib/i386-linux-gnu/ld-2.13.so
bf93d000-bf95e000 rw-p 00000000 00:00 0          [stack]
Аварийный останов
Добавлено через 2 минуты
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdlib.h>//malloc realloc
#include <stdio.h>  //i\o
#include <ctype.h>  //toupper
#include <string.h>
 
//Ввод тектса пока не встретим ch_end
char * GetInputText(char * str, long &sLen, char ch_end);
//Получение тетрады из 10-го числа
char * DecToBinTetr(long num);
bool CompStrTetrada(char * str, const char * sTetrada);
 
int main()
{
        long i,j,sLen,n = 16;
        //Всего тетрад 16 : 1111 = 2^0 + 2^1 + 2^2 + 2^3 = 15
        int iTetrads[16];//Число каждой тетерады в тектсе 
    
        char buf[4];
        char * s;
        char * str = (char *)malloc(sizeof(char));
                for(j = 0; j < n; j++)
                {
                        printf("%s\r\n",strcpy(buf,DecToBinTetr(j)));
                        iTetrads[j] = 0;//Обнуляем счётчики тетерад
                }
 
/*              printf("Enter text\r\n:>");
        str = GetInputText(str, sLen, '\n');
                //Добавляем текст нулями текст если строка содержала не кратное 4 число символов
                if((j = sLen % 4) != 0)
                {
                        str = (char *)realloc(str,(sLen + (4 - j))/sizeof(char));
                        for(i = sLen; i < sLen + (4 - j); i++)
                                str[i] = '0';
                        str[sLen + (4 - j)] = '\0';
                }
 
        printf("\tSplit string on tetrads\r\n");
        for(i = 0; i < sLen; i += 4)
                {
                        s = str + i;
                        printf("%c%c%c%c ",s[0],s[1],s[2],s[3]);
                        for(j = 0; j < n; j++)
                        {
                                strcpy(buf,DecToBinTetr(j));
                                //Если нашли тетраду увеличиваем счётчик соответсвующей тетрады на 1-цу
                                if(CompStrTetrada(s, buf))
                                        iTetrads[j] += 1;
                        }
                }
                printf("\r\n\tList of tetrads in text\r\n");
                for(j = 0; j < n; j++)
                {
                        strcpy(buf,DecToBinTetr(j));
                        printf("%s : %d\r\n", buf, iTetrads[j]);
                }*/
        free((void *)str);
        free((void *)iTetrads);
    return 0;
}
 
char * GetInputText(char * str, long &sLen, char ch_end)
{
        if(str != NULL)
    {
                sLen = 0;
        while((str[sLen] = getchar()) != ch_end)
                        str = (char *)realloc(str,(1 + (sLen = sLen + 1))*sizeof(char));
        str[sLen] = '\0';//Убрали мусор вконце
    }
    return str;
}
 
char * DecToBinTetr(long num)
{
        int i = 0;
        char bin[] = "0000";
        do
        {
                bin[i] = '0';
                if(num%2)
                        bin[i] = '1';
                num /= 2;
                i++;
        }
        while(0 < num);
        return &bin[0];
}
 
bool CompStrTetrada(char * str, const char * sTetrada)
{
        bool bRet = false;
        char sCmp[4];
        strncpy(sCmp,str,4);//Копируем 4 первых символа строки str
        if(strcmp(sCmp,sTetrada) == 0)
                bRet = true;
        return bRet;
}
Код
forever@pterois:~/My_pro1$ ./test_cpp 
�
1000
0100
1100
0010
1010
0110
1110
0001
1001
0101
1101
0011
1011
0111
1111
Ошибка сегментирования
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 17:03     Стоит задача сравнение и подсчета символов строки. #16
Цитата Сообщение от ForEveR Посмотреть сообщение
(void*)
- к чему прицеплять void *
Цитата Сообщение от ForEveR Посмотреть сообщение
32568
- внимательно посмотри bin размера какого, цифры нужно передавать до 16-ти!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.09.2011, 17:05     Стоит задача сравнение и подсчета символов строки. #17
-=ЮрА=-, Адрес я выводил. Да с цифрами согласен.
Но говорю то же, что и раньше. Такой возврат некорректен.
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 17:06     Стоит задача сравнение и подсчета символов строки. #18
Цитата Сообщение от ForEveR Посмотреть сообщение
Ошибка сегментирования
- значит твой компилятор отличен от моего, здесь указал среду разработки
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в программе использован компилятор от VS 6.0!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.09.2011, 17:09     Стоит задача сравнение и подсчета символов строки. #19
-=ЮрА=-, Ошибка сегмента шла из-за попытки free(Tetrads)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 17:12     Стоит задача сравнение и подсчета символов строки.
Еще ссылки по теме:

Написать собственный класс для ввода и вывода строки, подсчета количества символов в строке C++
Создать контейнер класса с методами включения и удаления строки, очистки текста, подсчета количества символов C++
C++ Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 17:12     Стоит задача сравнение и подсчета символов строки. #20
ForEveR, это тебе на С++ код

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
#include <iostream>//i/o
#include <conio.h>
using namespace std;
 
char * DecToBinTetr(long num);
 
int main()
{
    char buf[5];
    for(int j = 0; j < 16; j++)
    {
        strcpy(buf,DecToBinTetr(j));
        std::cout<<buf<<"\r\n";
    }
    getch();
    return 0;
}
 
char * DecToBinTetr(long num)
{
    int i = 0;
    char bin[] = "0000";
    do
    {
        bin[i] = '0';
        if(num%2)
            bin[i] = '1';
        num /= 2;
        i++;
    }
    while(0 < num);
    return &bin[0];
}
Изображения
 
Yandex
Объявления
12.09.2011, 17:12     Стоит задача сравнение и подсчета символов строки.
Ответ Создать тему
Опции темы

Текущее время: 14:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru