Десятичные, двоичные и др. ичные формы ряда чисел. Компиляция 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;
}

Объяснение кода листинга программы

  1. Включающие файлы:
    • : библиотека для работы с консолью
    • : библиотека для ввода/вывода данных
    • : библиотека для работы с математикой и преобразования типов данных
    • : библиотека для математических функций
    • : библиотека для работы со строками
  2. Константы и переменные:
    • VariantNumber: целочисленная константа, значение которой равно 9
    • Nm: переменная, вычисляющая размер основания системы счисления, исходя из значения VariantNumber (основание системы счисления не более 15, иначе будет ошибка переполнения)
    • Pos: переменная для хранения позиции выравнивания (смещения) для записи в массив
    • F: указатель на файл для записи
    • FileName[]: строка, содержащая имя файла для записи
    • D[i], B[i], H[i], X[i]: массивы символов для хранения десятичного, двоичного, шестнадцатеричного и пользовательского представления чисел соответственно
    • Rez[i][k]: элемент массива Rez[i], который содержит символ, заполняющий пробел, если данные отсутствуют
  3. Функции и процедуры:
    • perevod(): пользовательская функция для преобразования числа в систему счисления, определенная в коде (см. комментарии)
    • itoa(): библиотечная функция для преобразования целого числа в строку в системе счисления основанием от 2 до 36
    • fopen(): библиотеная функция для открытия файла
    • fwrite(): библиотеная функция для записи данных в файл
    • fclose(): библиотеная функция для закрытия файла
  4. Циклы и условные операторы:
    • Внешний цикл 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 может быть открыт для записи, выполняется блок кода, который записывает данные в файл и закрывает его
  5. Операции ввода/вывода:
    • puts(): библиотечная функция для вывода строки на консоль
    • fwrite(): библиотеная функция для записи данных в файл
  6. Операции работы с памятью:
    • memset(): библиотечная функция для заполнения области памяти заданным значением
    • memcpy(): библиотечная функция для копирования данных из одной области памяти в другую
  7. Операции работы с символами:
    • strlen(): библиотечная функция для определения длины строки
    • memcpy(): библиотечная функция для копирования данных из одной строки в другую
    • Rez[i][40]=0xD;Rez[i][41]=0xA;: в конце каждой строки в массиве Rez[i] добавляется символ возврата каретки (0xD) и символ перевода строки (0xA), чтобы обеспечить правильное форматирование при выводе на консоль

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы