Jak przesunąć całą tablicę wprowadzonych znaków o 3 pozycje do przodu?

0

Jak mam przesunąć całą tablicę wprowadzonych znaków o 3 pozycję do przodu, mam taki kod, ale wyświetla mi się nie wiadomo, co.

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<istream>

using namespace std;

int main()
{
	char tekst[100];
	int i;

	cout << "Wprowadz tekst: ";
	cin >> tekst;

	for (i = 0; i < 100; i++)
	{
		
			tekst[i] += 3;
		
	}

	cout << "\nZmieniony tekst: " << tekst;

	_getch();
}

dodanie znacznika <code class="cpp"> - @furious programming

1

wczytujesz do tablicy char jakis tekst powiedzmy
abcd
Ale cin wprowadza jeszcze jeden znak. Jest to znak konca pliku. Wyglada on tak '\0'
Ty natomiast dla WSZYSTKICH (rowniez dla tego piatego ukrytego) przesuwasz o 3 takze... nie ma konca pliku i cout nie wie do jakiego momentu ma to wyswietlic.

jezeli juz chcesz robic na tablicy charow to musisz uzyc

#include<cstring>
int dlugosc = strlen(tekst);

i petle for do dlugosci. Wtedy powinno dzialac

Zreszta wygoogluj sobie szyfr cezara c++ masz TONE przykladow.

Jeszcze uwagi,

  1. i powinno byc zadeklarowane w petli a nie na zewnatrz
  2. uzywaj normalnego IDE ktore zatrzyma konsole a nie ze na sile musisz je zatrzymywac
  3. nie potrzeba Ci 3 z 4 naglowkow w Twoim programie.
  4. co jesli ktos wprowadzi tekst na 150 znakow?
0
fasadin napisał(a):
  1. co jesli ktos wprowadzi tekst na 150 znakow?

skorzystać z dynamicznego przydziału pamięci?

1

cytowales caly wczesniejszy posty mimo ze jest zaraz nad Twoim zeby napisac cos co nie ma NIC zwiazanego z tym o czym piszesz? Prosze Cie...

Edit. A teraz zmieniasz calkowicie zdanie.
Napisz najpierw swoj program tak by dzialal. Uzyj bibloteki string zadanie bedzie jeszcze balanlniejsze

No i oczywiscie nie bierzesz pod uwage w swoim programie co jezeli bedziesz mial litere Z

2

Dodatkowo, szyfr cezara wymaga, aby litery na końcu alfabetu były "zawijane", t.t. jeśli masz przesunięcie o 3 to powinieneś mieć tak:

a ⟶ d
b ⟶ e
...
u ⟶ x
v ⟶ y
w ⟶ z
x ⟶ a
y ⟶ b
z ⟶ c
0

Witam, poprawiłem kod, ale nadal tylko do pierwszego białego znaku, przesuwa dobrze.

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<istream>
#include<cstring>


using namespace std;

int main()
{
	char tekst[100];
	
	
	cout << "Wprowadz tekst: ";
	cin.getline(tekst,100);

	int dlugosc = strlen(tekst);

	for (int i = 0; i < dlugosc; i++)
	{
		if (tekst[i] == 'X' || tekst[i] == 'x' || tekst[i] == 'Y' || tekst[i] == 'y' || tekst[i] == 'Z' || tekst[i] == 'z')
		{
			tekst[i] -= 23;
		}
		else
		{
			tekst[i] += 3;
		}
	}


	cout << "\nZmieniony tekst: " << tekst;

	_getch();
}

Przykład: miasto rzym
Mój program: pldvwr#ucbp
Prawidłowo: pldvwr ucbp

To znaczy po 1: nie mam pojęcia dlaczego białe znaki zamienia na #, ale pewnie biały znak też przesuwa o "3", jak tego się pozbyć?

dodanie znacznika <code class="cpp"> - @furious programming

0

A jak byś miał zrobić ROT13 to byś zrobił 13 warunków?

Podstawowa wiedza:

  1. 'b' - 'a'1
  2. alfabet łaciński ma 26 liter
  3. wielkość litery możesz sprawdzić funkcjami isupper i islower
  4. teraz już powinieneś wiedzieć jak sprawdzić, czy po dodaniu wychodzisz poza ostatnią literę alfabetu oraz o ile pól wtedy cofnąć (ew. jakie modulo zastosować).
0

Potrzebuję pomocy w kolejnym rozwinięciu tego zadania:

Rozwiń zadanie 2, tak że wczytasz dodatkowo liczbę określającą przesunięcia
pomiędzy znakami szyfrowanymi, a znakami tekstu jawnego. Do szyfrowania znaków
będzie trzeba użyć funkcji modulo (%). Pamiętaj również o rozróżnieniu dwóch przypadków: wielkich i małych liter.

Mam sobie po prostu wczytać liczbę miejsc o ile ma przesunąć, i użyć tej zmiennej w pętlach for? O co rozchodzi się z tym modulo, jak mam tego użyć do szyfrowania?

@Edit

Tylko mała zmiana kodu:

for (int i = 0; i < dlugosc; i++)
	{
		if (tekst[i] == 'X' || tekst[i] == 'x' || tekst[i] == 'Y' || tekst[i] == 'y' || tekst[i] == 'Z' || tekst[i] == 'z')
		{
			tekst[i] -= 23;
		}
		else if (tekst[i] == ' ')
		{
			
		}
		else
		{
			tekst[i] += pozycja;
		}
	}

Teraz myślę nad tą funkcją modulo, bo rozumiem, że to ma być warunek dla x,y,z,X,Y,Z - tylko chyba jeszcze muszę trochę pomyśleć jakaś wskazówka?

@Edit 2

Ok tu będzie trzeba sprawdzić jakoś czy nie wykracza poza liczbę z tablicy ASCII, odpowiadającą literze "Z" - może coś wymyślę.

@kq mógłbyś mi wytłumaczyć coś, dlaczego dzieję się tak, że nieważne jakie przesunięcie bym nie wprowadził to dla tego warunku

if (tekst[i] == 'X' || tekst[i] == 'x' || tekst[i] == 'Y' || tekst[i] == 'y' || tekst[i] == 'Z' || tekst[i] == 'z')
		{
			tekst[i] -= 23;
		}

Zawsze wychodzi mi a,b,c -> czyli prawidłowo. Teraz wystarczyłoby wymyślić, że w warunku tego 'if' byłoby coś co wyliczałoby, które litery w zależności od wartości przesunięcia, mają się załapać do tej instrukcji warunkowej.

dodanie znaczników <code class="cpp"> - @furious programming

1

Tak możesz zrobić (pewnie można ładniej zapisać, ale to powinno być ok)

char encode(char in, int offset){
	if(isalpha(in)){
		char sentinel = islower(in) ? 'z' : 'Z';
		return in + offset > sentinel ? in + offset - 26 : in + offset;
	}else{
		return in;
	}
}

http://melpon.org/wandbox/permlink/9rI4btPecGZjsum9

3
#include <iostream>
#include <iomanip>
#include <cctype>
using namespace std;
 
int main()
  {
   const int shift=3;
   while(true)
     {
      cout<<"Wprowadz tekst: ";
      char tekst[100];
      if(!cin.get(tekst,sizeof(tekst))) break;
      for(int i=0;tekst[i];++i) tekst[i]=isalpha(tekst[i])?(toupper(tekst[i])-'A'+26+shift)%26+'A':tekst[i];
      cout<<"Zakodowany tekst: "<<tekst<<endl;
      for(int i=0;tekst[i];++i) tekst[i]=isalpha(tekst[i])?(toupper(tekst[i])-'A'+26-shift)%26+'A':tekst[i];
      cout<<"Odkodowany tekst: "<<tekst<<endl;
     }
  }

http://ideone.com/sZN5Tu

0

Mam pytanie te oba kody zadziałają tylko dla przesunięcia mniejszego od 26, czy to prawda?

@kq
@_13th_Dragon

0

kod od @kq tylko dla 0..26 z tym że dla 0 i 26 to brak przesunięcia.
Ten mój to dla -26..26 będzie działać na każdym kompilatorze i pod każdym systemem zaś poprawne działanie z innymi wartościami nie jest gwarantowane.
Na przykład: http://ideone.com/3pbfQs

0

Poprawiona wersja oryginalna, ale z typem string.
Na char[] nie miałem siły/czasu/chęci tego robić:

http://ideone.com/SKppbn

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