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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
#1

Преобразовать string в последовательность чисел - C++

24.06.2010, 11:53. Просмотров 2255. Ответов 40
Метки нет (Все метки)

Помогите, пожалуйста, понять свои ошибки.. не могу правильно написать аргументы функций... и вообще наверное проблема в самих функциях... задача такая: у меня есть стринг(набор 1 и 0)= TMS_IR.. мне нужно преобразовать его в последовательность чисел..типа двоичный код..и на определенном этапе "включить" следующий сигнал - заданный символьной строкой... и затем вывести это все на экран... причем запуск программы должен быть только после ввода команды "idcode" ..
буду очень благодарна за комментарии в программе...
и еще... где правильнее поставить определение переменных и почему?
теории начиталась.. а практики 0..


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
char  comand,
      instruction[7],
      TMS_IR[]="1111101100000000",  
      IDCode[]= "01001";
int  i=0,
     n=0,    
     k=0,
     TMS,
     TDI,
       c;   
 
int  TMSf(char TMS_IR[]);
int  Instr();
                        
int TMSf(char ,int )
 
{
 
//int  c=0;
    
          for (i=0; i< 17;i++)
           {if (TMS_IR[i] == '1')
              TMS = 1;
            if (TMS_IR[i] == '0')
             TMS = 0;
           else TMS = 0;
            }
           printf("%i ", TMS);
           return TMS;
}                                  
 
 
 
 
int Instr(void)
{  
 
 
    for (i=11; i<17;i++)
             for (k=0; k< 6;k++)                     
             if (IDCode[k] == '1')
                 TDI = 1;
             else TDI = 0;
                     
             
             return TDI;
}
 
 
 
                                    
 
int main()
{
 
cout <<"vvedite instruction  " ;
cin >> instruction;                                     
 
comand = strcmp(instruction,"idcode");
//printf("%s  ",comand);
                       
 if (comand == 0)               
 
  {  TMSf(int i, char TMS_IR);
   Instr(int i, int k, char IDCode[]);
  
 }
 
 
//  {while (!TDI)}
else printf("Nevernaja komanda  "); 
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2010, 11:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать string в последовательность чисел (C++):

Преобразовать последовательность из n вещественных чисел a1, ..., an. - C++
Ребят подкиньте идей. Дана последовательность из n вещественных чисел a1, ..., an. Преобразовать ее по следующему правилу: а)...

Преобразовать последовательность чисел так, чтобы сначала были нули, а потом все остальные. - C++
Тема лабораторной работы: Работа с одномерными массивами. Задание: Преобразовать последовательность чисел так, чтобы сначала были нули, а...

