Декартова система координат и двумерные массивы - PullRequest
1 голос
/ 03 апреля 2020

Я делаю эту c программу для печати декартовой системы координат с точками в ней, используя координаты x и y из стандартного ввода, но я борюсь с этим кодом. Я не использую некоторые графические библиотеки, но 2D-массивы. Вывод должен выглядеть примерно так: enter image description here Когда я заменяю в поле [y] [x] x и y на некоторые числа (2 для y и 1 для x), это дает мне выше результат. Как я могу исправить этот код, чтобы напечатать точки на графике? Спасибо всем.

#include <stdio.h>

#define ROWS  5
#define COLS  5
#define N     25

int main()
{
    int i;
    int j;
    int x;
    int y;
    int Points;
    int Field[ROWS][COLS];

    for(i = 0; i < ROWS; i++){
        for(j = 0; j < COLS; j++){
            Field[i][j] = 0;
        }
    }

    printf("Enter the number of points: \n");
    scanf(" %d", &Points);
    if(Points != N){
        printf("Enter the x and y coordinates of the points: \n");
        for(i = 0, j = 0; i < Points, j < Points; i++, j++)
        {
            printf("(X%d, Y%d) = ", j, i);
            fflush(stdin);
            scanf("(%d, %d)", &x, &y);
            Field[y][x] = 1;
        }
        printf("\n");
    }
    else{
        printf("The inserted number exceeds the maximum possible number \n");
    }

    for(i = ROWS - 1; i > 0; i--)
        printf("%d\n \n \n", i);

    for(i = ROWS-1; i >= 0; i--){
      for(j = 0; j < COLS; j++){
        if(Field[i][j] == 0)
           printf("");
        else{
           switch(j){
            case 0:
                printf("o");
                break;
            case 1:
                printf("\t o");
                break;
            case 2:
                printf(" \t \t o");
                break;
            case 3:
                printf(" \t \t \t o");
                break;
            case 4:
                printf(" \t \t \t \t o");
                break;
           }
         }
       }
        printf("\n \n");
    }   

    for(j = 0; j < COLS; j++)
        printf("%d\t", j);

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 04 апреля 2020

То, что вы должны знать, это то, что когда вы печатаете строку, перемещенную на следующую строку, вы не можете go вернуться к пропущенной строке. Таким образом, вы должны начать печать с самого высокого уровня из вашего 2d-массива. Затем вы должны начать проверку с начала этой строки, является ли точка точкой или нет, если она найдена, в противном случае продвигайтесь вперед. Вы не нуждаетесь в операторе switch для пробелов, вы можете реализовать его из for l oop.

Это дает программу, которая вам нужна. Я также исправил ваше сканирование for l oop. Для ввода через запятую необходимо указать только запятую в строке сканирования. И когда даются условия для использования операторов l oop && <,>,<=,>=,!=, это for(i = 0, j = 0; i < Points, j < Points; i++, j++) неэффективный код, посмотрите на мой код, как я его исправил.

#include <stdio.h>

#define ROWS  5
#define COLS  5
#define N     25

int main()
{
    int i;
    int j;
    int x;
    int y;
    int Points;
    int Field[ROWS][COLS];

    for(i = 0; i < ROWS; i++){
        for(j = 0; j < COLS; j++){
            Field[i][j] = 0;
        }
    }

    printf("Enter the number of points: \n");
    scanf(" %d", &Points);
    if(Points != N){
        printf("Enter the x and y coordinates of the points: \n");
        for(i = 0, j = 0; i < Points&&j < Points; i++, j++)
        {
            printf("(X%d, Y%d) = ",j,i);
            fflush(stdin);
            scanf("%d,%d", &x, &y);
            Field[y][x] = 1;
        }
        printf("\n");
    }
    else{
        printf("The inserted number exceeds the maximum possible number \n");
    }

    for(int i=ROWS-1;i>0;i--){
        printf("%d", i);
        for(int j=0;j<COLS;j++){

            if(Field[i][j]==1){
                printf("o");
            }
            printf("\t");

        }
        printf("\n\n\n");

    }  

    for(j = 0; j < COLS; j++)
        printf("%d\t", j);

    return 0;
}
1 голос
/ 04 апреля 2020

На самом деле, вы можете использовать структуру в c для хранения координат каждой точки. Это будет полезно, если вы хотите сделать другие вещи с точками.

typedef struct {
  int x;
  int y;
}coordinates;

В вашем коде

for(i = 0, j = 0; i < Points, j < Points; i++, j++)
        {
            printf("(X%d, Y%d) = ", j, i);
            fflush(stdin);
            scanf("(%d, %d)", &x, &y);
            Field[y][x] = 1;
        }

Использование двух переменных не является обязательным, поскольку значение i всегда равно j. Таким образом, вы можете использовать только i.

for(i = 0; i < Points; i++)
{
     printf("(X%d, Y%d) = ",i,i);
     fflush(stdin);
     scanf("%d,%d", &x, &y);
     Field[y][x] = 1;
}

Еще одна вещь, вы должны использовать (i < Points) && (j < Points) вместо i < Points, j < Points.

Если вы используете 2d массив, Код @Neminda Prabhashwara выглядит нормально. Но если вы хотите использовать структуру, как я упоминал выше, вы можете увидеть мой код (он может быть не оптимизирован). Это просто показывает мою идею.

#include <stdio.h>
#include <stdlib.h>
#define ROWS  5
#define COLS  5
#define N     25

typedef struct {
  int x;
  int y;
}coordinates;

void sorting_coord(coordinates * a, int n) {
    for(int i = 0; i < n - 1; i++){
        for(int j = i + 1; j < n; j++){
            if(a[i].y > a[j].y){
                coordinates tg = a[i];
                            a[i] = a[j];
                            a[j] = tg;        
            }
        }
    }
}

int main()
{
    int i;
    int Points;
    coordinates * coord;

    printf("Enter the number of points: \n");
    scanf(" %d", &Points);
    coord = malloc(Points * sizeof(coordinates));
    if(Points < N && Points >= 0){
        printf("Enter the x and y coordinates of the points: \n");
        for(i = 0; i < Points; i++)
        {
            printf("(X%d, Y%d) = ", i, i);
            fflush(stdin);
            scanf("%d, %d", &coord[i].x, &coord[i].y);
        }
        printf("\n");
    }
    else{
        printf("The inserted number exceeds the maximum possible number \n");
    }

    sorting_coord(coord, Points);
    int temp;
    for(i = ROWS - 1; i > 0; i--) {
        temp = 0;
        printf("%d", i);
        for (int k = 0; k < Points; k++) {
            if(coord[k].y == i ) {
                for (int j = 0; j < (coord[k].x - temp); j++) {
                    printf("\t");
                }
                if (coord[k].x != 0)
                    printf("°");
                temp = coord[k].x;
            }
      }

      printf("\n\n\n");
    }


    for(int j = 0; j < COLS; j++){
        printf("%d\t", j);
    }

    return 0;

}
0 голосов
/ 04 апреля 2020

Надеюсь, я понимаю, что тебе нужно.

 int main()
    {
        int i;
        int j;
        int x;
        int y;
        int Points;
        int Field[ROWS][COLS];

        for(i = 0; i < ROWS; i++){
            for(j = 0; j < COLS; j++){
                Field[i][j] = 0;
            }
        }

        /** rest of your code*/

        for(i = ROWS-1; i >= 0; i--){
            printf("%d", i);
            for(j = 0; j < COLS; j++){
                if(Field[i][j] == 0){
                    printf("");
                }
                else{
                    switch(j){
                        case 0:
                            printf("\t o");
                            break;
                        case 1:
                            printf("\t \t o");
                            break;
                        case 2:
                            printf(" \t \t \t o");
                            break;
                        case 3:
                            printf(" \t \t \t \t o");
                            break;
                        case 4:
                            printf(" \t \t \t \t \t o");
                            break;
                    }

                }
            }
            printf("\n \n");
        }   
        printf("\t");
        for(j = 0; j < COLS; j++){
            printf("%d\t", j);
        }
        return 0;

    }
...