2017-01-24 2 views
3

Я новичок в программировании, и мы просто изучили массивы в классе.
Нам поручено создать программу на C без использования глобальных переменных.Создание переменной, доступной для других функций в C

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

Я не мог понять, как сделать некоторые из переменных, читаемых функцией операций, так как нам не разрешено использовать глобальные переменные.

void matrix(){ 
int a, b, c, d, k, m, n, p, q, s=0, first[MAX][MAX], second[MAX][MAX], msum[MAX][MAX], firstt[MAX][MAX], secondt[MAX][MAX], prod[MAX][MAX]; 
system("CLS"); 
printf("/-----------------------------------------------------------------------------/\n" 
     "\t\t\t\tMatrix\n" 
     "/-----------------------------------------------------------------------------/\n"); 
printf("This program will multiply matrices (up to 3x3 matrix only).\n" 
     "Please enter the number of rows of the first matrix: "); 
scanf("%d", &m); 
if(m>3){ 
    matrixerror(); 
} 
printf("Please enter then number of columns of the first matrix: "); 
scanf("%d", &n); 
if(n>3){ 
    matrixerror(); 
} 
printf("Please enter the number of rows of the second matrix: ");//Matrix 2 
scanf("%d", &p); 
if(p>3){ 
    matrixerror(); 
} 
printf("Please enter then number of columns of the second matrix: "); 
scanf("%d", &q); 
if(q>3){ 
    matrixerror(); 
} 
printf("\nPlease enter the elements of the first matrix:\n"); 
for(c=0; c<m; ++c) 
    for(d=0; d<n; ++d){ 
     printf("Enter element a%d%d: ",c+1, d+1); 
     scanf("%d", &first[c][d]); 
    } 
printf("\nPlease enter the elements of the second matrix:\n"); 
for(c=0; c<p; ++c) 
    for(d=0; d<q; ++d){ 
     printf("Enter element b%d%d: ",c+1, d+1); 
     scanf("%d", &second[c][d]); 
    } 

matrixmenu(); 
} 

, а другой для операций

void matrixmenu(){ 
system("CLS"); 
char choice; 
printf("/-----------------------------------------------------------------------------/\n" 
     "\t\t\t\tMatrix\n" 
     "/-----------------------------------------------------------------------------/\n"); 

printf("\n" 
     "\t1. Add Matrices\n" 
     "\t2. Multiply Matrices\n" 
     "\t3. Transpose \n" 
     "\tB. Back \n"); 
printf("\n\tFirst matrix is : \n\t"); 
for(a=0; a<m; ++a) 
    for(b=0; b<n; ++b){ 
     printf("%d ", first[a][b]); 
     if (b == n-1) 
     printf("\n\n\t"); 
    } 
printf("\n\tSecond matrix is : \n\t"); 
for(a=0; a<m; ++a) 
    for(b=0; b<n; ++b){ 
     printf("%d ", second[a][b]); 
     if (b == n-1) 
     printf("\n\n\t"); 
    }  
printf("\n"); 
printf("/------------------------------------------------------------------------------/ "); 
scanf("%s", &choice); 
switch(choice){ 
    case '1': 
     printf("\n\tThe sum of entered matrices is: \n\t"); 

     for (a = 0; a < m; a++){ 
      for (b = 0 ; b < n; b++){ 
       msum[a][b] = first[a][b] + second[a][b]; 
       printf("%d\t", msum[a][b]); 
      } 
      printf("\n\t"); 
     } 
     printf("\n\t"); 
     system("PAUSE"); 
     matrixmenu(); 
     break; 
    case '2': 
     if (n != p){ 
      printf("\n\tError! Matrix cannot be multiplied!\n\t"); 
      system("PAUSE"); 
      matrixmenu(); 
     } 
     for (c = 0; c < m; c++){ 
      for (d = 0; d < q; d++){ 
       for (k = 0; k < p; k++){ 
        s = s + first[c][k]*second[k][d]; 
       } 
      prod[c][d] = s; 
      s = 0; 
      } 
     } 
     printf("\n\tThe product matrix is:\n\t"); 
     for (c = 0; c < m; c++){ 
      for (d = 0; d < q; d++){ 
       printf("%d\t", prod[c][d]); 
      } 
      printf("\n\t"); 
     } 
     printf("\n\t"); 
     system("PAUSE"); 
     matrixmenu(); 
     break; 
    case '3': 
     for(a=0; a<m; ++a)//Tranposition 
      for(b=0; b<n; ++b) 
       firstt[b][a] = first[a][b]; 
     printf("\n\tThe transpose of the first matrix is:\n\t"); 
     for(a=0; a<n; ++a) 
      for(b=0; b<m; ++b){ 
       printf("%d ",firstt[a][b]); 
      if(b==m-1) 
      used printf("\n\n\t"); 
     } 
     for(a=0; a<p; ++a)//Tranposition 
      for(b=0; b<q; ++b) 
       secondt[b][a] = second[a][b]; 
     printf("\n\tThe transpose of the second matrix is:\n\t"); 
     for(a=0; a<n; ++a) 
      for(b=0; b<m; ++b){ 
       printf("%d ",secondt[a][b]); 
      if(b==m-1) 
       printf("\n\n\t"); 
      } 
     printf("\n\t"); 
     system("PAUSE"); 
     matrixmenu(); 
     break; 
    case 'B': 
    case 'b': 
     mainmenu(); 
     break; 
    default: 
     matrixmenu(); 
     break; 
} 
} 
+1

Передайте свой адрес в функцию, которую вы вызываете. Затем он может ссылаться на них. – StoryTeller

+0

И подумайте о добавлении в свой код пустых строк. Вам будет трудно читать книгу без абзацев, так как большинство людей (включая вас в неделю) найдут ваш код. – StoryTeller

+0

Как вы это делаете? – WilyFreddie

ответ

2

Вы можете передать адрес переменной в функции, в которой вы хотите работать с этой переменной.

Давайте рассмотрим пример, предположим

#include<stdio.h> 

void testing(int *); 

int main(){ 

    int x = 3; 
    printf("%d\n" , x); 

    testing(&x); 
    printf("%d" , x); 

    } 

    void testing(int *j){ 
    *j = 8; 
    } 

результат будет 3 8, теперь x изменяется в функции вызывающего абонента, потому что вы прошли адрес x (&x) к функции testing и с помощью *j вы разыменование этого адреса и сохранение 8 по адресу, на который указывает j, поэтому в действии изменяется x, потому что вы сохранили его адрес указателем, который теперь указывает на этот адрес, а затем вы передали этот адрес другой функции и где вы дешифруете (разыменование указателя означает получение значения, которое хранится в ячейке памяти, указанной указателем). Оператор * используется для этого и называется оператором разыменования) и изменил значение, которое сохраняется.

Для получения дополнительной информации посмотрите на этот вопрос What does "dereferencing" a pointer mean?

-1

Массивы могут быть переданы в качестве аргументов функции; функция получит только указатель на первый элемент, который вы сможете индексировать, как исходный массив. Первый элемент двумерной матрицы является одномерной матрицей;

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

В вашем случае размеры известны и постоянны (MAX), но вам нужны 2 "размера", т. Е. Количество строк и столбцов на каждую матрицу. Вы можете просто передать их.

Программа, представленная ниже, демонстрирует прохождение стандартного массива и дополнительно представляет функцию современных массивов переменной длины C.

#include<stdio.h> 

#define MAX 100 

// Pass a matrix with constant number of columns 
// known at compile time, and the number of columns 
// and rows we actually use. 

// Both declarations are ok. The first index is ignored. 

//void print(int mat[MAX][MAX]) 
void print(int mat[][MAX], int usedRows, int usedCols) 
{ 
    for(int row=0; row<MAX && row<usedRows; row++) 
    { 
     for(int col=0; col<MAX && col<usedCols; col++) 
     { 
      printf("%5d", mat[row][col]); 
     } 
     printf("\n"); 
    } 
} 

// Pass a variable length array, together with its 
// dimensions. Both declarations are ok. 

// void printVar(int rows, int cols, int vm[rows][cols]) 
void printVar(int rows, int cols, int vm[][cols]) 
{ 
    // demonstrate run-time sizeof(vm[row]). 
    // one could use the sizeof construct instead of cols. 
    printf("vla row length is %zd (cols: %d)\n", 
      sizeof(vm[0])/sizeof(int), cols); 

    for(int row=0; row<rows; row++) 
    { 

     for(int col=0; col<cols; col++) 
     { 
      printf("%5d", vm[row][col]); 
     } 
     printf("\n"); 
    } 
} 

int main() 
{ 
    // matrix size known at compile time; 
    // we fill only the first 3 rows and columns. 
    int m[MAX][MAX] 
     = { 
       {1, 2, 3}, 
       {4, 5, 6}, 
       {7, 8, 9} 
      }; 
    // print the compile-time sized matrix. Function needs to know 
    // how many rows and columns we actually used. 
    print(m, 3, 3); 

    // Now use a feature of modern C: variable length arrays. 
    { 
     int numRows, numCols; 

     printf("Now variable length array: "); 
     printf("Please input two numbers, num rows and num columns: "); 
     if(scanf("%d %d", &numRows, &numCols) != 2) 
     { 
      fprintf(stderr, "input error, aborting\n"); 
      return 1; 
     } 

     // now define the matrix with the size the user requested. 
     int varMat[numRows][numCols]; 

     // fill it with some data (cannot hard code, becase I 
     // don't know the dimensions!) 
     for(int row=0; row<numRows; row++) 
     { 
      for(int col = 0; col < numCols; col++) 
      { 
       varMat[row][col] = row * numCols + col + 1; 
      } 
     } 

     // And use the function for variable length array to print. 
     printVar(numRows, numCols, varMat); 
    } 
    return 0; 
} 

Пример сессия:

$ gcc -std=c11 -Wall -o matrixfuncs matrixfuncs.c && ./matrixfuncs 
    1 2 3 
    4 5 6 
    7 8 9 
Now variable length array: Please input two numbers, num rows and num columns: 2 7 
vla row length is 7 (cols: 7) 
    1 2 3 4 5 6 7 
    8 9 10 11 12 13 14 

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

+0

Мне понравилась моя программа и подумал, что она хорошо отвечает на вопрос OP. Если бы downvoter мог указать на возможные улучшения в ответе, я бы это оценил, как и OP. –

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