

![]() |
![]() |
|
|||||||
![]() |
![]() |
| programowanie języki, projekty, pomoc, oprócz html, php, js |
![]() |
|
|
LinkBack | Narzędzia wątku | Wygląd |
![]() |
![]() |
|
|||
|
Cześć wszystkim . Od jakiegoś tygodnia męczę się z podstawami c++ i mam taki problem. Wczytuje sobie pliczek w którym jest ciąg znaków bez spacji.
Po wczytaniu tego pliku do string s, poszczególne litery wpisać do tablicy 2 wymiarowej w taki sposób żeby tablica wypełniała się kolumnami a nie wierszami. napisałem to w 2 pętlach ale wywala mi podczas wykonywania programu. Podam przykład: string s posiada znaki abcdefghi a w tablicy ma się znaleźć adg beh cfi A tak starałem się to rozwiązać: Kod:
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <vector>
using namespace std;
int main ()
{
cout << " Nazwa pliku: ";
cin >> nazwa_pliku ;
string s;
ifstream plikWe( nazwa_pliku.c_str(),ios::in );
plikWe>>s;
int n;
n=s.length();
cout << "Ilosc znakow : " ;
cout << n ;
int m;
cout << "podaj zakladana dlugosc klucza"<<endl ;
cin >> m ;
int x=(n/m);
cout<<x<<endl;
int k,i,j;
char tabl[m][x];
k=0;
cout<<s[0]<<endl;
for (j=0;j<=x;j++){
for(i=0;i<=m;++i) {
tabl[i][j]= s[k];
++k;
}
}
system ("pause");
return 0;
}
Ostatnio edytowane przez paczaja ; 10.11.2009 o 17:07. |
![]() |
![]() |
![]() |
![]() |
|
|||
|
jeśli chcesz tworzyć tablicę o rozmiarze nieznanym w trakcie kompilacji musisz ją stworzyć dynamicznie czyli (dla tablicy 2 wym.):
Kod:
char** tab = new char* [m] for(int i=0;i<m;++i) tab[i] = new char [x]; PS dziwne jest to, że kompilator dołączony do dev-a (mam wersję 4.9.9.2) nie wyrzucił błędu a powinien!!! |
![]() |
![]() |
![]() |
![]() |
|
|||
|
No więc tak, zrobiłem intuicyjnie tak jak napisałeś tylko ,Przy wypistwaniu ostatecznej tabeli wypisuje kilka znaków i wywala program. Moze jest to problem spowodowany tym ze nie zwalniam pamięci ale powiem bardzo lamersko ze nie wiem gdzie wsadzić to delete[]; i w jakiej formie tzn samo delete?? Dieki ci za wszelką pomoc. Pozdro.
Kod:
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <vector>
using namespace std;
int main ()
{
string nazwa_pliku ;
cout << " Nazwa pliku powinna byc bez rozszerznia" ;
cout << "i w tym samym katalogu" << endl;
cout << " Nazwa pliku: ";
cin >> nazwa_pliku ;
string s;
ifstream plikWe( nazwa_pliku.c_str(),ios::in );
plikWe>>s;
int n;
n=s.length();
cout << "Ilosc znakow : " ;
cout << n ;
int m;
cout << "podaj zakladana dlugosc klucza"<<endl ;
cin >> m ;
int x=(n/m);
cout<<x<<"ilosc znakow w wierszu"<<endl;
int k=0; //wypisanie zawartosci tablicy
for (int u=0; u<=n; u++)
{
cout << s[u];
}
system ("pause");
char** tabl = new char* [m];
for(int i=0;i<m;++i) {tabl[i] = new char [x];}
for (int j=0;j<x;j++){ // zapisanie tab kolumnami do tabl
for(int i=0;i<m;++i) {
tabl[i][j]= s[k];
++k;
}
}
for (int i=0; i<=x; i++) {
for (int j=0;j<=m;j++){
cout << tabl[i][j];
}
}
system ("pause");
return 0;
}
Ostatnio edytowane przez paczaja ; 10.11.2009 o 17:07. |
![]() |
![]() |
![]() |
![]() |
|
|||
|
ogólnie to nie wiem do końca co chcesz osiągnąć, szczególnie zagadkowy jest dla mnie ten 'klucz'
przy pracy z tablicami trzeba uważać zeby nie wyjśc poza zakres, więc przeglądnij sobie wszystkie pętle bardzo dokładniea to możliwa przyczyna twoich problemów: skoro s jest stringiem to zamiast: Kod:
for (int u=0; u<=n; u++)//tu masz błąd musi być u<n bo numerujemy od 0
{
cout << s[u];
}
i uważaj na obliczanie x bo to dzielenie nie zawsze będzie całkowite i np. przy n=14 m=5 x wyjdzie 2!!! a 2*5=10 czyli 'utniesz' sobie trochę danych |
![]() |
![]() |
![]() |
![]() |
|
|||
|
No wiec tak odpowiadając na twoje putanie cały program ma służyc do deszyfracji. Długosc klucza to jest to ilosc znaków szyfrujących np m . na podstawie tego tworzymy macierz [m,ilość znaków tekstu zaszufrowanego/m]. Następnie do macierzy wpisujemy co m-ty znak czyli pionowo macierz wypełni sie pokolei literami. A co do programu. to działa ale na samym koncu przywypisywaniu gotowej macierzy wypisuje kilka znaków i winda wywala błąd. Być moze w tej petli jest cos nie tak.
for (int i=0; i<=x; i++) { for (int j=0;j<=m;j++){ cout << tabl[i][j]; } } A co do dzielenie to moze mi ucinac to nie bedzie wpływac na kryptoanalize szyfru Vigenère'a. Mozna by zrobic zeby zaokrąglał dzielenie w góre ale jeszcze nie doszedłem do tego i nie zastanaiałem sie na tym Ostatnio edytowane przez timi001 ; 09.11.2009 o 00:43. |
![]() |
![]() |
![]() |
![]() |
|
|||
|
widzisz nie czytasz uważnie: nie możesz mieć w pętli przy wypisywaniu warunku i<=x oraz i<= m tylko zamiast '<=' musi być '<' bo tablice numerujemy od 0 czyli numery komórek są od 0 do x-1
|
![]() |
![]() |
![]() |
![]() |
|
|||
|
Niestety program wywala błąd ze wykonał nieprawidłową operacje. Jak chcesz to mogę co wystawić plik który ma zostac przerobiony i sam sprawdzisz. Przyjmij sobie długość klucza np 3 .
http://www.speedyshare.com/137710637.html |
![]() |
![]() |
![]() |
![]() |
|
|||
|
mówiłem żebyś sprawdził uważanie wszystkie pętle
i zmień:Kod:
for (int u=0; u<=n; u++)
{
cout << s[u];
}
Kod:
cout<<s; a problemem jest ostatnia pętla for: zamiast: Kod:
for (int i=0; i<=x; i++) {
for (int j=0;j<=m;j++){
cout << tabl[i][j];
}
}
Kod:
for (int i=0; i<=x; i++) {
for (int j=0;j<=m;j++){
cout << tabl[j][i];
}
}
|
![]() |
![]() |
![]() |
![]() |
|
|||
|
Witam ponownie dzięki za wasze odpowiedzi, dzięki nim udało mi się wybrnąć z sytuacji. Natomiast natrafiłem na kolejny problem. Męczę go już 2 dni i na wiele sposobów . Problem wygląda tak jak we wcześniejszych postach podałem załadowany plik mam w stringu s. Teraz chciałbym wybrać kilka pierwszych liter np 3. Następnie przeszukać tego stringa od s[3] (bo litery wzorcowe odpadają) i przechodząc o jeden znak dalej szukać powtarzających się ciągów liter. W momencie kiedy trafi na taki sam ciąg liter ma wpisać do tablicy odległość między tymi ciągami.
Podam przykład : abcjkgoabcjkgoabcjkgo Widać ze odległość między ciągami takimi samymi jest 4. Teoretycznie problem trywialny wpisanie do np tablicy poszczególnych liter a następnie wpisując do 2-giej tablicy kolejne przesunięte litery porównać tablice na tych samych pozycjach jeżeli tak to wpiać licznik do tablicy odleglośći,wyzerować licznik i ..... Moze macie jakieś propozycje. Ostatnio edytowane przez paczaja ; 19.11.2009 o 18:03. |
![]() |
![]() |
![]() |
| Narzędzia wątku | |
| Wygląd | |
|
|
Podobne wątki
|
||||
| Temat | Autor wątku | Forum | Odpowiedzi | Ostatni post/autor |
| Problem z wpisaniem do tablicy 2 wymiarowej | timi001 | programowanie | 1 | 09.11.2009 00:31 |
| c++ wczytanie z pliku do tablicy 2-wymiarowej | kamilos876 | programowanie | 4 | 29.03.2009 00:31 |
| [Schematy Blokowe] Suma elementów tablicy 2-wymiarowej. | Adriano7 | programowanie | 1 | 23.02.2009 21:47 |
| [PHP][MySQL] Sorotwanie tablicy, wyciągniecie posortowanych danych z tablicy | Golaod | tworzenie stron | 2 | 28.04.2008 12:04 |
| [C] Dynamiczna alokacja pamieci dla tablicy 2-wymiarowej - zakresy, czasy zycia??? | BLaDe_ND | programowanie | 2 | 27.03.2007 22:04 |
| Wszystkie czasy w strefie GMT +2. Teraz jest 06:38. |

