2016-04-13 2 views
-2

Я новый студент CS, и я с трудом понимаю 2 мерных массива. Сейчас я просто пытаюсь распечатать его по 1 строке за раз.Печать 2-мерных массивов в C

Это мой код

#include <stdio.h> 

#define N 3 

int main(void) 

{ 
    int array[N][N], i, j, rows[N], cols[N]; 


    for(i=0;i<N;i++) 
    { 
     printf("Enter row %d: ", i+1); 
     for(j=0;j<N;j++) 
     scanf("%d", &array[i][j]); 
    } 
    printf("The 5 rows you entered are: \n"); 
    for(i=0;i<N;i++) 
    { 
     for(j=0;j<N;j++) 
     { 
      printf("%d", array[i][j]); 
      printf("\n"); 
     } 
    } 
    printf("\n"); 
    return 0; 
} 

Я хотел бы иметь программу распечатку:

1 2 3 
1 2 3 
1 2 3 

Если я добавляю \n он печатает:

1\n 
2\n 
3\n 
1\n 
2\n 
3\n 
1\n 
2\n 
3\n 

Представьте, что \ n - это то, что распечатывает экран, я tr ying для представления того, что распечатывает код. У меня возникла проблема с тем, чтобы этот ящик распечатывал именно то, что я набираю. Это не позволит мне нажимать Enter снова и снова, чтобы представить, что на самом деле находится на экране команды.

без /n он печатает

123123123 

Я также пытаюсь добавить строки и столбцы. Мне удалось найти код и понять его, кроме одной строки. Это код.

#include <stdio.h> 

int main(void) 
{ 
    int i, j, array[5][5], rows[5],cols[5]; 

    for(i=0;i<5;i++) 
    { 
     printf("Enter row %d: ", i+1); 
     for(j=0;j<5;j++) 
      scanf("%d", &array[i][j]); 
    } 
    **for(i=0;i<5;rows[i]=cols[i]=0,i++);** 
    for(i=0;i<5;i++) 
    { 
     for(j=0;j<5;j++) 
     { 
      rows[i]=rows[i]+array[i][j]; 
      cols[j]=cols[j]+array[i][j]; 
     } 
    } 
    printf("\nRow Totals: "); 
     for(i=0;i<5;i++) 
    printf("%d\t", rows[i]); 
    printf("\nColumn Totals: "); 
    for(i=0;i<5;i++) 
     printf("%d\t", cols[i]); 
    printf("\n"); 

    return 0; 
} 

for(i=0;i<5;rows[i]=cols[i]=0,i++);
является линия, которую я не понимаю. Во-первых, я действительно не понимаю rows[i]=cols[i]=0,i++. И во-вторых, я не понимаю, почему после этого есть точка с запятой. Я думал, что для операторов не используются точки с запятой, но программа работает неправильно без этой строки или без точки с запятой. Когда я пытаюсь использовать его без этой строки кода, это дает мне сумасшедшие ответы, я предполагаю, потому что элементы в массиве не установлены в 0, и эта строка кода устанавливает элементы массивов в 0. Может ли кто-нибудь дать мне еще одна строка кода, которая может быть более понятной для кого-то, относительно нового для C? И, может быть, объясните мне, почему он использует точку с запятой?

+0

Вы найдете ответы trhe легко читая книгу C, не задавая конкретные и, возможно, не связанные вопросы. – Olaf

ответ

4

Я хотел бы иметь программу распечатку: 1 2 3 \ п 1 2 3 \ п 1 2 3 \ п

Do:

for(i=0;i<N;i++) 
{ 
    for(j=0;j<N;j++) 
    { 
     printf("%d", array[i][j]); 

    } 
    printf("\n"); 
} 


**for(i=0;i<5;rows[i]=cols[i]=0,i++);** 

это точно синтаксическая ошибка. Я думаю, вы добавили ** для маркировки заявления. Однако

for(i=0;i<5;rows[i]=cols[i]=0,i++); 

- действительный оператор С. Для цикла может быть разделена на форме

for(initilization;condition;increment) 

полу-толстой кишки отделяет три части для цикла. В вашем случае часть приращения для цикла далее делится на несколько операторов, используя запятыми, как показано ниже.

for(initialization;condition;do something useful here, update condition variable); 

Цель код для инициализации строк и столбцов суммы к нулю до фактического нахождения суммы. Обратите внимание на запятую в части приращения. Он позволяет добавлять несколько операторов. Аналогичным образом вы можете использовать запятую , чтобы иметь несколько инициализаций или несколько условий.

Последовательность с запятой после того, как for-loop является точкой последовательности. Здесь обратите внимание, что у вас нет оператора/составного оператора для цикла for. На простом и понятном языке полуколонка сообщает, что for-loop делает ничего. Но вы инициализируете суммы строк и столбцов нулю косвенно внутри цикла for, который сам по себе является умным.

Понятно, что использование не очень прямолинейно. Если вы не понимаете подобные заявления, я предлагаю вам пройти хорошую книгу программирования C.

2

для петель есть четыре части. Вы, вероятно, используется для петель как:

for (int i = 0; i < 10; i++) 
{ 
    printf("Hello!"); 
} 

или

for (int i = 0; i < 10; i++) 
    printf("Hello!"); 

Первая часть (настройка), "INT I = 0", выполняется в начале цикла. Вторая часть (тестовое выражение), «i < 10», является условием, проверяется перед каждой итерацией и завершает цикл, если он оценивает значение false. Третья часть (приращение), «i ++», выполняется в конце каждой итерации и не оценивается. Четвертая часть (тело), ​​проходит после второй части и до третьей.

В разделах настройки и увеличения цикла for вы можете использовать запятые для разделения нескольких операторов. Было бы нецелесообразно использовать запятые в тестовом выражении, так как он должен оцениваться как true, так и false. Также не имеет смысла использовать запятые в теле, так как вы можете просто использовать точки с запятой.

Нет причин, по которым вы не можете использовать сам цикл, чтобы выполнять свою работу за вас. В примере вы предоставили:

for(i=0;i<5;rows[i]=cols[i]=0,i++); 

Вы уже понимаете, что петля делает (установка всех значений в строках и перевалы массивов до 0.) Это просто делает это в приращению части цикла, а не в теле цикла. Он также использует тот факт, что операция присваивания оценивается при назначении значения. Итак, «cols [i] = 0» оценивается как «0», после чего назначаются строки [i].

Однако для циклов всегда рассматривать следующее утверждение как свое тело. Если вы хотите сказать, что цикл ничего не делает, вам нужно поместить пустой оператор (точку с запятой без ничего перед ним), чтобы он не знал ничего другого.

Если вы удалите точку с запятой, то он будет считать, что следующая строка является телом цикла, что дает такое поведение:

for(i=0;i<5;rows[i]=cols[i]=0,i++) 
{ 
    for(i=0;i<5;i++) 
    { 
     for(j=0;j<5;j++) 
     { 
      rows[i]=rows[i]+array[i][j]; 
      cols[j]=cols[j]+array[i][j]; 
     } 
    } 
} 

Для фактического решения вашей проблемы, ответ использовать sjsam в.

1

Незначительная корректировка в выходной логики

printf("The %d rows you entered are: \n", N); 
for(i=0;i<N;i++) 
{ 
    for(j=0;j<N;j++) 
    { 
     if (j != 0) 
     { 
      putc(' '); /* add space if we are not the first column */ 
     } 
     printf("%d", array[i][j]); 
    } 
    putc ('\n'); /* new line after each row is complete */ 
} 
printf("\n"); 
Смежные вопросы