Kodowanie nazwiska

0

Witam mam do napisania program który będzie kodować nazwiska, w taki sposob że każda literka jest przesunieta o jeden indeks do przodu w alfabecie. np z A robi się B. Pomysł mam taki że każdą literkę zamienię na kod ASCII, po zamianie dodam 1, i automatycznie z A stanie się B. Problemem jest natomiast to że nazwisko musi wprowadzić użytkownik. I mam mały problem, zadeklarowałem stringa, i nie wiem jak ustawić wskaznik na każdą literę, skoro wsk to char, a nazwisko jest stringiem. Proszę o Pomoc:)).

#include <iostream>
#include <string>
using namespace std;

//*****************************************//
int main()
{       
        char *wsk; 
	string nazwisko;
	cin >> nazwisko;

	return 0;
}
0

W petli lecisz sobie przez cala dlugosc wyrazu. String to jest zwykla tablica znakow. (tab[i]+=1)przesuwasz; Pamietaj ze jak jest z lub Z to trzeba przypisac A i tyle.

0

Poczytaj o szyfrze cezara. Po to korzysta się z klasy string aby nie trzeba było babrać się wskaźnikami na char. Jednak jak już się chcesz uprzeć to string posiada metodę c_str(). Stringi mają przeciążony operator "[]" więc możesz odwoływać się do nich jak do zwykłych tablic (czyli iterować po nich również) albo możesz skorzystać z iteratorów. Po więcej informacji zapraszam tutaj

0

Dzięki udało mi się poruszyć, program, jak skończę bądź się zawieszę to dam znać :P.

Ale mam jeszcze jedno pytanie
Próbuję stworzyć program który za zadanie ma zapytać użytkownika o nazwę pliku.txt a następnie zapisać do niego dane. Poczytałem o bibliotece <fstream> i dowiedziałem się, jak zapisać i odczytać do istniejących już plików(wklepanych w programie), ale nie udało mi się znaleźć jak zapisać do pliku który podaje Użytkownik przy kompilaji programu.
Proszę o odpowiedz, z góry dziękuję.

Robię to takim sposobem. Lecz zapewne błędnym, bo skąd program będzie wiedzieć jaki to tym dokumentu, oraz skąd ma go wczytać.

int main()
{
    string nazwa;
    cin >> nazwa;
    fstream  f_nowy.open( nazwa ,ios::in);
    return 0;
}

Lista błędów

1>------ Build started: Project: assss, Configuration: Debug Win32 ------
1>Compiling...
1>1.cpp
1>c:\documents and settings\karol\moje dokumenty\visual studio 2008\projects\assss\assss\1.cpp(11) : error C2664: 'void std::basic_fstream<_Elem,_Traits>::open(const wchar_t *,std::openmode,int)' : cannot convert parameter 1 from 'std::string' to 'const wchar_t *'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>Build log was saved at "file://c:\Documents and Settings\Karol\Moje dokumenty\Visual Studio 2008\Projects\assss\assss\Debug\BuildLog.htm"
1>assss - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

0

może i warto by dać typ wyliczeniowy. tak na przyszłość ;)

0

Nie miałem jeszcze tego na wykładach(1 rok EiT), ale poczytałem na wikipedii

na chłopski rozum jest to takie "coś"

Typ wyliczeniowy - w językach programowania rodzaj typu danych zawierający listę wartości reprezentowanych za pomocą literatów wyliczeniowych, jakie może przyjmować zmienna tego typu. Typ wyliczeniowy pełni nieocenioną funkcję w Metaprogramowaniu, gdyż pozwala na tworzenie stałych w chwili kompilacji.

za bardzo nie wiem z czym to się je.

0

Ty miałeś na myśli dane zapisywane w kodach ASCII, ja miałem zasugerowałem zrobienie prostego przyporządkowania liter innym, co rozwiązywać może problem (nie określony w zadaniu) polskich liter.

0

z tym problemem sobie już poradziłem napisałem

