2017-07-16 13 views
1

如果参数小于0,我正在寻找绘制一行char的行,必须在行上打印50个字符。如果参数超过50,必须先打印50个字符,然后继续打印字符,直到参数变为0. 当参数超过50时,我不知道如何在一行上打印前50个字符,然后新行上剩余的字符在一行上打印最多50个字符,如果参数是55,则打印一个新的字符行55

void drawLine(char c, int n){ 
    if(n<0){ 
     for(int i =0; i < 50; i++){ 
      printf("%c",c); 
     } 
    } 
    else if(n>50){ 
     for(int i=0; i<50;i++){ 
      printf("%c",c); 
      n--; 
      if (n!=0 && i % 50 == 0){ 
       printf("\n"); 
       for(int i= 0; i<50;i++){ 
        printf("%c",c); 

       } 
       break; 
      } 

     } 

    } 
    else{ 
     for(int i=0;i<n;i++){ 
      printf("%c",c); 
     } 
    } 
    printf("\n\n"); 
} 

int main(void) { 
    drawLine('*',55); 
    return 0; 
} 

回答

0

只要稍微改变一点思考问题,就可以大大简化逻辑。

首先,从不使用可变参数printf函数输出单个字符 - 这是作业的错误工具。取而代之的是使用putchar()fputc这是面向字符输出函数[1]

使用void功能时,没有理由不能在函数中的任何点使用return。在完成所需的代码块后,您可以使用此优势来避免嵌套if{} else{}...只需return

下,不使用幻数整个代码。如果您需要50的常数,那么#define之一,例如

#define LNSZ 50 

如果你决定让你的行大小60这样的话,只有一个地方,交通方便,在你的代码的顶部在那里你可以进行更改。不需要去选择多个for循环声明来更改每个循环限制。

把这些拼在一起,你可以重写你的drawline功能如下(注:传统Ç避免使用驼峰函数名)

void drawline (char c, int n) 
{ 
    if (n < 0) {      /* handle value < 0 */ 
     for (int i = 0; i < LNSZ; i++) /* output LNSZ chars */ 
      putchar (c); 
     putchar ('\n');     /* tidy up with '\n' */ 
     return;       /* all done   */ 
    } 

    for (int i = 0; i < n; i++) {  /* output n chars */ 
     if (i && i % LNSZ == 0)   /* after every 50 \n */ 
      putchar ('\n'); 
     putchar (c);     /* output char  */ 
    } 
    putchar ('\n');      /* tidy up with '\n' */ 
} 

组建了一个简单的例子来行使功能通过允许将行大小指定为命令行参数(如果未给出参数,则使用默认值55),则可以执行类似于以下内容的操作:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <limits.h> 

#define LNSZ 50 

void drawline (char c, int n) 
{ 
    if (n < 0) {      /* handle value < 0 */ 
     for (int i = 0; i < LNSZ; i++) /* output LNSZ chars */ 
      putchar (c); 
     putchar ('\n');     /* tidy up with '\n' */ 
     return;       /* all done   */ 
    } 

    for (int i = 0; i < n; i++) {  /* output n chars */ 
     if (i && i % LNSZ == 0)   /* after every 50 \n */ 
      putchar ('\n'); 
     putchar (c);     /* output char  */ 
    } 
    putchar ('\n');      /* tidy up with '\n' */ 
} 

int main (int argc, char **argv) { 

    errno = 0; 
    long v = argc > 1 ? strtol (argv[1], NULL, 10) : 55; 

    if (errno) { /* minimal validation of any strtol conversion */ 
     perror ("invalid conversion"); 
     return 1; 
    } 

    if (v < INT_MIN || INT_MAX < v) { /* validate v in int range */ 
     fprintf (stderr, "error: value exceeds storable int.\n"); 
     return 1; 
    } 

    drawline ('*', (int)v); 

    return 0; 
} 

示例使用/输出

$ ./bin/drawline 
************************************************** 
***** 

$ ./bin/drawline 50 
************************************************** 

$ ./bin/drawline -1 
************************************************** 

$ ./bin/drawline 10 
********** 

$ ./bin/drawline 151 
************************************************** 
************************************************** 
************************************************** 
* 

在比让我知道,如果你有任何问题,看的东西。

脚注[1]是,一个聪明的编译器可以优化printfputchar你,但不依赖于编译器来解决懒惰的编码习惯。

1

我试图保持尽可能多的原始代码,同时使代码更清晰,更易读。大于50的n的问题是if (n != 0 && i % 50 == 0)对于第一次迭代总是如此,n大于50并且i = 00 % 50 = 0开始。因此它只在第一行打印一个而不是50个元素。

void drawLine (char c, int n) { 
    //n less than zero equals n = 50 
    if (n < 0) {n = 50;} 

    //if printable on first line 
    if (n <= 50) { 
     for (int i = 0; i < n; i++) { 
      printf("%c",c); 
     } 
    } 

    else { 
     //print 50 chars on first line 
     for (int i = 0; i < 50; i++) { 
      printf("%c",c); 
     } 
     //reduce n by this number 
     n = n - 50; 
     printf("\n"); 

     //print remaining number of chars 
     for (int i = 0; i < n; i++) { 
      printf("%c",c); 
     } 
    } 

    printf("\n\n"); 
} 

如果您想要为每50个元素开始一个新行,每50次迭代开始一个新行的循环就是要走的路。