Как преобразовать char* в string и вывести переменную string на экран? - C++
for (int k = 0; k &lt; 10; k++) { int x = (int)rand() / RAND_MAX + rand() % 6 + 2; char *chars = new char; ...

Преобразовать литерную последовательность в другую литерную последовательность всеми описанными ниже способами - C++
Здравствуйте, уже несколько дней мучаюсь над такой задачей : &quot;Имеется литерная последовательность, состоящая из не более чем 30 ...

Преобразовать латинский текст string в русский текст string - C++
Пишу приложение, которое мне будет отправлять в твиттер нужные сообщения. Встретился со следующей головоломкой (сразу хочу сказать, что...

Преобразовать string в TCHAR - C++
Подскажите пожалуйста в чем ошибка. Нужно преобразовать string -&gt; TCHAR взял из поста string to TCHAR выдает ошибку d:\program...

40
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
26.06.2010, 15:28 #16
Цитата Сообщение от Jlu Посмотреть сообщение
а можно чуточку по-подробнее о создании отдельных потоков?
это можно сделать при помощи параллельного программирования, а именно средств OpenMP, MPI. Если интересно почитайте здесь http://www.cyberforum.ru/cpp-linux/thread138338.html
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
26.06.2010, 15:40  [ТС] #17
спасибо, постараюсь разобраться
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.06.2010, 08:31 #18
C
1
printf("Nevernaja komanda  ");
функция printf(), происходит вызов этой функции, в функцию передаётся один аргумент
так как строки целиком не передаются, то функция получает в качестве аргумента просто адрес первого символа строки "Nevernaja komanda ", конец строки функция определит по нуль-символу в конце строки, все строки, даже "", содержат нуль-символ '\0'
строковые литералы располагаются в неменяемой области памяти, то есть их можно читать, но нельзя редактировать

C
1
comand = strcmp(instruction,"idcode");
функция strcmp(), вызывается функция, в неё передаётся два аргумента, instruction - это символьный массив, значит он будет преобразован в адрес первого элемента массива, первого символа, "idcode" - тоже символьный массив и строковой литерал, имени у него нет, но при передаче он будет преобразован в адрес первого символа
функция возвращает значение типа int, которое сразу присваивается переменной command

printf() тоже возвращает значение типа int, количество выведенных символов, его можно проверять, она может вернуть отрицательное значение при ошибке вывода
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
30.06.2010, 11:29  [ТС] #19
подскажите еще ,пожалуйста, у мя есть 3 массива одномерных, как мне из них сделать 1 многомерный?????
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.07.2010, 02:31 #20
надо сделать многомерный массив и скопировать в него одномерные массивы
копировать можно через циклы (более точное копирование, более гибкое)
копировать можно через memcpy() (это копирование блоками, подключить <string.h> - для C или <cstring> - для C++ )
0
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
01.07.2010, 10:30  [ТС] #21
вот так можно сделать??

C++
1
2
3
4
5
6
 for (j=0;j<60;j++)
        mascom[1][j]= arrtck[i];
        mascom[2][j]= arr[i];
        mascom[3][j]= arrtdi[i];
 
  cout << mascom[i][j] << "\t" << endl;
только хотелось бы,чтобы выводилось 3 строками.а выводится одним столбцом.. как это исправить?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.07.2010, 10:54 #22
C++
1
2
3
4
5
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 60; j++)
            cout << (j > 0  ? " " : "") << mascom[i][j];
        cout << endl;
    }
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
01.07.2010, 11:42  [ТС] #23
все выводится в один столбец и в конце файла какие-то отрицательные числа..как от них избавиться и вывести это все 3мя строками?

Добавлено через 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
int TCKf(char tcki[], int tck)
{       
        int arrsizetck,arrtck[100];
        int i,c;
 
        for (i = 0; (c = tcki[i]) != '\0'; i++)
             //   for (k=0; k< 6;k++)
                       
        {
        /* printf("%c" "\n", c); */
        arrtck[i] = (c == '0') ? 0 : 1;
       // printf("%d" "\t", arr[i]);
        cout << arrtck[i] << "\t" << endl;
        }
 
    arrsizetck = i;
        return tck;
}
 
 
 
                                                         
int Instr(char idcode[], int TDI)
{       
        int arrsizeId,arrtdi[100];
        int i,c;
 
        for (i = 0; (c = idcode[i]) != '\0'; i++)
             //   for (k=0; k< 6;k++)
                       
        {
        /* printf("%c" "\n", c); */
        arrtdi[i] = (c == '0') ? 0 : 1;
       // printf("%d" "\t", arr[i]);
        cout << arrtdi[i] << "\t" << endl;
        }
 
    arrsizeId = i;
        return TDI;
}
 
                                                        
int TMSir(char tms_ir[], int TMS) 
{       
        
        int arrsize,arr[100];
        int i,c;
        for (i = 0; (c = tms_ir[i]) != '\0'; i++)
        {
        /* printf("%c" "\n", c); */
        arr[i] = (c == '0') ? 0 : 1;
       // printf("%d" "\t", arr[i]);
        cout << arr[i] << " " << endl;
        }
 
    arrsize = i;
 
       // 
        return TMS;
}
                                                       
 
int main()
{
        char  comand, instruction[7];
        //char TMS_IR[]="1111101100000000";
       // char idcode[]= "01001";
        int  i, n, k, TMS, TDI,TMSi,tck,TCK, c, mascom[3][55],j;  //TMSid,
        i = j = n = k = TMS = TDI = TMSi = TCK = 0;//=TMSid
        char tms_ir[] = "11111011000000011000000000000000000000000000000000111110100",
               tcki[] = "01010101010101010101010101010101010101010101010101010101010";
        char idcode[] = "00000000000100100000000000000000000000000000000000000000000";
        int arrtck[100],arr[100],arrtdi[100] ;
        
 
 
        cout <<"vvedite instruction  ";
        cin >> instruction;
        comand = strcmp(instruction,"idcode");
        if (comand == 0)
        {
            TMS = TMSir(tms_ir, TMS);
                         TDI = Instr(idcode, TDI);
             TCK = TCKf(tcki, tck);
          
                mascom[1][j]= arrtck[i];
                        mascom[2][j]= arr[i];
                    mascom[3][j]= arrtdi[i];
 
        for (i = 0; i < 3; i++) {
                       for (j = 0; j < 60; j++)
                      cout << (j > 0  ? " " : "") << mascom[i][j];
                      cout << endl;}
 
             
        }
 
        else 
                cout << "Nevernaja komanda\n"; 
        return 0;
}
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.07.2010, 03:26 #24
C++
1
2
3
4
5
    for (j = 0; j < 60; j++) {
        mascom[1][j]= arrtck[i];
        mascom[2][j]= arr[i];
        mascom[3][j]= arrtdi[i];
    }
