Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

#include <stdio.h> //стандатрный ввод-вывод fopen(), fclose(), fscanf(), fprintf()



#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 страница

mybiblioteka.su - 2015-2024 год. (0.014 сек.)