Десятичные, двоичные и др. ичные формы ряда чисел. Компиляция 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
), чтобы обеспечить правильное форматирование при выводе на консоль
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д