C - Sentinel控制回路

时间:2014-11-20 21:42:57

标签: c loops

分配:

A - 编写一个程序,从用户那里获取数字,直到用户输入“-1”。然后程序应该将数字写入文件。

我已经这样做了,但我不能做B:

B - 更新程序并将直方图打印到文件中,如下所示。将代码保存在新文件中。

实施例

report.dat:

5 *****
8 ********
11 ***********
3 ***

A代码:

#include <stdio.h>
    int main() {
    int num;
    const int senitel = -1;
    FILE*fileId;
    printf("Please enter integer number (-1 to finish)");
    scanf("%d", &num);
    fileId = fopen("report.dat", "w");
    while (num != senitel) {
      fprintf(fileId, "%d \n", num);
      scanf("%d", &num);      
    }

    fclose(fileId);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您需要暂时将其存储在数据结构中,而不是将用户输入直接写入文件。当用户输入sentinel值时,则输出数据结构的内容。

在伪代码中

ask user for input
while not sentinel
    add to array[user value]++
    get next input

for each element in array
    if value > 0
        fprintf value + " "

        for (int i = 0; i < value; i++)
            fprintf "*"

        fprintf 

答案 1 :(得分:0)

您正尝试在代码中的一个阶段(区域)中执行这两个步骤。将文件操作分离到后续阶段,并使用变量存储直方图值,并将变量写入文件。您可以将输入的数字存储在一个数组中,将该数字的计数存储在另一个数组中 - 或者将它们组合成struct并创建struct的数组。使用typedef从新struct中创建一个类型。

像这样(不完整但会让你开始):

typedef struct tag_HistogramRow {
   long EnteredNumber;
   long Count;
} t_HistogramRow;

t_HistogramRow *typMyHistogram=NULL; // Pointer to type of t_HistogramRow, init to NULL and use realloc to grow this into an array
long lHistArrayCount=0;

您的第一步创建此数组,根据需要增长它,填写值并等待-1

第二步将所有存储的数据写入文件。

答案 2 :(得分:0)

the lines:

while (num != senitel) {
  fprintf(fileId, "%d \n", num);
  scanf("%d", &num);      
}

would become:

while (num != senitel) 
{
    // echo num to file
    fprintf(fileId, "%d ", num);

    // echo appropriate number of '*' to file
    for( int i= 0; i<num; i++ )
    { 
        fprintf( fileId, "*" );
    } // end if

    // echo a newline to file
    fprintf( fileId, "\n" );

    // be sure it all got written to file before continuing
    fflush( fileId ); 

    // note: leading ' ' in format string enables white space skipping
    if( 1 != scanf(" %d", &num) ) 
    { // then, scanf() failed
        perror( "scanf" ); // also prints out the result of strerror( errno )
        exit(1);
    }  // end if     
} // end while