2016-12-04 2 views
0

Итак, я должен создать программу, которая может определять максимум по диагонали матрицы. Затем мне нужно поменять место первой переменной матрицы (a [1] [1]) с максимумом этой матрицы, остальные элементы остались неизменными.Перемещение 2 переменных из матрицы в C

Вот мой код:

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

int a[20][20]; 
int main(){ 
    int i, j, n1, n2, max; 
    printf ("\nIntroduceti numarul de coloane pentru matricea A: "); 
    scanf (" %d", &n2); 
    printf ("\nIntroduceti numarul de randuri pentru matricea A: "); 
    scanf (" %d", &n1); 
    printf("\nIntroduceti elementele primei matrice: "); 
    for(i=1;i<=n1;i++){ 
     for(j=1;j<=n2;j++){ 
      printf("\na[%d][%d] = ", i, j); 
      scanf("%d",&a[i][j]); 
     } 
    } 
    printf("\nMatricea A este:\n"); 
    for(i=1;i<=n1;i++){ 
     printf("\n"); 
     for(j=1;j<=n2;j++){ 
      printf("%d\t",a[i][j]); 
     } 
    } 


    do { 
     for(i=1;i<=n1;i++){ 
      if(a[i][i]>max) { 
       max=a[i][i]; 
      } 
     } 
    } while (i<=n1); 
    printf ("\nMaximul de pe diagonala este: %d", max); 

    a[1][1]=a[1][1]^max; 
    max=max^a[1][1]; 
    a[1][1]=max^a[1][1]; 

     for(i=1;i<=n1;i++){ 
     printf("\n"); 
     for(j=1;j<=n2;j++){ 
      printf("%d\t",a[i][j]); 
     } 
    } 

    return 0; 
} 

Что я сделал не так? Моя программа свопирует только максимум с первой переменной a [1] [1], но забывает разместить [1] [1], где максимум.

+2

Логика вашей свопинга не кажется неправильной - поэтому название даже не актуально. –

+6

В C индексы массива начинаются с 0! –

+0

@ ZachP Ну, логика хорошая, но она не делает то, что мне нужно. Моя программа свопирует только максимум с первой переменной a [1] [1], но забывает разместить [1] [1], где максимум. Зачем? –

ответ

3

Вы итерация полностью через диагональные элементы, отслеживание только максимальное значение , а затем (после цикла) вы пытаетесь поменять это значение с первым элементом матрицы. Проблема в том, что вы больше не знаете , где максимальное значение было, так как вы никогда не записывали это! Вы просто записываете что значение было (в max) и проигнорировано его индекс в матрице.

Например, предположим, что ваше максимальное значение находится на a[2][2]. Вы повторяете диагональные элементы, найдите максимальное значение значение, сохраните его в max. В конце вашего цикла вы не можете поменять a[2][2] на a[0][0], потому что потеряли информацию о том, что максимум равен a[2][2]. (Предполагая, что вы изучили проблему индексов массива, начиная с 0.) Что вы делаете, это написать max первому элементу a[0][0]. a[2][2] не изменился, потому что вы не меняете его, и вы забыли, где он должен был его изменить.

Вы должны следить за максимальной значения в некоторой переменной (max, как написано теперь отлично) и добавить еще одну переменную (скажем, max_pos, например), чтобы следить за индекса того, где это максимальное значение. (Вам нужен только один int, потому что они диагональные элементы, поэтому оба индекса массива всегда одинаковы.) Каждый раз, когда вы меняете максимальное значение max, также обновляйте максимальное положение max_pos. Таким образом, вы знаете, что в конце обменять a[0][0] и a[max_pos][max_pos].


Краткий очерк о том, что код может выглядеть следующим образом (я оставлю это вам заполнить любые детали):

Добавить объявление новой переменной для отслеживания позиции (скажем, max_pos) от максимального значения:

int i, j, n1, n2, max, max_pos; 

Вы должны инициализировать max и max_pos с первым диагональным элементом, а затем перебирать другие.

max = a[0][0]; 
max_pos = 0; 
for (i=0; i<n1; i++){ 
    if (a[i][i] > max) { 
     max = a[i][i]; 
     max_pos = i; // update max_pos anytime max is updated 
    } 
} 

Обратите внимание, как я изменил диапазон индексов от 1 ... n1 до 0 .. n1 -1. (Сделайте это в соответствии с остальной частью вашего кода.) Индексы массива в C начинаются с 0, а не с 1. Обратите внимание, что вам не нужен цикл do {} while(). Подумайте, что это на самом деле делает (подсказка: ничего).

После этого вы можете обменять a[0][0] и a[max_pos][max_pos]. Кстати, XOR swap не нужен и делает код более трудным для чтения. Просто замените значения временной переменной. Современные компиляторы очень хорошо оптимизируют и, скорее всего, реализуют это с помощью регистров, поэтому вы, вероятно, не получаете какой бы то ни было эффективности, о которой вы думаете (и вы делаете это только один раз). Не пытайтесь перехитрить ваш компилятор.

1

Предложение для очистки

Если у вас есть

int a[20][20]; 

Допустимый диапазон элементов a[0][0] - a[19][19].

Вы обращаетесь элементы a[1][1] - a[n1][n2] во всех for петель, так как вы используете:

for(i=1;i<=n1;i++){ 
    for(j=1;j<=n2;j++){ 

Это не будет проблемой, если значение n1 или значение n2 не 20.

Изменение этих петель использовать:

for(i=0; i < n1; i++){ 
    for(j=0; j < n2; j++){ 

Основная проблема

Основная проблема в вашем коде заключается в том, что вы используете max перед его инициализацией. Добавьте строку для инициализации max до a[0][0] перед циклом, чтобы вычислить его окончательное значение.

// Remove the `do-while` part. You don't need it. 
max = a[0][0]; 
for(i=0; i < n1; i++){ 
    if(a[i][i]>max) { 
     max=a[i][i]; 
    } 
} 
+0

Я делал то, что вы мне говорили, но я сталкиваюсь с тем же самым вопросом, который максимум переходит в [0] [0 ], но [0] [0] не попадает туда, где максимум ... –

+0

@NeacsuMihai, у вас нет кода для этого. Вы заменяете только значения 'max' и' a [0] [0] '.Вы не меняете никаких других значений. –

+0

Man ... Я понимаю, что я не заменяю никаких других значений, чем max и [0] [0]; Если я запустил эту программу, я получу матрицу, где будет изменено только [0] [0] ... Я не знаю, как объяснить это более четко, попробуйте запустить его ... Пример, мой максимум - это то, где [2] [2], поэтому он должен поменять значение a [2] [2] на [0] [0], ну .. Это неверно, потому что моя программа ставит только значение [2] [ 2] над [0] [0], поэтому он не меняет их. Теперь вы понимаете, в чем моя проблема ....? –

Смежные вопросы