#include <iostream>
#include <string>
using namespace std;
int main()
{       
	string nazwisko;
	int ascii[30], n;
	char liczba[30];
	cin >> nazwisko;
	cout << "Długosc wyrazu: " << nazwisko.length() << endl;
	n=nazwisko.length();
	for( int i=0; i<n; i++) 
	{
		ascii[i]=nazwisko[i]; //zamiana char na int
		ascii[i]++; 
		cout << ascii[i]<<"\n"; 
	}
	for( int i=0; i<n; i++)
	{
		liczba[i]=ascii[i];
		cout <<liczba[i];
	}

	char znak;
	cin >> znak;
	return 0;
}

Ale kilka postów wyżej masz inne moje pytanie :P

0

Ja niestety też nie rozumiem o co Ci chodzi, poza tym ten kod to jakieś zboczenie.

#include <iostream>

int main(int argc, char **argv)
{
	std::string nazwisko;
	
	std::cout << "Podaj nazwisko: ";
	std::cin >> nazwisko;
	
	for(unsigned int i = 0; i < nazwisko.length(); i++)
	{
		if(nazwisko[i] == 'z' || nazwisko[i] == 'Z')
			nazwisko[i] -= 25;
		else
			nazwisko[i] += 1;
	}
	
	std::cout << "\n" << nazwisko;
	
	return 0;
}
0

nie pomogę, piszę w Delphi lub pascalu.

0

Popełniasz dwa błędy.

string nazwa;
cin >> nazwa;
fstream f_nowy(nazwa.c_str(), ios::in);

Polecam czytanie dokumentacji i błędów kompilatora.

0

1)Mam Pytanie po co daje się w Mainie "int argc, char **argv".
2) O tym "Z" Nie pomyślałem, widać dobry programista myśli o wszystkim :))
3)Dev kompiluje mi Twój kod, natomiast Visual wywala jakis bład: Nie zamieszczę bo mu muli:P
4) dzięki wielkie za zaangażowanie:)

0

iooi Pierwszy raz się z tym spotkałem:). Powiedz mi jeszcze gdzie ja mam umieścić ten gotowy plik do wczytania który podaje użytkownik. Powiedzmy że użytkownik Wpisze podczas kompilacji "student". I plik o takiej nazwie już istnieje, Tylko gdzie powinienem go wkleić,( aby go wczytał). Bo Nie jest podana żadna ścieżka z której kompilator miałby odczytać dany plik.

</quote>
0

Nie podczas kompilacji, tylko podczas uruchomienia programu. Plik powinien być w katalogu roboczym (możesz też podać pełną ścieżkę do pliku).

0

Podałem Pełną ścieżkę(z typem pliku i bez) nic nie wczytuje mimo że w pliku mam jakieś bzdety wypisane. Niżej screen jak wpisałem :P
http://imageshack.us/f/515/programbo.jpg/

hmm, chyba że otwiera plik, ale nie wczytuje danych :P

0

Wciąż wczytujesz ze standardowego wejścia, a nie z pliku:

char znak;
f_nowy >> znak;
0

A gdzie tam masz jakiekolwiek działanie z tym plikiem? Otwierasz go, jest otwarty. Ale ani z niego nie czytasz, ani do niego nie piszesz. Więc się nie dziw,że nic nie otrzymujesz.

0
iooi napisał(a)

Wciąż wczytujesz ze standardowego wejścia, a nie z pliku:

char znak;
f_nowy >> znak;

1)ta deklaracja znaku, była tylko na zatrzymanie programu.
2) Ale przecież dodałem w linijce "ios::in"
jak wyczytałem to oznacza

"ios::in ([b]in[/b]put - wejście/odczyt) Zezwolenie na odczytywanie danych z pliku.".
No to powinno zassa te dane z pliku:P

0

Nie, nie powinno. Czytaj dokładnie dokumentacje.
Program nic Ci sam z siebie nie "zassa". Pozwoliłeś mu na czytanie, owszem. Ale pozwolić nie oznacza nakazać.
Czytaj sobie getlinem dane z tego pliku do jakiegoś stringa,a potem je wyrzucaj na konsolę, jak chcesz zobaczyć co jest w środku.

0

Masz na myśli co takiego? Gdzie fin to nazwa pliku

//odczyt znak po znaku
 while (fin.get(ch))
 cout << ch;

 fin.close();

1 użytkowników online, w tym zalogowanych: 0, gości: 1