File lab72 cpp Author smacker Created on 12 Апрель 2009 16 50 include

  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
104
105
106
107
/*
* File: lab72.cpp
* Author: smacker
*
* Created on 12 Апрель 2009 г., 16:50
*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
using namespace std;
// Всё можно сделать гораздо проще используя itoa(), но это не стандартная функция
// правда она присутствует в большинстве компиляторов, так что всё работало бы
// но это НЕ ПРАВОСЛАВНО! Поэтому извращаемся и трахаем себе мозг)))
int int_to_str(char *buffer, int value)
{
int n;
n = sprintf(buffer, "%d", value); // делаем строку
buffer[n] = '\0'; // и добавляем null в конец
return n; // возвращаем колличество символов в строке
}
int from2to10(char* str, int lenght)
{
int result = 0;
int j = lenght;
for(int i = 0; i<lenght; i++)
{
j -= 1; // (int)(str-'0') превращает символ в число
result += (int)(str[i]-'0')*pow(2, j); // ну и умножаем на 2 в степени j
}
return result;
}
int from2to10(int value)
{
char str[256];
int lenght = int_to_str(str, value);
return from2to10(str, lenght);
}
void reverse(char *array, int size)
{
char temp;
for (int i = 0; i < size/2; i++)
{
if ((size % 2 == 0) || (size/2 != i))
{
temp = array[i];
array[i] = array[size-i-1];
array[size-i-1] = temp;
}
}
}
int from10to3(int value)
{
int result = 0;
int rest = value;
char str[256];
int i = 0;
while (value > 3)
{
rest = value % 3;
value = value/3;
str[i] = '0' + rest; // преобразуем из числа в символ
i += 1;
}
if (value != 0){
str[i] = '0' + value;
i += 1;
}
reverse(str, i);
str[i] = '\0';
return atoi(str); // возвращаем рещультат функции строки в число
}
int from10to3(char* svalue)
{
int value = atoi(svalue);
return from10to3(value);
}
int convert(int numargs, ...) // первый аргумент число = колличество аргументов
{ // ... означает что может быть сколько угодно аргументов
int i;
va_list list1; // создаём список значение-аргумент
va_start(list1, numargs); // юзаем стартовый макрос
for (int j=0; j<numargs; j++)
{
i = va_arg(list1, int); // достаём аргумент
printf("%d(2)=%d(3)\n", i, from10to3(from2to10(i))); // конвертируем и отображаем
}
va_end(list1);
}
int main(int argc, char** argv) {
convert(3, 101100, 10, 111);
convert(6, 1001, 101, 1, 11001, 11111110, 100000001);
convert(7, 1001001, 1110, 1011, 110011, 110, 11, 101010101);
return (EXIT_SUCCESS);
}