• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Transpozycja macierzy w C i kilka drobiazgów

Object Storage Arubacloud
0 głosów
883 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez J0ker Pasjonat (15,400 p.)
edycja 29 grudnia 2016 przez J0ker

Dzień dobry! To mój pierwszy post na tym Forum i mam nadzieję, że nie spłynie na mnie fala hejtu.
Odwiedzam forum od paru miesięcy (zwłaszcza chat IRC) ale dopiero dzisiaj się zarejestrowałem.

Jestem studentem 1. roku matematyki, ale mam przedmiot "Wstęp do informatyki", gdzie jest nieco programowania w C. Do 13 stycznia muszę oddać program zaliczeniowy i mam z nim problem.

Treść programu : Napisz program, który dla macierzy odczytanej z pliku (pierwszy wiersz pliku to wymiary macierzy) wyprowadzi jej transpozycję (do innego pliku lub na ekran - wybiera użytkownik programu) oraz stwierdzi jeśli ta macierz jest symetryczna lub antysymetryczna.

Na zajęciach było tuż przed świętami na ostatnim wykładzie i ostatnich ćwiczeniach na szybko omawiane takie rzeczy jak fprintf,fscanf fopen fclose i parę innych. 
Mam kilka problemów:

1. Zakładam z grubsza, że wymiary macierzy są jednocyfrowe bo to bardzo ułatwia. 
Poniżej wklejam swój kod który jak na razie tylko deklaruje parę rzeczy, otwiera plik który mam w tym samym folderze co program i odczytuje wymiary macierzy z pierwszej linijki programu i konczy dzialanie programu jesli ktos przez pomylke wpisal w plik niedodatni wymiar macierzy. To zadanie mnie przerasta więc zamierzałem je robić małymi etapami dlatego tylko tyle na razie. 
2. Teraz zamierzam zrobić wybór gdzie ma być przekazana transpozycja i dopiero ją zrobić po wyborze. A może uważacie, że lepiej najpierw niech komputer wyliczy transpozycję a potem kazać użytkownikowi wybrać?


3. Nie wiem za bardzo jak odczytać te elementy macierzy które mam napisane w pliku bo zadanie nie określa, że one są jednocyfrowe, ba, nawet nie określa, że te liczby są integerami. Jakbym odczytywał po jednym znaku to by działało tylko przy założeniu, że elementy tablicy są cyframi. Jeśli mogą tam być liczby dwu i więcejcyfrowe to już by było źle, nie mówiąc o floatach gdzie są kropki..... Zupełnie nie wiem co zrobić. Chciałbym żeby to działało nawet dla liczb typu 83.54. Bo pewnie odbije się to na ocenie jeśli ograniczę zadanie do jednocyfrowych liczb.
4. Z określeniem symetryczności lub antysymetryczności sobie poradzę, może nawet z tym wyborem czy transpozycja do nowego pliku czy do konsoli, ale nie jestem w stanie się zabrać za te elementy dopóki nie będzie to odczytanie z pliku należycie zrobione i sama transpozycja...................
Z góry dziękuję za każdą pomoc. 


  

UPDATE: Poprawiłem błąd - była duża literka zamiast małej i to wysypywało: Oto co mam na chwilę obecną:

#include <stdio.h>
#include <stdlib.h>

int main()
{ int M; int N;
int I; int J;
 int Matrix[M][N];
 int TransposedMatrix[N][M];

    FILE *macierz;
    macierz = fopen("macierz.txt", "r");
fscanf(macierz,"%d%d",&M,&N);
if (M<=0||N<=0){return 0;}
else {printf("Udalo sie odczytac");}
printf("Wymiary macierzy to:%d\n%d",M,N);
fclose(macierz);
    return 0;
}

Update 3: Dobra już mam zapomniałem że istnieje coś takiego jak %f i tym wczytuje elegancko floaty.... 
 

3 odpowiedzi

+2 głosów
odpowiedź 29 grudnia 2016 przez morele123 Gaduła (4,790 p.)
Nie przeczytałem twoje postu. Taka rada jak piszesz temat to pisz od razu o co ci chodzi, nikogo nie interesuje kim jesteś i jakie masz plany na życie.
komentarz 29 grudnia 2016 przez J0ker Pasjonat (15,400 p.)
Polecam Panu książkę Paulo Coelho "Być jak płynąca rzeka.", po jej lekturze na pewno przestanie Pan uznawać Prawo Jante.

Pozdrawiam i życzę miłego wieczoru.
0 głosów
odpowiedź 29 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
Miałem podobne zadanie do zrobienia do końca zajęć czyli jakąś godzinę.

 

int Matrix[M][N]; <- to daj po odczycie rozmiaru

int TransposedMatrix[N][M]; <- to daj po odczycie rozmiaru

