[C#] Iloczyn kolumny w tabeli


(Iamnothouse) #1

Samo stworzenie programu na iloczyn kolumny z tabeli samo w sobie nie jest trudnym problemem. Wszystko zmienia się w momencie gdy iloczyn ma być tylko liczony gdy w danej kolumnie znajdują się tylko elementy ai>1,3. Jak podejść do takiego zdania ? Niestety moje nieudolne próby zakończone były albo brakiem jakichkolwiek wypisań, bądź też masakrycznych błędów. Czy byłby ktoś w stanie wyjaśnić mi jak i kiedy coś takiego powinno być sprawdzane ?


(Tomek Matz) #2

W danej kolumnie, czy w całej macierzy muszą być większe od 1.3 ? Poza tym wypadałoby pokazać jakiś kod, coś co już próbowałeś samemu zrobić (choćby było złe).


(Iamnothouse) #3

Zadeklarowałem tylko tablice, a później napisałem dwa fory, by pierwszy przechodził od kolumny do kolumny, a drugi mnożył. Ale jak widać nie działało to zbyt dobrze.

-- Dodane 06.12.2011 (Wt) 21:18 --

Jak jest w kolumnie mniejsza liczba choć jedna od 1.3 to ma nie wykonywać iloczynu


(Tomek Matz) #4

Pokażesz ten kod, czy nie (już dawno bym Ci to poprawił) ? :slight_smile: Poza tym zdajesz sobie sprawę z tego, że macierz może mieć dowolną liczbę kolumn? Skąd mam/y wiedzieć, w której kolumnie wartości mają być większe od 1.3? Poza tym, czy ten warunek tyczy się kolumny tylko jednej macierzy, czy każdej z tych dwóch macierzy? Opis tego co musisz zrobić jest nieprecyzyjny.


(Iamnothouse) #5

No tak, przepraszam, jak człowiek nie pamięta co robi to tak jest. Oto całe polecenie: Napisać program dla obliczenia iloczynów elementów każdej kolumny tablicy A[m][n] dla których ai>1,3. Przepraszam za pomyłkę


(Tomek Matz) #6

Dla mnie to polecenie wciąż niestety nie jest zrozumiałe. Załóżmy mamy taką macierz:

1 2 3

4 5 6

W wyniku powinienem dostać:

1) liczbę, czyli 2*5*3*6 = 180

2) wektor, czyli [2*5, 3*6] = [10, 18]

3) jeszcze coś innego? A jeśli coś innego, to dlaczego?


(Iamnothouse) #7

Iloczyn 1 Kolumny nie jest liczony bo jeden z elementów jest mniejszy od 1,3

Iloczyn 2 Kolumny = 10

Iloczyn 3 Kolumny - 18

I tutaj chodzi o tablicę 2 wymiarową a nie macierz


(Danioss) #8

To macierz nie może być 2x2 ?

No i co za problem dodać jeszcze jednego ifa sprawdzającego, czy jakiś element tablicy jest mniejszy od 1.3 ?


(Iamnothouse) #9

No i tego właśnie nie wiem, jak zrobić by sprawdzał każdy element kolumny przed iloczynem


(Danioss) #10

no w pętli for musisz jeszcze zagnieździć if'a sprawdzającego czy dany element tablicy (kolumny, konkretniej) jest mniejszy od 1.3. Jeśli jest, to nie przerwij mnożenie i wydrukuj na ekranie FAIL, a jeśli wszystkie są większe, kontynuuj mnożenie.

Napisz, to sprawdzimy :slight_smile: Bo jak na razie, to w ogóle kodu nie zamieściłeś!


(Iamnothouse) #11

A po co mam zamieszczać skoro chyba każdy potrafi zadeklarować tabelę ?


(Danioss) #12

do usranej śmierci tak można dyskutować. skoro Ty nawet nie zrobiłeś tego mnożenia, to o czym tu mowa? spróbuj coś od siebie dać, to będziemy poprawiać.


(Iamnothouse) #13

Gdybym potrafił, zrobiłbym


(Tomek Matz) #14
using System;

using System.Collections.Generic;


namespace ConsoleApplication4

{

    class Program

    {

        static void Main(string[] args)

        {

            double[,] matrix = {

                                  {2,1,4,5},

                                  {4,5,6,1.4},

                                  {2.3,2,1,6}

                              };


            foreach (double d in Multiply(matrix))

                Console.WriteLine(d);

        }