в редакторе должна быть опция "пробелы вместо табуляции"
табуляцию нужно переделать в четыре пробела (чтобы хорошо видно было, где какой блок, и чтобы при глубокой вложенности не было переносов кода)

отрицательные числа - это так называемый "мусор", случайные данные
так как массивы созданы, но в них ничего не записано ни разу, там находится мусор

пример преобразования
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXINTARRAY  100
 
int TranslateBin(int [], const char *, int);
int PrintArr(const int *, int);
 
/* двоичное число в строковом виде
   переводит в целочисленный массив
   выводит содержимое массива
   после преобразования  */
int main(void) /* ANSI C89 */
{
    char number[] = "0101110101110001110";
    int arr[MAXINTARRAY];
    
    
    TranslateBin(arr, number, 7);
    
    PrintArr(arr, 7);
    
    
    TranslateBin(arr, number, strlen(number));
    
    PrintArr(arr, strlen(number));
    
    
    return EXIT_SUCCESS;
}
 
int TranslateBin(int n[], const char *s, int maxsize)
{
    int c, i;
 
    for (i = 0; (c = s[i]) != '\0' && i < maxsize; i++)
        n[i] = (c == '1') ? 1 : 0;
 
    return 0;
}
 
int PrintArr(const int *n, int size)
{
    while (size-- > 0)
        printf(" %d", *n++);
        
    putchar('\n');    
    
    return 0;
}
Код
[guest@station src]$ ./test
 0 1 0 1 1 1 0
 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 1 0
[guest@station src]$
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
06.07.2010, 15:00  [ТС] #25
а можно пример немного прокомментировать.. а то что-то ваще разобраться не могу...
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.07.2010, 02:50 #26
TranslateBin() - преобразует символьный массив из нулей и едениц в целочисленный массив из нулей и едениц, она копирует

C
1
2
    char number[] = "0101110101110001110";
    int arr[MAXINTARRAY];
делаем символьный массив из нулей и едениц
заготавливаем целочисленный массив, ничем не заполненный (garbage)

C
1
TranslateBin(arr, number, 7);
в массив arr из массива number копируем семь цифр (0101110)

C
1
TranslateBin(arr, number, strlen(number));
в массив arr из массива number копируем все цифры (0101110101110001110)

0101110101110001110 - это все цифры
хотим, например, скопировать не сначала и не до конца
вот 01011 1010111 0001110, второй кусок
делаем такой вызов

C
1
TranslateBin(arr, number+5, 7);
после этого в arr первые семь элементов будут равны 1 0 1 0 1 1 1

то есть мы преобразовали символы '0', '1' в цифры 0, 1
сами коды символов '0', '1', 'a', 'b' и так далее равны числам, которые совсем с ними не совпадают, какая таблица символов принята в системе, через ту они и будут вычисляться

Код
[guest@station ~]$ echo $'\x32'
2
[guest@station ~]$ echo $'\x31'
1
[guest@station ~]$ echo $'\x30'
0
[guest@station ~]$ echo $'\x40'
@
[guest@station ~]$
код нуля в ASCII равен 0x30 - это 48 в десятичной системе
поэтому, если сделать int n = '0'; , в n запишется не ноль, а 48

массив символов может содержать не только нули и еденицы, поэтому функцию TranslateBin() нужно дорабатывать, чтобы встретив не ноль и не еденицу, она возвращала -1
но это не горит
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
14.07.2010, 15:33  [ТС] #27
подскажите, пожалуйста, как строку преобразовать в набор цифр и из них выбрать только какой-то определенный интервал.. у меня получается какой-то бред..

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
int Instr(char idcode[], int TDI)
{       
    int arrsizeId,arrtdi[500],arrtdo[500], id[64];
        int i,c,k,j=0;
 
        for (i = 0; (c = idcode[i]) != '\0'; i++)
        {
            arrtdi[i] = (c == '0') ? 0 : 1;
               //arrtdo[0]= 0;
                printf("%d", arrtdi[i]);
        }
                printf("\n");
        printf("\n");
 
                      for (i = 0; (c = idcode[i]) != '\0'; i++)
              {
                  arrtdo[0]= 0;
                      arrtdo[i+1] = arrtdi[i];
                      printf("%d", arrtdo[i]);
                  }
                 printf("\n");
         printf("\n");
 
               for (k=0;k<64; k++)  
        {   for (i=(c = idcode[47]); i<(c = idcode[111]);i++);
                 
                id[k]=idcode[i];
                    printf("%d ", id[k]);
                     
                  }
        arrsizeId = i;
        return TDI;
}
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
14.07.2010, 18:23 #28
Есть функция atoi. Она переводит строку в целое число, например:
C++
1
2
int a = atoi("123");
cout << a << endl;
Добавлено через 11 минут
Если каждый символ строки - отдельное число, то можно просто от кода символа отнимать 48, например так:
C++
1
2
3
4
5
6
7
8
9
const int n = 5;
int a [n];
int i;
char s [n] = {'1', '2', '3', '4', '5'};
for (i = 0; i < n; i++)
    a [i] = s [i] - 48;
for (i = 0; i < n; i++)
    cout << a [i] << " ";
cout << endl;
1
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.07.2010, 02:29 #29
Цитата Сообщение от Jlu
как строку преобразовать в набор цифр и из них выбрать только какой-то определенный интервал
сначала надо преобразовать
а потом из преобразованного выбрать интервал

это две разные функции, одна здесь есть уже
C
1
int TranslateBin(int n[], const char *s, int maxsize)
а выбрать можно стандартной
копирование подмассива
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define STARTELEM  3
#define ENDELEM    5
 
 
int PrintArr(const int *, int);
 
 
int main(void) /* ANSI C89 */
{
    int n[10] = {
        1, 2, 3, 4, 5, 6, 7, 8, 9, 0
    };
    int sub[3];
    
    
    memcpy(
        sub,
        n + STARTELEM - 1,
        (ENDELEM - STARTELEM + 1) * sizeof(int)
    );
    
    
    PrintArr(n, 10);
    
    PrintArr(sub, 3);
    
    return EXIT_SUCCESS;
}
 
int PrintArr(const int *n, int size)
{
    while (size-- > 0)
        printf(" %d", *n++);
        
    putchar('\n');    
    
    return 0;
}
Код
[guest@station src]$ ./test
 1 2 3 4 5 6 7 8 9 0
 3 4 5
[guest@station src]$
1
Jlu
0 / 0 / 0
Регистрация: 19.05.2010
Сообщений: 30
15.07.2010, 14:05  [ТС] #30
Accept, а можно тоже самое, только на моем примере??

Добавлено через 2 часа 55 минут
вроде разобралась, спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2010, 14:05
Привет! Вот еще темы с ответами:

Преобразовать int в string - C++
Как перевести переменную int в string?

Преобразовать string в wchar_t - C++
Подскажите как переобразовать string в wchar вот код wchar_t buffer; string s2 = &quot;10 20 30 40 50&quot;; swprintf(buffer, L&quot;%f\0&quot;,s2) ...

Преобразовать string^ в double - C++
Есть старая программа на c++, написанная в среде MS VS2010 с использование WinForm, и, как следствие .Net Появилась проблема с...

Преобразовать из float в string - C++
Скажите, пжл, какие существуют ф-ии для конвертации из float в string?


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
15.07.2010, 14:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru