|
#include <stdio.h> //стандатрный ввод-вывод fopen(), fclose(), fscanf(), fprintf()
#include <stdlib.h> //используем функцию atoi() преобразует массив символов (строку) в целое число {1, 6} --> 16
#include <ctype.h> //используем функцию toupper() преобразует прописные символы в строчные (a --> A; f --> F)
#include <limits.h> //используем константу LONG_MAX = 2147483647
#define BIN 2
#define OCT 8
#define DEC 10
#define HEX 16
void main ()
{
char Source_Num[33] = {0};//массив для хранеия считанного из файла исходного числа в виде строки
char S_Sys_Tmp[3] = {0}; //массив для хранеия считанного из файла системы счисления исходного числа в виде чтроки
char D_Sys_Tmp[3] = {0}; //массив для хранеия считанного из файла новой системы счисления в виде чтроки
char Destin_Num[33] = {0};//массив для хранеия результата числа в новой системе в виде строки
int S_Num_Tmp[32] = {0}; //массив для хранения разрядов исходного числа
int Source_Sys = 0; //значение системы счисления исходного чиста
int Destin_Sys = 0; //значение требуемой системы счисления
int i = 0, j = 0; //переменные для счетчиков
int Len = 0; //переменная для промежуточных вычислений количества разрядов числа
int Decimal = 0; //переменная для вычисления значения числа в десятичной системе
int Sys_Exp = 1; //переменная для вычисления значения степени числа 10
int Max = 0; //переменная для получения максимальной цифры разрядов в исходном числе
//создать указатель на тип ФАЙЛ
FILE *pf = NULL;
pf = fopen("num_sys.txt", "r"); //открыть поток и проверить наличие файла
if(pf==NULL)
{
printf("File not found"); //вывод на экран "ФАЙЛ НЕ НАЙДЕН"
getchar(); //pause
exit(1); //выход из программы
}
else
{
while(!(feof(pf)) && (i<=3)) //считываем последовательно числа до конца файла если набралось необходимое количество входных данных
{
switch (i)
{ //для проверки исходных данных считываем их в строки по одной в каждой итерации
case 0: if((fscanf(pf, "%s", Source_Num))==1) {i++; break;} //значение исходного числа
case 1: if((fscanf(pf, "%s", S_Sys_Tmp)) ==1) {i++; break;} //значение системы счисления исходного числа
case 2: if((fscanf(pf, "%s", D_Sys_Tmp)) ==1) {i++; break;} //системы счисления в которую переводится исходное число
default: i = 4; // недостаточно или много данных
}
}
}
//закрыть поток
fclose(pf);
pf = NULL;
/******************************* ПРОВЕРКА ВХОДНЫХ ДАННЫХ *******************************/
if(i!=3) //проверка количества исходных данных (если НЕ три числа)
{
printf("Reading error.\nWrong data format\nin source file\n");// вывод на экран сообщения об ошибке чтения данных
getchar(); //pause
exit(1); //выход из программы
}
else //--> input data is number проверяем что считанные данные это числа
{
Source_Sys = atoi(S_Sys_Tmp); //преобразуем строку в число
Destin_Sys = atoi(D_Sys_Tmp); //преобразуем строку в число
//проверяем что система счисления исходного числа соответствует от 2 до 16-й системе счисления
//if((Source_Sys!=BIN) && (Source_Sys!=OCT) && (Source_Sys!=DEC) && (Source_Sys!=HEX))
if(Source_Sys<=1 || Source_Sys>HEX)
{
// вывод на экран сообщения об ошибке чтения данных
//printf("Reading error.\nSource system = %d\nIt must be 2, 8, 10 or 16.\n", Source_Sys);
printf("Reading error.\nSource system = %d\nIt must between 2 to 16.\n", Source_Sys);
getchar(); //pause
exit(1); //выход из программы
}
//проверяем что система счисления для преобразования исходного числа соответствует от 2 до 16-й системе счисления
//if((Destin_Sys!=BIN) && (Destin_Sys!=OCT) && (Destin_Sys!=DEC) && (Destin_Sys!=HEX))
if(Destin_Sys<=1 || Destin_Sys>HEX)
{
// вывод на экран сообщения об ошибке чтения данных
// printf("Reading error.\nDestination system = %d\nIt must be 2, 8, 10 or 16.\n", Destin_Sys);
printf("Reading error.\nDestination system = %d\nIt must between 2 to 16.\n", Destin_Sys);
getchar(); //pause
exit(1); //выход из программы
}
//находим количество разрядов исходного числа
i=0;
while(Source_Num[i]!=0)
{
i++; //увеличиваем счетчик на 1 пока не дойдем до символа (\0)
}
Len = i; //значение счетчика есть количество разрядов исходного числа
Max = S_Num_Tmp[0]; //начальные условия для нахождения разряда с наибольшей цифрой
for(i=0; i<Len; i++)
{
//преобразуем прописные символы в строчные
Source_Num[i] = toupper(Source_Num[i]);
//преобразуем строку Source_Num в массив S_Num_Tmp с десятичными числами
if (Source_Num[i] >= 65 && Source_Num[i] <= 70) S_Num_Tmp[i] = Source_Num[i] - 55; //A <= Source_Num[i] >= F
else/* (Source_Num[i] >= 48 && Source_Num[i] <= 57)*/ S_Num_Tmp[i] = Source_Num[i] - 48; //0 <= Source_Num[i] >= 9
//находим наибольшую цифру в разрядах исходного числа
if(Max < S_Num_Tmp[i]) Max = S_Num_Tmp[i];
}
//проверяем что исходное число записано в заявленной системе счисления
if(Max >= Source_Sys) //в числе не может быть цифры (разряда) большей или равной основанию системы или числа больше int
{
printf("Wrong source number"); //введенное исходное число не в той системе счисления
getchar(); //pause
exit(1); //выход из программы
}
} //else --> input data is number
/******************************* ОБРАБОТКА ДАННЫХ *******************************/
//переводим исходное число в 10-ю систему в любом случае
for(i=Len-1; i>=0; i--)
{
Decimal = Decimal + S_Num_Tmp[i] * Sys_Exp; //в первой итерации Decimal = 0; а Sys_Exp = 1 (это основание системы счисления в 0 степени)
Sys_Exp = Sys_Exp * Source_Sys; //в последующих итерациях увеличиваем степень основания системы
//проверка на переполнение при формировании 10-го числа
if (!(Decimal >= 0 && Decimal <= LONG_MAX) || (i < 0 && Sys_Exp == 0)) i = -1;
}
//вывод ошибки переполнения при формировании 10-го числа
if(i < -1)
{
printf("Overflow condition occurred.\n");
getchar(); //pause
exit(1); //выход из программы
}
//если новая система счисления не 10-чная то переводим число в систему с нужным основанием (Destin_Sys)
if(Destin_Sys!=DEC)
{
i=0;
do
{
Destin_Num[i] = Decimal % Destin_Sys; //вычисление остатка от деления
Decimal /= Destin_Sys; //вычисление частного от деления
i++; //параллельно вычисляем количество разрядов числа
}
while(Decimal!=0); //проверка условия деления
Len = i; //значение счетчика - есть количество разрядов искомого числа
for(i=0; i<Len; i++)
{
//преобразуем массив с десятичными числами D_Num_Tmp в строку Destin_Num
if(Destin_Num[i] >= 10 && Destin_Num[i] <= 16) Destin_Num[i] = Destin_Num[i] + 55; //символы от A до F
if(Destin_Num[i] >= 0 && Destin_Num[i] <= 9) Destin_Num[i] = Destin_Num[i] + 48; //символы от 0 до 9
}
} //if(Destin_Sys!=DEC)
/******************************* ПЕЧАТЬ РЕЗУЛЬТАТОВ В ФАЙЛ *******************************/
pf = fopen("num_rez.txt", "w"); //открыть поток и создать файл
fprintf(pf, "%s (%d) --> ", Source_Num, Source_Sys); //вывод исходного числа и системы счисления
if(Destin_Sys==DEC) fprintf(pf, "%d (%d)", Decimal, Destin_Sys); //вывод результата если число десятичное
else{
for(i=Len-1; i>=0; i--)
{
fprintf(pf, "%c", Destin_Num[i]); //вывод результата если число НЕ десятичное
}
fprintf(pf, " (%d)", Destin_Sys); //вывод системы счисления результата
}
fprintf(pf, "\n\n Anatienko Alyona\n====== IC 212 ======"); //вывод персональных данных студента
//закрыть поток
fclose(pf);
pf = NULL;
} //--> main
Дата добавления: 2015-11-04; просмотров: 14 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
http://themoneyconverter.com/Default.aspx | | | Мы прибыли в Амстердам. Был тихий июльский вечер 1948 года. Мне нарочно приходится указывать год, чтобы вы не подумали, что все, мною приведенное, вымысел, но об этом потом. 1 страница |