        static double[] Multiply(double[,] matrix)

        {

            List result = new List();


            for (int i = 0; i < matrix.GetLength(1); i++)

            {

                double value = 1;

                bool add = true;


                for (int j = 0; j < matrix.GetLength(0); j++)

                {

                    if (matrix[j, i] > 1.3)

                        value *= matrix[j, i];

                    else

                    {

                        add = false;

                        break;

                    }

                }


                if (add)

                    result.Add(value);

            }


            return result.ToArray();

        }

    }

}

(Iamnothouse) #15

a prościej się jakoś nie da ? Bo niestety nie wiem nawet jak ten program działa. Tym bardziej nie widzę żadnego efektu działania programu.

Ale wielkie dzięki ! Już mam jakąś podstawę do rozważań

-- Dodane 07.12.2011 (Śr) 16:42 --

Ma ktoś pomysł na prostsze rozwiązanie ?

-- Dodane 07.12.2011 (Śr) 18:27 --

namespace ConsoleApplication4

{

    class Program

    {

        static void Main(string[] args)

        {

            double[,] matrix = {

                                  {2,1,4,5},

                                  {4,5,6,1.4},

                                  {2.3,2,1,6}

                              };


            int i, j, wiersze, kolumny;

            int suma = 1;

            for (i = 0; i < wiersze; i++)

            {

                for (j = 0; j < kolumny; j++)

                    suma += matrix[i][j];




            }

        }

    }

}

Oto moja wersja programu, jak to sensownie zmienić by działało ?


(Tomek Matz) #16

Teraz to wrzuciłeś kod :slight_smile: Szkoda, że musiałem się dwukrotnie o to prosić. Czy mógłbyś napisać, co jest dla Ciebie niezrozumiałe w kodzie, który wrzuciłem (być może da się napisać prościej, ale ja prościej nie potrafię) i co masz na myśli mówiąc, że program nie daje żadnego efektu?


(Grzelix) #17
namespace ConsoleApplication4

{

    class Program

    {

        static void Main(string[] args)

        {

            double[,] matrix = {

                                  {2,1,4,5},

                                  {4,5,6,1.4},

                                  {2.3,2,1,6}

                              };


            int i, j, wiersze, kolumny;

            int iloczyn = 1;

            for (i = 0; i < wiersze; i++)

            {

                for (j = 0; j < kolumny; j++)

                {

                     if(matrix[i][j]>1.3)

                        iloczyn *= matrix[i][j];

                     else

                        iloczyn = 0.0;  

                }

               if(iloczyn > 0.0) Console.write(iloczyn);

            }


        }

    }

}

pisałem z palca więc może być literówka


(Tomek Matz) #18

@grzelix

Kod jest niepoprawny.

  1. Nie inicjalizujesz zmiennych.

  2. int iloczyn = 1; znajduje się w niewłaściwym miejscu.

  3. Zewnętrzna pętla powinna iść po kolumnach, a nie po wierszach.

  4. Zamiast używać zmiennych wiersze/kolumny można użyć świetnej metody GetLength.


(Grzelix) #19

@matzu to nie jest mój kod, ja w życiu nie podpisał bym się pod tak napisanym kodem, jedyne to czego się otwarcie przyznaję to ten fragment:

if(matrix[i][j]>1.3)

                        iloczyn *= matrix[i][j];

                     else

                        iloczyn = 0.0;  

                }

               if(iloczyn > 0.0) Console.write(iloczyn);

czyli zarys pomysłu jak to zrobić aby użytkownik @IamNotHouse zrozumiał, ponieważ to jest jego kod plus ten fragment, który pokazuje warunek sprawdzający liczbę w danej komórce, wstawia zero w iloczyn jeśli jest mniejsza od 1.3. Jest rozwiązanie mało praktyczne ale w minimalny sposób ingeruje w to co użytkownik już potrafi. I jeśli nie zrozumie jak ten program działa to ja nie wiem jak mu pomóc.

Natomiast wady tak napisanego kodu - mogę twoją listę rozszerzyć spokojnie o kolejne punkty. Ale czy jest sens?


(Tomek Matz) #20

@grzelix

Ale właśnie chodzi o to, że ten program nie działa. Co autorowi tematu da to, że dopisałeś do niedziałającego programu parę linijek? Co ma z tego zrozumieć? Jeśli chciałeś pokazać tylko i wyłącznie warunek, to ja już to zrobiłem kilka postów temu :slight_smile: