Десятичные, двоичные и др. ичные формы ряда чисел. Компиляция failed - C (СИ)
Формулировка задачи:
Напишите программу, печатающую в файл таблицу, строки которой соответствуют десятичным числам от 1 до 25, а в столбцах эти числа выводятся в десятичной, двоичной, шестнадцатеричной и n-ичной системе (n = (номер варианта %15) + 10, такая система разрабатывается самостоятельно в подпрограмме). Столбцы выровнять по правому краю. Вариант №9.
Ребят, скажите почему не компилируется?
//---------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <mem.h>
//---------------------------------------------------------------------------
// закоментировать следующие и проверить средством библ. функцией перевода
#define use_my_func
//---------------------------------------------------------------------------
void perevod(int nmbDec, char outBuf[], int outBase){
static char tmpBuf[128]={0},*ptrBuf,over9='a';
int tmpVal = 0;
ptrBuf = tmpBuf;
while(1) {
tmpVal = nmbDec%outBase;
*ptrBuf++ = tmpVal<=9 ? tmpVal+0x30 : (over9+(tmpVal-10));
if((nmbDec/=outBase)==0)
break;
}
while(--ptrBuf>=tmpBuf) *outBuf++=*ptrBuf;
*outBuf = 0;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
const int VariantNumber = 9;
const int Nm = VariantNumber%15 +10;
int Pos = 0;
FILE *F;
char FileName[] = "task1.txt";
char D [25][10] = {0};
char B [25][10] = {0};
char H [25][10] = {0};
char X [25][10] = {0};
char Rez[25][42] = {0};
int i;
for(i=0;i<25;i++) {
#ifdef use_my_func
perevod(i+1,D[i],10);
perevod(i+1,B[i], 2);
perevod(i+1,H[i],16);
perevod(i+1,X[i],Nm);
#else
// itoa() - библиотечная функция преобразование в систему изчисления основанием от 2 до 36
itoa(i+1,D[i],10);// DEC
itoa(i+1,B[i], 2);// BIN
itoa(i+1,H[i],16);// HEX
itoa(i+1,X[i],Nm);// XXX
#endif
memset(Rez[i],' ',sizeof(Rez[i]));
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(D[i]);
memcpy(&Rez[i][Pos],D[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(B[i]);
memcpy(&Rez[i][10+Pos],B[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(H[i]);
memcpy(&Rez[i][20+Pos],H[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(X[i]);
memcpy(&Rez[i][30+Pos],X[i],Pos);
int k;
for(k=0;k<40;k++)
if(Rez[i][k]==0)Rez[i][k]=' ';// если 0 - нет данных заполняем пробелами
Rez[i][40]=0xD;// возврат каретки
Rez[i][41]=0xA;// перевод строки
}
if((F=fopen(FileName,"w+b"))!=NULL) {
fwrite(Rez,1,sizeof(Rez),F);
fclose(F);
}
return 0;
}
//---------------------------------------------------------------------------Решение задачи: «Десятичные, двоичные и др. ичные формы ряда чисел. Компиляция failed»
textual
Листинг программы
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main(int argc, char* argv[])
{
int k;//на самый врх его
const int VariantNumber = 9;
const int Nm = VariantNumber%15 +10;
int Pos = 0;
FILE *F;
char FileName[] = "task1.txt";
char D [25][10] = {0};
char B [25][10] = {0};
char H [25][10] = {0};
char X [25][10] = {0};
char Rez[25][1000] = {0};
int i;
for(i=0;i<25;i++)
{
#ifdef use_my_func
perevod(i+1,D[i],10);
perevod(i+1,B[i], 2);
perevod(i+1,H[i],16);
perevod(i+1,X[i],Nm);
#else
// itoa() - библиотечная функция преобразование в систему изчисления основанием от 2 до 36
itoa(i+1,D[i],10);// DEC
itoa(i+1,B[i], 2);// BIN
itoa(i+1,H[i],16);// HEX
itoa(i+1,X[i],Nm);// XXX
#endif
memset(Rez[i],' ',sizeof(Rez[i]));
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(D[i]);
memcpy(&Rez[i][Pos],D[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(B[i]);
memcpy(&Rez[i][10+Pos],B[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(H[i]);
memcpy(&Rez[i][20+Pos],H[i],Pos);
// Вычисляем позицию для записи в массив(выравниваем по правому краю)
Pos=10 - strlen(X[i]);
memcpy(&Rez[i][30+Pos],X[i],Pos);
for(k=0;k<40;k++)//это в матрице делает отступы. Но не выводит её
if(Rez[i][k]==0)Rez[i][k]=' ';// если 0 - нет данных заполняем пробелами
Rez[i][40]=0xD;// возврат каретки
Rez[i][41]=0xA;// перевод строки
}
for(i=0;i<25;i++)//вот это выводит.
puts(Rez[i]);
if((F=fopen(FileName,"w+b"))!=NULL) //Это записывает в файл. Но не выводит на консоль. Так что небыло кода для вывода на консоль
{
fwrite(Rez,1,sizeof(Rez),F);
fclose(F);
}
return 0;
}
Объяснение кода листинга программы
- Включающие файлы:
-
: библиотека для работы с консолью -
: библиотека для ввода/вывода данных -
: библиотека для работы с математикой и преобразования типов данных -
: библиотека для математических функций -
: библиотека для работы со строками
-
- Константы и переменные:
VariantNumber: целочисленная константа, значение которой равно 9Nm: переменная, вычисляющая размер основания системы счисления, исходя из значенияVariantNumber(основание системы счисления не более 15, иначе будет ошибка переполнения)Pos: переменная для хранения позиции выравнивания (смещения) для записи в массивF: указатель на файл для записиFileName[]: строка, содержащая имя файла для записиD[i],B[i],H[i],X[i]: массивы символов для хранения десятичного, двоичного, шестнадцатеричного и пользовательского представления чисел соответственноRez[i][k]: элемент массиваRez[i], который содержит символ, заполняющий пробел, если данные отсутствуют
- Функции и процедуры:
perevod(): пользовательская функция для преобразования числа в систему счисления, определенная в коде (см. комментарии)itoa(): библиотечная функция для преобразования целого числа в строку в системе счисления основанием от 2 до 36fopen(): библиотеная функция для открытия файлаfwrite(): библиотеная функция для записи данных в файлfclose(): библиотеная функция для закрытия файла
- Циклы и условные операторы:
- Внешний цикл
for(i=0;i<25;i++): используется для обработки каждого числа от 1 до 25 - Внутренний цикл
for(k=0;k<40;k++): используется для добавления пробелов в массивRez[i] - Условный оператор
if(Rez[i][k]==0)Rez[i][k]=' ': если элемент массиваRez[i][k]равен 0 (нет данных), он заменяется пробелом - Условный оператор
if((F=fopen(FileName,w+b))!=NULL): если файлFileNameможет быть открыт для записи, выполняется блок кода, который записывает данные в файл и закрывает его
- Внешний цикл
- Операции ввода/вывода:
puts(): библиотечная функция для вывода строки на консольfwrite(): библиотеная функция для записи данных в файл
- Операции работы с памятью:
memset(): библиотечная функция для заполнения области памяти заданным значениемmemcpy(): библиотечная функция для копирования данных из одной области памяти в другую
- Операции работы с символами:
strlen(): библиотечная функция для определения длины строкиmemcpy(): библиотечная функция для копирования данных из одной строки в другуюRez[i][40]=0xD;Rez[i][41]=0xA;: в конце каждой строки в массивеRez[i]добавляется символ возврата каретки (0xD) и символ перевода строки (0xA), чтобы обеспечить правильное форматирование при выводе на консоль