首页 > 解决方案 > 需要帮助实现将用户输入的输入和答案的输出保存在文本文件中的代码

问题描述

我创建了一个代码,它将小数转换为浮点数并将浮点数转换为小数。我只需要添加一个我不知道如何添加以及在哪里添加的代码。但我需要实现一个代码,它将所有用户的输入和答案的输出保存到一个文本文件(如记事本)中。以下是我的代码:

#include <stdio.h>
#include <math.h>

/*************************/
void decimal_to_IEEE754()
{
   /* declare local variables */
   float decimal_number;
   int exponent = 0;
   int bit[32];
   for (int i = 0; i < 32; i++) bit[i] = 0;

   /* prompt for floating point decimal number */
   printf("\nEnter the decimal representation: ");
   scanf("%f", &decimal_number);
   if (decimal_number == 0)
   {
       printf("\n*** Sign: 0");
       printf("\n*** Biased exponent : 00000000");
       printf("\n*** Mantissa : 00000000000000000000000");
       printf("\n***The IEEE - 754 representation is : 0.000000");
       return;
   }
      
   /* Check for 0--if so, print result */
   /* Print sign: if number>0, sign is 0, else 1 */
   if (decimal_number < 0){
       printf("\n*** Sign: %d", 1);
       bit[31] = 1;
   }
   else{
       bit[31] = 0;
       printf("\n*** Sign: %d", 0);
   }

   /* take absolute value of number before generating significand */
   if (decimal_number < 0) decimal_number = -decimal_number;

   /* Normalize number:
   while number >2, divide by 2, increment exponent
   while number <1, multiply by 2, decrement exponent
   */
   while (decimal_number > 2)
   {
       decimal_number = decimal_number / 2;
       exponent = exponent + 1;
   }
   while (decimal_number < 1)
   {
       decimal_number = decimal_number * 2;
       exponent = exponent - 1;
   }

   /* Bias exponent by 127 and print each bit in binary with 8-iteration for-loop*/
   exponent = exponent + 127;
   printf("\n*** Biased exponent: ");
   int i = 23;
   while (exponent)
   {
       bit[i] = exponent % 2;
       exponent = exponent / 2;
       i++;
   }
   for (i = 30; i >=23; i--)
   {
       printf("%d", bit[i]);
   }
   /* Hide 1 and print significand in binary with 23-iteration for-loop*/
   decimal_number = decimal_number - 1;
   printf("\n*** Mantissa: ");
   for (i = 22; i >= 0;i--)
   {
       decimal_number = decimal_number * 2;
       if (decimal_number>=1)
       {
           bit[i] = 1;
           decimal_number = decimal_number - 1;
       }
       else
       {
           bit[i] = 0;
       }
       printf("%d", bit[i]);
   }

   /* Print IEEE-754 representation */
   printf("\n*** IEEE HEX: ");
   for (i = 31; i > 0; i = i - 4)
   {
             if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("F");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("E");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("D");
       else if (bit[i] == 1 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("C");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("B");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("A");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("9");
       else if (bit[i] == 1 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("8");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("7");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("6");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("5");
       else if (bit[i] == 0 && bit[i - 1] == 1 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("4");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 1) printf("3");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 1 && bit[i - 3] == 0) printf("2");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 1) printf("1");
       else if (bit[i] == 0 && bit[i - 1] == 0 && bit[i - 2] == 0 && bit[i - 3] == 0) printf("0");
   }
   return;
}

/***********************************************************************/
void IEEE754_to_decimal()
{
   /* declare local variables */
   char IEEE_char[20];
   int bit[32];
   float fraction = 0.0;
   int exponent=0;
   float number;
   /* prompt for IEEE-754 representation */
   printf("\nEnter the IEEE-754 representation:");
   scanf("%s", IEEE_char);

   /* check for special cases: NaN
   if so, print and return */
   int j = 0;
   int NaN_flag=0;
   while (IEEE_char[j] && j < 20)
   {
       if (j >= 8) { NaN_flag = 1; break; }
       if (!((IEEE_char[j] >= 'A' && IEEE_char[j] <= 'F') || (IEEE_char[j]>='0' && IEEE_char[j]<='9')))
       {
           NaN_flag = 1; break;
       }
       j++;
   }

   if (NaN_flag == 1)
   {
       printf("\n*** Sign: -");
       printf("\n*** Special case: NaN");
       return;
   }

   /*binary bit calculation*/
   j = 31;
   for (int i = 0; i < 8; i++)
   {
       if (IEEE_char[i] == 'F'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'E'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == 'D'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'C'){ bit[j] = 1; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == 'B'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == 'A'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '9'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '8'){ bit[j] = 1; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '7'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '6'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '5'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '4'){ bit[j] = 0; bit[j - 1] = 1; bit[j - 2] = 0; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '3'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '2'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 1; bit[j - 3] = 0; }
       else if (IEEE_char[i] == '1'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 1; }
       else if (IEEE_char[i] == '0'){ bit[j] = 0; bit[j - 1] = 0; bit[j - 2] = 0; bit[j - 3] = 0; }
       j = j - 4;
   }

   /* Mask biased exponent and significand from number */
   for (int i = 0; i <= 22; i++)
   {
       fraction = (fraction + bit[i]) / ((float)2.0);
   }
   for (int i = 30; i >= 23; i--)
   {
       exponent = exponent * 2 + bit[i];
   }

   /* check for special cases: 0, -0, +infinity, -infinity,NaN
   if so, print and return */
   if (exponent == 255 && fraction == (float)0.0)
   {
       if (bit[31]) {
           printf("\n*** Sign: -");
           printf("\n*** Special case: -infinity");
       }
       else
       {
           printf("\n*** Sign: +");
           printf("\n*** Special case: +infinity");
       }
       return;
   }
   else if (exponent == 255 && fraction != (float)0.0)
   {
       printf("\n*** Sign: -");
       printf("\n*** Special case: NaN");
       return;
   }
   else if (exponent == 0 && fraction == (float)0.0)
   {
       if (bit[31]) {
           printf("\n*** Sign: -");
           printf("\n*** Special case: -0");
       }
       else
       {
           printf("\n*** Sign: +");
           printf("\n*** Special case: +0");
       }
       return;
   }
   /* Mask sign from number: if sign=0, print "+", else print "-" */
   printf("\n*** Sign: ");
   if (bit[31] == 1) printf("-");
   else            printf("+");


   /* If biased exponent=0, number is denormalized with unbiased exponent of -126,
   print denormalized number as fraction * 2^(-126), return */
   if (exponent == 0)
   {
       printf("\n*** denormalized number: %f*2^(-126)", fraction);
       return;
   }
   /* Unbias exponent by subtracting 127 and print */
   exponent = exponent - 127;
   printf("\n*** Unbiased exponent: %d", exponent);
   /* Add hidden 1 and print normalized decimal number */
   fraction = fraction + 1;
   printf("\n*** Normalized decimal: %f", fraction);
   /* Print decimal number */
   number = fraction*pow(2.0, (double)exponent);
   if (bit[31]) printf("\n*** Decimal: -%f", number);
   else         printf("\n*** Decimal: %f", number);

   return;

}

int main()
{
   /* declare local variables */
   int selection=0;
   /* until user chooses to quit, prompt for choice and select appropriate function */
   while (selection != 3)
   {
       printf("\nFloating-point conversion:");
       printf("\n1) Decimal to IEEE-754 conversion");
       printf("\n2) IEEE-754 to Decimal conversion");
       printf("\n3) Exit");
       printf("\nEnter selection: ");
       scanf("%d", &selection);
       switch (selection)
       {
           case 1:
           {
                      decimal_to_IEEE754();
                      break;
           }
           case 2:
           {
                      IEEE754_to_decimal();
                      break;
           }
           case 3:
           {
                      break;
           }
       }
   }
   printf("\n*** Program Terminated Normally");
   return 0;
}

标签: c++computer-science

解决方案


您可以使用 C 中可用的文件 I/O 操作。

    #include<stdlib.h>




    int main()
    {
       /* declare local variables */
       int selection=0;
       /* until user chooses to quit, prompt for choice and select appropriate function */

       // Setup File pointer
       FILE* outputfile;      // File pointer for input file

       outputfile   = fopen ("fileout.txt", "w+");    // open a file with filename as fileout.txt in read/write mode


       while (selection != 3)
       {
           printf("\nEnter selection: ");
           scanf("%d", &selection);
           fprintf(outputfile,"%d\t",selection);   // write the input value to file with tab charecter for seperation
           switch (selection)
           {
               case 1:
               {
                          decimal_to_IEEE754(outputfile);
                          break;
               }
               case 2:
               {
                          IEEE754_to_decimal(outputfile);
                          break;
               }
               case 3:
               {
                          break;
               }
           }
       }

       fclose(outputfile);   // close te file


       printf("\n*** Program Terminated Normally");
       return 0;
    }

重要的一点,鉴于您的函数声明的性质,它不返回任何值,因此您需要修改函数以接受文件指针作为输入参数,以便在调用相应函数时写入值。

  void decimal_to_IEEE754(FILE* outputfile);
void IEEE754_to_decimal(FILE* outputfile);

在函数内部,您可以使用相同的函数调用将输出值写入文件,使用与打印它们相同的逻辑。

在 IEEE754_to_decimal()

fprintf(outputfile,"%f\n",number); //  value followed by newline at end

要将 char 值写入文件,您可以在 decimal_to_IEEE754() 内的 fprintf 函数中使用 '%c' 而不是 '%f'。


推荐阅读