2017-07-20 56 views
0

用垂直于给定字符串的字母垂直逐列打印矩形矩阵,并用空格分隔重复字母。矩形矩阵的大小应根据填充所需的单元格计算给定字符串中的字符。按字母列将字符串打印为矩阵

实施例:
输入(字符串):

HELLOWORLD

输出(方块 - 矩阵):

---0 1 2 3 

    0 H L R 

    1 E O L 

    2 L W D 

    3 --O 

-------------- --------------问题结束--------------------------

我的c-程序:

void main() 

{ 

char arr[4][4],a[]="HELLOWORLD"; 

int i,j,n=0; 

clrscr(); 

for(i=0;i<4;i++) 

{ 

    for(j=0;j<4;j++) 

    { 

     if(a[n]!=a[n+1]){ 

     arr[j][i]=a[n]; 

     n++;} 

     else 

     arr[j][i]=' '; 

    } 

} 

for(i=0;i<4;i++){ 

for(j=0;j<4;j++){ 

printf("%c",arr[i][j]);}} 

getch(); 

} 

我没有得到所需的输出。请仔细阅读代码。 谢谢。

如果需要3x3矩阵,我还应该如何声明矩阵arr [X] [X]动态地对应于用户输入字符串“WELCOME”。

+1

我建议你阅读Eric Lippert的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/),并学习如何使用一个逐行扫描你的代码的调试器。 –

+1

你应该缩进你的代码。 –

回答

0

这样的:

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

void square_output(const char *mes); 

int main(void){ 
    square_output("HELLOWORLD"); 
    puts(""); 
    square_output("WELCOME"); 
    return 0; 
} 

void square_output(const char *mes){ 
    char *str = malloc(strlen(mes)*2); 
    char *cp = str; 
    char *matrix; 
    int side, exp_len, mat_size; 
    //separate of duplicate letter by ' ' 
    while(*mes){ 
     *cp++ = *mes++; 
     if(mes[-1] == *mes) 
      *cp++ = ' '; 
    } 
    *cp = 0; 

    exp_len = cp - str; 
    side = ceil(sqrt(exp_len));//dim 
    mat_size = side * side; 
    matrix = malloc(mat_size);//1D array 
    memset(matrix, ' ', mat_size);//initialize by ' ' 
    memcpy(matrix, str, exp_len); 
    { //print 
     int c, r; 
     for(c = 0; c < side; ++c){ 
      for(r = 0; r < side; ++r){ 
       if(r) 
        putchar(' '); 
       putchar(matrix[r * side + c]);//This means matrix[r][c] in 2D 
      } 
      puts("\n"); 
     } 
    } 
    free(matrix); 
    free(str); 
} 
+0

@ BLUEPIXY帮助。 https://stackoverflow.com/questions/45211559/finding-nth-power-of-integer-m-through-c-program –

0

动态获取,你应该选择了cmath库的大小和使用sqrtceil功能

为什么ceil,如果你的字符串长度是不是一个完美的广场上。

int dim = (int) ceil(sqrt(sizeof(a)/sizeof(char))); 
char arr[dim][dim]; 

在接下来的字符串迭代,并使用rowcol整型变量在你的矩阵

int row=0, col=0; 
for (i=0; i<sizeof(a)/sizeof(char); i++) { 
    arr[row][col] = a[i]; 

    col++; 
    if (col>=dim) { 
     col = 0; 
     row++; 
    } 
} 

迭代,如果您担心未使用的电池如果字符串长度是不是一个完美的正方形然后早期初始化基质上

for (i=0; i<dim; i++) 
    for (j=0; j<dim; j++) 
     arr[i][j] = '.'; 
+0

由于可能会插入空格,因此'dim'计算应该使用结果的长度。 – BLUEPIXY

+0

int dim =(int)ceil(sqrt(sizeof(a)/ sizeof(char))); char arr [dim] [dim];我收到编译错误说“需要恒定值”。一旦声明char arr [4] [4]而不是dim,它就会运行。有没有办法用char arr运行[dim] [dim];? –

+0

@VineethMourya如果您不能使用VLA,请使用'malloc'。 – BLUEPIXY