Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Массивы, и шестнадцатеричное представление чисел 
:(
    Опции темы
Павлуха
Дата 12.11.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Как сделать, чтобы массиву присваивались значение в 16-й системе счисления???? 
PM MAIL   Вверх
urush
Дата 13.11.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.7.2006
Где: Ukraine

Репутация: нет
Всего: нет



 smile 
Уточни пожалуйста:
- Массив должен быть символьный?
- А значение в 16-й системе ты вводишь из клави или есть другой источник?
PM MAIL   Вверх
Kuvaldis
Дата 13.11.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



Павлуха, 
пусть дан массив

Код

int a[10];
int  num;

scanf("%x", &num);   // вводишь число в таком виде : А 
a[0] = num;
scanf("%i", &num);   // вводишь число в таком виде : 0xA 
a[1] = num;
a[2] = 0x14;


Это сообщение отредактировал(а) Kuvaldis - 13.11.2006, 01:44


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Павлуха
Дата 13.11.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Цитата(urush @ 13.11.2006,  00:07)
smile 
Уточни пожалуйста:
- Массив должен быть символьный?
- А значение в 16-й системе ты вводишь из клави или есть другой источник?

Короче дан массив с обычными цифрами, и надо элементы первого массива записать соответственно в второй масси но в 16-й системе...........
PM MAIL   Вверх
Kuvaldis
Дата 13.11.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



Павлуха, 
Цитата

адо элементы первого массива записать соответственно в второй масси но в 16-й системе

Второй массив - какой?


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Павлуха
Дата 13.11.2006, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



короче вот задача.......Введите массив чисел. Реализуйте функцию, которая во второй массив записывает все числа первого массива в шестнадцатеричном изображении которых младшая цифра пять. Элементами массива могут быть или корот-кие, или длинные целые числа. Выведите на экран элементы массивов в шестнадцатеричной системе счисления.
PM MAIL   Вверх
Dray
Дата 13.11.2006, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: нет
Всего: 6



Павлуха, в любом случае с точки зрения компьютера они хранятся в двоичной системе счисления в любом массиве. По-этому нельзя заставить программу хранить в целочисленном массиве числа в какой-либо определенной системе счисления.  Если число переводить в текст, то там есть возможность представлять его в определенной системе.
Код

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 12;

    char *b = new char[10];
    b = itoa(a, b, 16);

    std::cout << b << std::endl;

    delete[] b;

    return 0;
}


Это сообщение отредактировал(а) Dray - 13.11.2006, 01:56


--------------------
忍者

user posted image
PM MAIL   Вверх
Kuvaldis
Дата 13.11.2006, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



Павлуха, 
Цитата

 Реализуйте функцию, которая во второй массив записывает все числа первого массива в шестнадцатеричном изображении которых младшая цифра пять.

Проверка очень простая: рассматриваешь остаток от деления числа в 10 системе счисления на 16. Если он равен 5, то это как раз и есть нужное тебе число. Записываешь его в массив.
При выводе в 16 с/с можно воспользоваться функцией printf() таким образом
 
Код

printf("%x",num);   // выодишь число в таком виде : А    
a[0] = num;    
printf("%i", num);   // выводишь число в таком виде : 0xA 



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
anwe
Дата 13.11.2006, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Павлуха, смотри.
Число десятичной системы делишь на 16. Получаешь частное и остаток. Остаток сравниваешь с таблицей ABCDEF на предмет, если больше 9 то соответственно это будут числа A, B, C, D, E или F. Частное снова делишь на 16 и опять остаток сравниваешь с таблицей.
Организовываешь все это дело с помощью рекурсии.
Остатки и будут результатом. А записываешь результат с конца, то есть самый первый остаток будет самым левым знаком результата, а последним знаком - последний остаток.
Пример:
15732:16=983 остаток 4
983:16=61 остаток 7
61:16=3 остаток 13, после сравнения с таблицей это будет D
3:16=0 остаток 3.
Получишь 3D74.
А уж дальше отбираешь как хочешь.
В сях я не силен, поэтому синтаксис кодировки наберешь, думаю, сам.

Kuvaldis,
Цитата
Проверка очень простая: рассматриваешь остаток от деления числа в 10 системе счисления на 16. Если он равен 5, то это как раз и есть нужное тебе число.

посмотри задание повнимательнее:
Цитата
...в шестнадцатеричном изображении которых младшая цифра пять

Сначала все цифры надо перевести 16-ричные, а после анализировать на то, какая последняя цифра уже у 16-ричных есть 5 и те заносить в новый массив.

Это сообщение отредактировал(а) anwe - 13.11.2006, 02:05
PM MAIL   Вверх
Kuvaldis
Дата 13.11.2006, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



anwe, 
Цитата

посмотри задание повнимательнее:

я внимательно посмотрел и теперь буду тебе доказывать, что я прав
итак,
теорема:
Код

Проверка очень простая: рассматриваешь остаток от деления числа 
в 10 системе счисления на 16. Если он равен 5, то это как раз и есть нужное тебе число.

Доказательство
1. Для начала немного эмпирического опыта (на твоем примере)
15732 в 10 с/с = 3D74 в 16 с/с
Возьмем остаток от деления 15732 % 16 = 4  (1)
Случайно ли это? нет
что значит запись (1)?
а то, что 15732 = 16 * N + 4, где N - какое-то натуральное число
ясно, что 16 * N >= 16
теперь вспомним разложение числа в 16 с/с
А = В0 + 16^1 * B1 + 16^2 * B2 + ... 16^n * Bn
16^1 * B1 + 16^2 * B2 + ... 16^n * Bn - эти слагаемые больше 16, 
Теперь возьми остаток от деления левой и правой части.
т.е. a % 16 = B0 (остальные слагаемые делятся, у них есть 16 в степени)

Теорема доказана.

Добавлено @ 02:17 
anwe, 
Цитата

Пример:
15732:16=983 остаток 4
....
Получишь 3D74.

 smile Ты сам на первом действии получил, что и было нужно. 
А больше и не требуется smile 

Это сообщение отредактировал(а) Kuvaldis - 13.11.2006, 02:14


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
archimed7592
Дата 13.11.2006, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(anwe @  13.11.2006,  03:04 Найти цитируемый пост)
посмотри задание повнимательнее:
вот я к примеру смотрю и не вижу там слов, что нужно сначала переводить в шестнадцатиречный вид  smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
urush
Дата 13.11.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.7.2006
Где: Ukraine

Репутация: нет
Всего: нет



Задачу я понял так:
- есть массив с целыми элементами;
- нужно записать в другой массив элемент из первого массива, если его младшее число, при переводи элемента из первого массива в 16 с\с, ровное 5;
Например есть числа 37 и 2  в десятичной с\с, то поскольку числу 37 в шестнадцатиричной с\с отвечает 0х25 (25), а числу 2 - 0х2 (2), то первое (37 - 0х25) я должен записать во второй массив а числом 2 - 0х2 - пренебречь.


Код

//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
#include <iostream>
#include <conio>
#include <stdlib>
#include <string>

using std::cout;
using std::cin;
using std::endl;

int main()
{
 int a[5] = {37,2,21,4,5};   // Массив с элементами, которые нужно перевести в 16с\с

 char *mas[5];    //Массив указателей на элементы в 16с\с

 int n=0;         //счетчик, который показывает сколько элементов из массива a[] не имеют числа 5 в    наименьшем разряде при переводи в 16с\ с

 for(int i=0; i<5; i++)
 {
 char *buf = new char[9];  //Буфер для хранения 16-го числа после переводу в функции itoa()
  itoa(a[i],buf,16);       //Запись числа в 16 с\с

//  strlen(buf)     Определяю сколько байт содержит переведенное число в 16 с\с

 if(atoi(buf + strlen(buf) -1) == 5)      //Если последний разряд 16-го числа 5, то записываю его в массив указателей
    mas[i-n] = buf;
 else
   {
     n++;
     delete[] buf;
     buf = NULL;
   }
 }// end_of  for(int i=0; i<5; i++)
 for(int i=0; i<5-n; i++)   // вывожу на экран все переведены в 16 с\ с элементы массива a[]
 {
  cout << "mas[" << i << "]: ox" << mas[i] << endl << endl;
  delete[] mas[i];
  mas[i]= NULL;
 }
        getch();
        return 0;
}
//---------------------------------------------------------------------------




Это сообщение отредактировал(а) urush - 14.11.2006, 08:43
PM MAIL   Вверх
archimed7592
Дата 14.11.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(urush @  13.11.2006,  21:12 Найти цитируемый пост)
 char *buf = new char[9];  //Буфер для хранения 16-го числа после переводу в функции itoa()  itoa(a[i],buf,16);       //Запись числа в 16 с\с//  strlen(buf)     Определяю сколько байт содержит переведенное число в 16 с\с if(atoi(buf + strlen(buf) -1) == 5)
все вот это можешь заменить одной строкой. поверь, работать будет так же
Код
if (a [i] % 16 == 5)


Добавлено @ 02:40 
и ещё, зачем хранить строковые представления? тебе ж сказано "которая записывает во второй массив все числа первого...", а не "все строковые представления элементов первого"...тем более, что ты не удаляешь созданные тобой массивы.
короче говоря, нужно так:
Код
int main()
{
 int a[5] = {37,2,21,4,5};   // Массив с элементами, которые нужно перевести в 16с\с

 int mas[5];    //Массив элементов, младшая цифра которых в 16-ом представлении 5 на элементы в 16с\с

 int n=0;         //счетчик, который показывает сколько элементов в массиве mas

 for(int i=0; i<5; i++)
 {
if (a [i] % 16 == 5)     //Если последний разряд 16-го числа 5, то записываю его в массив
    mas[n++] = buf;
 }
 for(int i=0; i < n; i++)   // вывожу на экран все переведены в 16 с\ с элементы массива a[]
{
  char buf [10];
  itoa(mas[i],buf,16)
  cout << "mas[" << i << "]: ox" << buf << endl << endl;
};

        getch();
        return 0;
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
urush
  Дата 14.11.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.7.2006
Где: Ukraine

Репутация: нет
Всего: нет



Я же сказал:

Цитата(urush @ 13.11.2006,  20:12)
Задачу я понял так:
- есть массив с целыми элементами;
- нужно записать в другой массив элемент из первого массива, если его младшее число, при переводи элемента из первого массива в 16 с\с, ровное 5;
Например есть числа 37 и 2  в десятичной с\с, то поскольку числу 37 в шестнадцатиричной с\с отвечает 0х25 (25), а числу 2 - 0х2 (2), то первое (37 - 0х25) я должен записать во второй массив а числом 2 - 0х2 - пренебречь.


А на счет удаления элементов из динамичной области памяти то нужно сделать следующее:

else
  {  
   n++;
   delete[] buf;
   buf = NULL;
  }

а при выводе записать следующее:

for(int i=0; i<5-n; i++)   // вывожу на экран все переведены в 16 с\ с элементы массива a[]
 {
  cout << "mas[" << i << "]: ox" << mas[i] << endl << endl;
  delete[] mas[i];
  mas[i]= NULL;
 }

Сечас внесу все изменения в предыдущий пост.

P.S.

archimed7592, Как мне кажется проблема заключается в том, что задача сформулирована не корректно, в подтверждение моих слов обрати внимание на то, что каждый из нас формулирует ее по своему, а все из-за того, что в условии нет ни одной запятой, которая расставила бы все точки над "і"  smile 



Это сообщение отредактировал(а) urush - 14.11.2006, 08:40
PM MAIL   Вверх
Rover
Дата 15.11.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



А можно вообще в char перевести всё что нужно, а потом на выходе обрабатывать  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.