C - 矩阵>只有积极因素

时间:2017-12-23 19:39:57

标签: c matrix input

我需要你的帮助,我会告诉你的代码只是一个开始,但我已经有一个初学者的问题,所以请帮助我,我不认为对于那些知道C.的人来说会很难。 / p>

这是我的代码:

#include <stdio.h>

int main () 
{
    int matrix[10][10];
    int nrows, ncols, i, j, chosen;

    printf("Enter number of rows: "); //user enters number of rows
    scanf("%d", &nrows);
    if(nrows < 2){
        printf("\n Out of range, please try again");
        exit(5);
    }
    printf("Enter number of columns: "); //user enters number of columns
    scanf("%d", &ncols);
    if(ncols < 2){
        printf("\n Out of range, please try again");
        exit(5);
    }

    printf("Enter matrix elements: "); //user enters all the elements for Matrix
                for(i = 0; i < nrows; i++){
                    for(j = 0; j < ncols; j++){
                        scanf("%d",&matrix[i][j]);
                    }
                    printf("\n");
                }
            printf("This is your matrix: \n");
                for(i = 0; i < nrows; i++){
                    for(j = 0; j < ncols; j++){
                        printf("%d \t",matrix[i][j]);
                    }
                    printf("\n");
                }

    return 0;

}

没什么特别的,用户输入行数和列数,然后用元素填充这个矩阵。

现在问题,现在用户可以输入任何类型的整数,正面和负面, 我只想限制用户,以便他/她只能输入正数。

2 个答案:

答案 0 :(得分:1)

你写道,你试图使用另一个变量和&#39;而#39;循环,所以你可以这样做:

for(i = 0; i < nrows; i++){
   for(j = 0; j < ncols; j++){
      tmp=0;
      scanf("%d",&tmp);
      while(tmp<0){
          printf("enter positive numbers only\n");
          scanf("%d",&tmp);
      }
      matrix[i][j]=tmp;
   }
}

答案 1 :(得分:1)

你陷入的另一个巨大陷阱是未能检查scanf的回归。由于各种格式说明符处理前导空格的细微差别,以及输入后保留在scanf中的字符,stdin因新的C程序员正确处理而出了名的问题。拍摄。

至少,您必须检查返回并验证实际发生的预期转化次数,未返回EOF,表示用户通过生成手册取消了输入{k <1}} Ctrl + d (或 Ctrl + z on windoze)。如果字符输入可以跟随(尾随EOF仍然未读),您还必须清空出现错误后stdin内的所有字符并成功转换。

另一种风格是将代码扩展得更广泛。年轻人的眼睛可能没有问题,但是对于世界其他地方而言,适当的间距使代码更具可读性。

将这些部分组合在一起,并将'\n'的读数和清空int放入函数中以避免重复的代码块,您可以执行类似以下操作:

stdin

示例使用/输出

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

/** simple function to empty all characters that remain
 *  in stdin. Needed when using scanf for user input.
 */
void empty_stdin()
{
    for (int c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
}

/** abbreviated function to read integer value from user.
 *  returns value on success, exits if user cancels.
 *  empties stdin after call to scanf.
 */
int getint ()
{
    int n = 0,
        rtn = 0;        /* variable to capture return of scanf */

    if ((rtn = scanf ("%d", &n)) == EOF) {  /* if user cancels, exit */
        fprintf (stderr, "user canceled input.\n");
        exit (EXIT_FAILURE);
    }
    empty_stdin();      /* empty all chars remaining in stdin */

    return n;
}

int main (void) 
{
    int matrix[10][10] = {{0}};
    int nrows, ncols, i, j;

    printf ("Enter number of rows: ");
    nrows = getint();
    if (nrows < 2) {
        printf ("\n Out of range, please try again");
        return 5;
    }
    printf ("Enter number of columns: ");
    ncols = getint();;
    if (ncols < 2) {
        printf ("\n Out of range, please try again");
        return 5;
    }

    printf ("\nEnter matrix elements\n");
    for (i = 0; i < nrows; i++)
        for (j = 0; j < ncols; j++) {
            printf ("  matrix[%d][%d]: ", i, j);
            matrix[i][j] = getint();
        }

    printf ("\nThis is your matrix: \n");
    for (i = 0; i < nrows; i++) {
        for(j = 0; j < ncols; j++)
            printf (" %3d", matrix[i][j]);
        putchar ('\n');
    }

    return 0;
}

仔细看看,如果您有其他问题,请告诉我。