FILE *macierz;

macierz = fopen("macierz.txt", "r");

fscanf(macierz,"%d%d",&M,&N);

<- Czyli tutaj

 

Odczyt matrixa zrób w dwóch pętlach - for w forze.
komentarz 29 grudnia 2016 przez J0ker Pasjonat (15,400 p.)
No ale ja właśnie największy problem mam z tym odczytem jak go wykonać:

Nie wiem czego użyć żeby elegancko odczytać liczby różnego pokroju.

O forze w forze wiedziałem.
komentarz 29 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)

Liczby? Co masz w specyfikacji zadania o liczbach? Wydaje mi się, żeby zrobić double i strumień. Czyli:

 ifstream  inputFile;

double d;

string::size_type sz; // alias of size_t

inputFile.open("slowa.txt");

while (!inputFile.eof()) {

        inputFile >> item;

        d = stod (item,&sz);

}

http://www.cplusplus.com/reference/string/stod/

komentarz 29 grudnia 2016 przez J0ker Pasjonat (15,400 p.)
Takich rzeczy w ogóle nie mieliśmy na zajęciach....ani zadnego ifstream ani zadnego stod.
Jak z tego skorzystam to sobie pomyślą, ze ktoś mi napisał ten program.

Czy nie da sie jakimis fscanfami getchami getcharami fgetcami czy czymkolwiek takim zrobić coś takiego żeby odczytać liczby po prostu oddzielone spacjami?
0 głosów
odpowiedź 29 grudnia 2016 przez niezalogowany
edycja 30 sierpnia 2017

W punkcie pierwszym możesz zrobić tak:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int M; int N;
    int I; int J;
    int Matrix[M][N];
    int TransposedMatrix[N][M];

    FILE *macierz;
    while(true) // petla dzialajaca caly czas
    {
        macierz = fopen("macierz.txt", "r");
        fscanf(macierz,"%d%d",&M,&N);

        if(M<=0 || N<=0)
        {
            printf("Nie udalo sie odczytac. Zmien dane w pliku macierz.txt i wcisnij jakikolwiek przycisk");
            getchar(); // wczytanie znaku
        }
        else
        {
            printf("Udalo sie odczytac");
            break; // przerwanie petli
        }
    }

    printf("Wymiary macierzy to: %d %d",M,N);

    fclose(macierz);
    return 0;
}
komentarz 29 grudnia 2016 przez J0ker Pasjonat (15,400 p.)
edycja 29 grudnia 2016 przez J0ker
Ale nie nie nie, to zadanie nie jest podzielone na punkty to ja tak napisałem je niepotrzebnie. Ja po prostu do tej pory napisałem tylko odczytanie wymiarów macierzy bo jest to oczywiste zaś nie wiem jak się zabrać za odczytanie elementów macierzy. Dlatego nie ma sensu zamykać tego pliku po odczytaniu wymiarów.

Chodzi mi tylko o to w tej chwili jak te elementy macierzy odczytać ale nie znak po znaku bo mogą być liczby więcej niż jedno cyfrowe.

Ja ten program mam oddać jako jedną całość a nie w częściach.
komentarz 29 grudnia 2016 przez niezalogowany
Po prostu chciałem pomóc w rozwiązaniu chociaż jednego problemu z listy ("Mam kilka problemów:"). Nie znam się za bardzo na C. Dlatego pominąłem inny problem z listy czyli wczytywanie liczb zmiennoprzecinkowych. Zostawiłem tam puste miejsce, które możesz uzupełnić (między printf a fclose xD). Co chyba jest bardziej logiczne niż oddawanie programu w kilku częściach no nie?

Odczytywanie elementów gdy są liczbami całkowitym jest już proste (całkowite wielocyfrowe, a nie tylko jednocyfrowe). Dwie pętle i jedziesz. Zrób to i będziesz mógł się zająć innymi zadaniami z listy. No chyba, że masz problem z równym wypisaniem takiej macierzy. To wtedy możesz spacjami odpowiednio wyrównać. Prędzej czy później ktoś odpowie na Twój najważniejszy problem to wtedy wymienisz tylko jeden element czyli wczytywanie z pliku.
komentarz 29 grudnia 2016 przez J0ker Pasjonat (15,400 p.)
Nie ma sprawy, dziękuję za to co zrobiłeś. Trzymaj się!!!

Podobne pytania

0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 9 kwietnia 2016 w C i C++ przez sh1nen Obywatel (1,570 p.)
0 głosów
0 odpowiedzi 167 wizyt
pytanie zadane 27 maja 2023 w C i C++ przez natalia2002. Początkujący (370 p.)
0 głosów
1 odpowiedź 1,156 wizyt
pytanie zadane 16 czerwca 2019 w C i C++ przez V3ga Nowicjusz (170 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...