1 / 38
May 2009

Wtiam
Mam pytanie, co tu jest źle? Dla przykładowych danych z pl.spoj.pl/problems/TRN/40 mi wyszło confused Oto kod:

#include <iostream>
//#include <conio.h>
using namespace std;
int m,n,s;
float liczba[9999];
int main()
{
     cin >> m >> n;
     for (int i=0; i < m*n; i++)
     {
         cin >> liczba[i];
     }
     for (int k=0; k < n; k=s)
     {   
         s=k;
         for (; k < n*m; k=k+m-1)
         {
             cout << liczba[k] << " ";
         }
         cout << "\n";
         s++;
      }
 //getch();
}

Pozdrawiam

  • created

    May '09
  • last reply

    Jan '24
  • 37

    replies

  • 3.7k

    views

  • 23

    users

  • 5

    likes

  • 4

    links

Dla testu:

3 3
1 2 3
4 5 6
7 8 9

powinno wyjść:

1 4 7
2 5 8
3 6 9

a Tobie wychodzi:

1 3 5 7 9
2 4 6 8
3 5 7 9

Dzięki, przeszło. Błąd był tutaj:
zamiast

for (; k < n*m; k=k+m-1)

powinno być

for (; k < n*m; k=k+n)

Bezmyślnie wcześniej tam zmieniłem jak nie wychodziło i dla tego przypadku ze strony się akurat zgadzało, bo m-1=n.

5 months later

Może mi ktoś powiedzieć co złego jest w tym kodzie. Wiem, że nie jest doskonały, ale przykładowe testy przechodzą.

#include <iostream>
#include <cmath>
using namespace std;
int x, y, z;
int main ()
{
    cin>>x>>y;
    int tabl[x][y];
    int tabl2[y][x];
    for(int i=1;i<=x;i++)
    {
            for(int w=1;w<=y;w++)
            {
                    cin>>tabl[i][w];
            }
    }
    for(int e=1;e<=y;e++)
    {
    for(int q=1;q<=x;q++)
    {
            tabl2[e][q]=tabl[q][e];
    }
}
    for(int r=1;r<=y;r++)
    {
            for(int p=1;p<=x;p++)
            {
                    cout<<tabl2[r][p]<<" ";
            }
            cout<<endl;
}
    cin.ignore();
getchar();
return 0;
}

Po pierwsze, musisz dać jedno miejsce więcej do tablicy, bo pierwszą komórką tablicy jest nie 1, tylko 0.
Tak więc zawsze lepiej dawać na przykład:
cin>>x>>y;
int tab[x[b]+10[/b]][y[b]+10[/b]];
na wszelki wypadek. wink

Po drugie, po co Ci to: cin.ignore(); i getchar(); ? Co to wg Ciebie robi?

3 years later

Witam.
Programuję od niedawna w Pascalu. Mógłby mi ktoś powiedzieć, co tu jest źle? Z góry dzięki za pomoc. wink

 Tu był kod.
1 year later
10 months later

Przy równych wymiarach i gdy n jest większe od m program działa. Jednak gdy m jest większe od n występuje błąd ochrony pamięci. Nie wiem czemu tak jest, przecież cała tablica jest już zainicjowana przed wpisywaniem wartości.

edit. AC, usunąłem kod.

6 months later

Wali NZEC'iem jakiś pomysł?
Program w C#
EDIT:
jeszcze wpadł mi do głowy pomysł, że to przez tego stringa w tablicach ale zmieniłem na inty i dalej to samo frowning

using System;

namespace 1042.Transponowaniemacierzy___TRN
{
class Program
{
static void Main(string[] args)
{
string line;
int columns=0, rows=0;

        line = Console.ReadLine();

        string[] split = line.Split(' ');

        rows = Convert.ToInt32(split[0]);
        columns = Convert.ToInt32(split[1]);
        string[,] macierz = new string[rows, columns];
        string[,] transponowana = new string[columns, rows];
        for(int i =0; i < rows; i++)
        {
            line = Console.ReadLine();
            string[] split1 = line.Split(' ');
            for(int j = 0; j < split1.Length; j++)
            {
                macierz[i, j] = split1[j];
            }
        }

        for(int i =0; i < columns; i++)
        {
            for(int j =0; j < rows; j++)
            {
                transponowana[i, j] = macierz[j, i];
            }
        }

        for(int i =0; i < columns; i++)
        {
            for(int j =0; j < rows; j++)
            {

                if (j != rows - 1)
                    Console.Write(transponowana[i, j] + " ");
                else if (i == columns - 1)
                    Console.Write(transponowana[i, j]);
                else
                    Console.WriteLine(transponowana[i, j]);

            }
        }
    }
}

}

4 months later

Cześć :smiley: nie mam pojęcia dlaczego kod nie przechodzi :confused: u mnie działa poprawnie. Pisane w javie:

`import java.util.*;
import java.lang.*;

class Main
{
public static void main (String[] args) throws java.lang.Exception
{
int m,n;
Scanner scan= new Scanner(System.in);
m=scan.nextInt();
n=scan.nextInt();

	int tab[][]=new int [m][n];
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++){
			tab[i][j]=scan.nextInt();
		}

	int tab2 [][]=new int [n][m];
	for(int j=0; j<n; j++)
		for(int i=0; i<m; i++){
			tab2[j][i]=tab[i][j];
		}
	for(int j=0; j<n; j++){
		for(int i=0; i<m; i++){
			System.out.print(tab2[j][i]+ " ");
		}
		System.out.println();
	}
}

}`

7 months later
#include <iostream>

int n, m;

using namespace std;

int main()
{
    cin >> m >> n;
    int t[m][n];
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=n;j++)
        {
            cin >> t[i][j];
        }
    }
        for (int i=1;i<=n;i++)
    {
        for (int j=1;j<m;j++)
        {
            cout << t[j][i] << " ";
        }
        cout << t[m][i];
        cout << endl;
    }

    return 0;
}

bardzo prosze o pomoc xd wyniki dzialaja, spacje sa opanowane ale cos nie smiga ...

nie smiga bo dostajesz (SIGSEGV) ...
jezeli robisz sobie dla przykładu tablice: int t[2]; to masz w niej dwa elementy o indeksach 0 oraz 1...
wiec zawolanie np std::cin >> t[2]; konczy sie SIGSEGV...

1 month later

Niby najprostsze zadanie, a nie mogę pogodzić się z sędzią: "Błędna odpowiedź".
Zestawy testowe działają.

Czy jest ktoś w stanie wskazać błąd w tym kodzie?

(kod usunięty)

Poprawny out:

1 4 3 8
2 3 4 7
5 3 9 7

Twój out:

5 x \n
1438
2347
5397

Poza tym wygląda ok.

Out się zgadzał. Błąd polegał na tym, że "endl" był w złym miejscu. Trochę niedokładnie sprecyzowane polecenie moim zdaniem, ale pokombinowałem i dostałem AC. Dzięki za pomoc.
Usuwam kod źródłowy.

1 month later

Cześć!
Co się nie zgadza w tym kodzie?
...tu był kod...
Dla różnych wartości jakie wpiszę program się wykonuje, mimo tego sędzia pokazuje mi "NZEC". Spacje czy entery są uwzględnione. Z czego wynika problem?

Już nieaktualne :slight_smile:

1 month later

Poniższy kod generuje werdykt przekroczony limit czasu. Czy można przyśpieszyć poniższy kod, czy konieczne będzie inne rozwiązanie?
`Scanner in = new Scanner(System.in);
int w = in.nextInt();
int k = in.nextInt();
int[] values = new int[w*k];

        for(int i=0;i<w*k;i++){
            values[i]=in.nextInt();
        }

        for(int i=0;i<k;i++){
            for(int j=0;j<w;j++){
                System.out.print(values[i+j*k] + " ");
            }
            System.out.println();
        }`

Możesz spróbować wyprowadzić dane poprzez StringBuilder, ale podejrzewam, że sama zmiana wyjścia nie wystarczy. Na wejściu można spróbować wczytać wszystkie dane do stringa i samemu potem go pociąć.

Zdecydowanie łatwiej przejść na C/C++ :slight_smile: