Solving a Matrix with Elimination: Inputting the Right Number of Values

  • Thread starter Thread starter darwinharianto
  • Start date Start date
  • Tags Tags
    Elimination Matrix
AI Thread Summary
The discussion focuses on resolving issues with a C program that uses Gaussian elimination to solve a matrix. The main problem was the incorrect number of inputs required for the first row due to the inclusion of "\n" in the scanf function calls, which caused the program to expect an additional input. Suggestions included removing the "\n" and using loops to simplify the input process for larger matrices. The conversation also touched on how to correctly display the results of the calculations in a user-friendly format. Ultimately, the user successfully implemented the changes and expressed gratitude for the assistance.
darwinharianto
Messages
42
Reaction score
0

Homework Statement


Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int i,j,k,n;
    float A[3][4];
    float x[3],c,sum=0;
    n=2;
    printf("first row\n");
    scanf("%f",&A[0][0]);
    scanf("%f",&A[0][1]);
    scanf("%f\n",&A[0][2]);
    printf("second row\n");
    scanf("%f",&A[1][0]);
    scanf("%f",&A[1][1]);
    scanf("%f\n",&A[1][2]);
    printf("third row\n");
    scanf("%f",&A[2][0]);
    scanf("%f",&A[2][1]);
    scanf("%f\n",&A[2][2]);
    printf("designated value\n");
    scanf("%f",&A[0][3]);
    scanf("%f",&A[1][3]);
    scanf("%f\n",&A[2][3]);
    for(j=0; j<=n; j++)
    {
        for(i=0; i<=n; i++)
        {
            if(i>j)
            {
                c=A[i][j]/A[j][j];
                for(k=0; k<=n+1; k++)
                {
                    A[i][k]=A[i][k]-c*A[j][k];
                }
            }
        }
    }
    x[n]=A[n][n+1]/A[n][n];
    for(i=n-1; i>=0; i--)
        {
               sum=0;
               for(j=i+1; j<=n; j++)
                 {
                 sum=sum+A[i][j]*x[j];
                  }
              x[i]=(A[i][n+1]-sum)/A[i][i];
         }

    printf("\n X = %f",x[0]);
    printf("\n Y = %f",x[1]);
    printf("\n Z = %f",x[2]);
   
      return(0);
}
i use this code for elimination on matrix, but i need to input 4 times at the first row even though i only put 3 scanf
what should i do to make it only need 3 input
thanks for replying
 
Physics news on Phys.org
Does your problem statement require the use of scanf() ? You may know that scanf returns an int - you have to compare the int returned against EOF (# a define in stdio.h). This checks for a matching failure. Also note that what is already in the keyboard buffer carries over to the next scanf call, e.g., the return key.

Decent programs try to avoid having multiples of the same statement over and over again. Why? Because it is harder to make changes in 20 lines of code than to change (and understand) 5 lines that do the same. Think loop.
 
Try removing the "\n" in the scanf calls, for example scanf("%f",&A[0][2]); without the "\n". scanf() is supposed to skip past whitespace on each call.
 
  • Like
Likes darwinharianto
jim mcnamara said:
Does your problem statement require the use of scanf() ? You may know that scanf returns an int - you have to compare the int returned against EOF (# a define in stdio.h). This checks for a matching failure. Also note that what is already in the keyboard buffer carries over to the next scanf call, e.g., the return key.

Decent programs try to avoid having multiples of the same statement over and over again. Why? Because it is harder to make changes in 20 lines of code than to change (and understand) 5 lines that do the same. Think loop.
yes i need the scanf because i have to input numbers on the matrix

rcgldr said:
Try removing the "\n" in the scanf calls, for example scanf("%f",&A[0][2]); without the "\n". scanf() is supposed to skip past whitespace on each call.
thank you
when i removed the "/n" it does solve the problem
 
C has looping features.

scanf("%f",&A[0][0]);
scanf("%f",&A[0][1]);
scanf("%f\n",&A[0][2]);
// through magic, increase a number by 1.
scanf("%f",&A[1][0]);
scanf("%f",&A[1][1]);
scanf("%f\n",&A[1][2]);
// through magic, increase a number by 1.
scanf("%f",&A[2][0]);
scanf("%f",&A[2][1]);

Is really ugly. What if you had a 4 x 4 ? 6 x 6 ?
 
  • Like
Likes darwinharianto
mafagafo said:
C has looping features.

scanf("%f",&A[0][0]);
scanf("%f",&A[0][1]);
scanf("%f\n",&A[0][2]);
// through magic, increase a number by 1.
scanf("%f",&A[1][0]);
scanf("%f",&A[1][1]);
scanf("%f\n",&A[1][2]);
// through magic, increase a number by 1.
scanf("%f",&A[2][0]);
scanf("%f",&A[2][1]);

Is really ugly. What if you had a 4 x 4 ? 6 x 6 ?
so it is better if i scanf the "n" and put it into a loop
if

so my loop will be like this?
Code:
for (i=0; i<=n; i++)
          for (j=0; j<=n; j++)
          scanf("%f";&A[i][j][I]);
for my input?[/I]
 
Supposing you code works (not going to compile and check for you), yes, this is the way to go. See how simpler and easier to refactor it got?

Note that if n is the dimension of the square matrix (3, for instance), you want i < n as 3 would refer to the fourth row or column.

Good luck.
 
mafagafo said:
Supposing you code works (not going to compile and check for you), yes, this is the way to go. See how simpler and easier to refactor it got?

Note that if n is the dimension of the square matrix (3, for instance), you want i < n as 3 would refer to the fourth row or column.

Good luck.
yes
sorry about that
i forgot it go n-1
thanks
 
mafagafo said:
Supposing you code works (not going to compile and check for you), yes, this is the way to go. See how simpler and easier to refactor it got?

Note that if n is the dimension of the square matrix (3, for instance), you want i < n as 3 would refer to the fourth row or column.

Good luck.
okay i have done it all, but i can't display them at the end of the code
i use this
Code:
    for(i=0; i<n+1; i++)
    printf("\n X[i] = %f",x[i]);
how can i make it display x1, x2 ... xn ?
 
  • #10
Supposing that from a bidimensinoal array you want something like:
\begin{array}{cc} a_{1, 1} &amp; a_{1, 2} \\ a_{2, 1} &amp; a_{2, 2} \end{array}

You should iterate i and j and get
Code:
a[j][i]

Placing ", " between terms on the same row (same value of j) and "\n" after the last term of a row.
 
  • #11
mafagafo said:
Supposing that from a bidimensinoal array you want something like:
\begin{array}{cc} a_{1, 1} &amp; a_{1, 2} \\ a_{2, 1} &amp; a_{2, 2} \end{array}

You should iterate i and j and get
Code:
a[j][i]

Placing ", " between terms on the same row (same value of j) and "\n" after the last term of a row.
maybe you get me wrong,
i mean i want to display X1 X2, ... Xn
not the full matrix
so the results will be like
X1 = ...
X2 = ...
X3 = ...
X4 = ...
for 4x4 matrix
 
  • #12
Yes, I got you wrong. So why are you having trouble with that?

C:
for (int i = 0; i < 4; i++) {
  printf("X%d = %d\n", i + 1, a[row_index - 1][I]);
}

Is this what you want?
 
  • Like
Likes darwinharianto
  • #13
mafagafo said:
Yes, I got you wrong. So why are you having trouble with that?

C:
for (int i = 0; i < 4; i++) {
  printf("X%d = %d\n", i + 1, a[row_index - 1][I]);
}

Is this what you want?
ahh, yes
thank you so much
 
  • #14
No problem. Are you new to programming? Why are you using C?
 
  • #15
mafagafo said:
No problem. Are you new to programming? Why are you using C?
yeah i am new to C
just a project for my test
 

Similar threads

Replies
3
Views
1K
Replies
12
Views
2K
Replies
3
Views
1K
Replies
9
Views
4K
Replies
1
Views
4K
Replies
4
Views
1K
Replies
1
Views
10K
Back
Top