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

Найти ошибки! Если не сложно подскажите) - C++

Восстановить пароль Регистрация
 
qweds
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 21
20.03.2013, 23:56     Найти ошибки! Если не сложно подскажите) #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
#include <stdio.h>
int main(void){
 char с; /* код стану */
 char f; /* ознака помилки */
 char b; /* ознака зайнятості */
 unsigned char n; /* кількість байт */
 unsigned int UnitStateWord; /* слово стану */
  /* введення складових частин */
  printf("Введіть код стану (0 - 31) >");
  scanf("%d",&c);
  printf("Введіть ознаку помилки (0 / 1) >");
  scanf("%d",&f);
  printf("Введіть ознаку зайнятості (0 / 1) >");
  scanf("%d",&b);
  printf("Введіть кількість переданих байт (0 - 255) >");
  scanf("%d",&n);
  /* формування упакованого коду */
  UnitStateWord=((unsigned int)c&0x1F)<<11;
  UnitStateWord|=((unsigned int)f&1)<<9;
  UnitStateWord|=((unsigned int)b&1)<<8;
  UnitStateWord|=n&0xFF;
  /* виведення результату */
  printf("\nСлово стану пристрою = %04x\n"
     UnitStateWord);
  return 0;
}
оно не правильно складывает! Помогите плиз!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.03.2013, 00:01     Найти ошибки! Если не сложно подскажите) #2
ну может проблема в таком коде:
C++
1
2
3
4
5
6
scanf("%d", &c);
//c - имеет тип char, а %d означает, что будет считываться int.
//раз уж у вас везде в конечном счете используется unsigned int, то и переменные все такими же сделайте.
//и для считывания unsigned int нужно использовать %u
unsigned int ui;
scanf("%u", &ui);
вот еще загляните в табличку, там всякие другие флажки помимо %d и %u описаны.
http://www.cplusplus.com/reference/cstdio/scanf/
qweds
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 21
21.03.2013, 00:29  [ТС]     Найти ошибки! Если не сложно подскажите) #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
#include <stdio.h>
int main(void){
 char с; /* код стану */
 char f; /* ознака помилки */
 char b; /* ознака зайнятості */
 unsigned char n; /* кількість байт */
 unsigned int UnitStateWord; /* слово стану */
  /* введення слова стану пристрою */
  printf("Введіть слово стану пристрою \n");
  printf("(16-ричне число від 0 до 0xFFFF) >");
  scanf("%x",&UnitStateWord);
  /* Виділення складових частин */
  c=(UnitStateWord>>11)&0x1F;
  f=(UnitStateWord>>9)&1;
  b=(UnitStateWord>>8)&1;
  n=UnitStateWord&0xFF;
  /* Виведення результатів */
  putchar('\n');
  printf("Код стану                  = %d\n",c);
  printf("Ознака помилки             = %d\n",f);
  printf("Ознака зайнятості          = %d\n",b);
  printf("Кількість переданих байт = %d\n",n);
  return 0;
}

Так вот попробуйте ввести например cb42
у вас выйдут числа 25,1,1,66
А если ввести эти числа в первую программку то не получится код cb42((((
Подскажите кто знает
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.03.2013, 00:36     Найти ошибки! Если не сложно подскажите) #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
#include <stdio.h>
int main(void)
{
    unsigned c; /* код стану */
    unsigned f; /* ознака помилки */
    unsigned b; /* ознака зайнятості */
    unsigned n; /* кількість байт */
    unsigned UnitStateWord; /* слово стану */
    /* введення складових частин */
    printf("Введіть код стану (0 - 31) >");
    scanf("%u",&c);
    printf("Введіть ознаку помилки (0 / 1) >");
    scanf("%u",&f);
    printf("Введіть ознаку зайнятості (0 / 1) >");
    scanf("%u",&b);
    printf("Введіть кількість переданих байт (0 - 255) >");
    scanf("%u",&n);
    /* формування упакованого коду */
    UnitStateWord=((unsigned int)c&0x1F)<<11;
    UnitStateWord|=((unsigned int)f&1)<<9;
    UnitStateWord|=((unsigned int)b&1)<<8;
    UnitStateWord|=n&0xFF;
    /* виведення результату */
    printf("\nСлово стану пристрою = %04x\n", UnitStateWord);
    return 0;
}
qweds
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 21
21.03.2013, 01:24  [ТС]     Найти ошибки! Если не сложно подскажите) #5
Да спс это работает))
А вот тут мож глянуть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <conio.h>
 
int main(void)
{
clrscr();
unsigned int  s, m, h;
unsigned int UnitStateWord;
 
printf ("vvedit`(1-31)> ");
scanf ("%u", &s);
printf ("vvedit` (1-12)> ");
scanf ("%u", &m) ;
printf ("vvedit` (1980-2013)> ");
scanf ("%u", &h);
UnitStateWord=((unsigned int)s&0x1f)<<11;
UnitStateWord|=((unsigned int)m&0xc)<<6;
UnitStateWord|=h&0x7dd;
 
printf ("\n format =%04x\n")<<UnitStateWord;
getche ();
return 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
#include <stdio.h>
#include <conio.h>
 
int main(void)
{
unsigned  s, m, h;
unsigned  UnitStateWord;
clrscr();
printf("format komandy dodavannya v systemi obchyslennya\n > ");
scanf("%x",&UnitStateWord);
 
s=(UnitStateWord>>11)&0x1F;
 
m=(UnitStateWord>>6)&0xC;
 
h=UnitStateWord&0x7DD;
putchar('\n');
printf("dodavanya baytov> %d\n",s);
printf("\nregisr 1 operanda> %d\n",m);
printf("\nregistr 2 operanda> %d\n",h);
 
getche();
return 0;
}
Добавлено через 5 минут
d заменил на u

Добавлено через 14 минут
Плиз гляньте кто-то!!!

Добавлено через 4 минуты
Второе число не получается!!! Выбивает все время 12!!! Помогите!!!
Yandex
Объявления
21.03.2013, 01:24     Найти ошибки! Если не сложно подскажите)
Ответ Создать тему
Опции темы

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