Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Presbiopia - la 43 ani ?

Termen transcriere autovehicul

Cazare Timisoara pe 4-5 zile

Primele zile ale internetului per...
 Ditra 25

Casti USB-C ptr A-54

Aplicatie medicala / asistent med...

De ce vor atația politicieni...
 ERR_ADDRESS_UNREACHABLE

Legea 18/1968 Se mai aplica?

Digi conectare 2 routere prin fir

Succesiune notar versus instanta ...
 Montaj aer conditionat in balcon ...

Cont curent mulți valuta far...

Sugestii plan casa

Experiente cu firme care cumpara ...
 

Problema Caesar's cipher

- - - - -
  • Please log in to reply
9 replies to this topic

#1
andreixdebu

andreixdebu

    New Member

  • Grup: Candidate Members
  • Posts: 5
  • Înscris: 23.02.2022
Salut again, am o problema de rezolvat, va las enuntul mai jos, am incercat sa o rezolv dar am o eroare care imi zice "expression must have pointer-to-object but it has type int" (mai exact e o problema la s[i]) si nu inteleg cum se poate rezolva (lucrez in C de o zi deci nu aruncati cu hate). Am sa pun mai jos enuntul si ce am incercat.

#include <stdio.h>
#include <stdlib.h>
// Substitution cipher or Caesar’s cipher.
// This program which reads a natural number n and a string s. The string s is encoded using Caesar’s cipher with a displacement of n (either positive or negative).
// The program decodes the message and display it on the screen. Punctuation marks and numbers are left as they are.
int main() {
char s, ch;
int n, i;
scanf("%s", s);
scanf("%d", n);
for (i = 0; s[i] != "\0"; i++)
{
ch = s[i];
if (ch >= "a" && ch <= "z")
{
ch = ch - n;
if (ch < "a")
ch = ch + "z" - "a" + 1;
s[i] = ch;
}
else
if (ch >= "A" && ch <= "Z")
{
ch = ch - n;
if (ch < "A")
	 ch = ch + "Z" - "A" + 1;
s[i] = ch;
}
}
printf("Decrypted message: %s", s);
return 0;
}



#2
LukRo

LukRo

    Active Member

  • Grup: Members
  • Posts: 1,849
  • Înscris: 23.10.2015

Quote

ch = ch - n;

Aici scazi un int dintr-un char. Trebuie sa convertesti char in codul ASCII respectiv, apoi scazi n si convertesti inapoi din codul ASCII obtinut intr-un caracter.

#3
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013

View PostLukRo, on 23 februarie 2022 - 23:19, said:

Aici scazi un int dintr-un char. Trebuie sa convertesti char in codul ASCII respectiv, apoi scazi n si convertesti inapoi din codul ASCII obtinut intr-un caracter.

Nu afecteaza asta. Charul ala tot codul ascii il are in spate.

View Postandreixdebu, on 23 februarie 2022 - 22:53, said:

(mai exact e o problema la s[i]) si nu inteleg cum se poate rezolva (lucrez in C de o zi deci nu aruncati cu hate).

Tu ai declarat s ca un tip primitiv (char) si incerci sa il folosesti ca si array.

Si mai ai o problema cand folosesti un caracter (gen 'a' / 'z' / etc). Trebuie cu apostrof ('), nu ghilimele (") .. astea din urma sunt un array de caractere.

Edited by sftpdt, 23 February 2022 - 23:33.


#4
LukRo

LukRo

    Active Member

  • Grup: Members
  • Posts: 1,849
  • Înscris: 23.10.2015

View Postsftpdt, on 23 februarie 2022 - 23:30, said:

Nu afecteaza asta. Charul ala tot codul ascii il are in spate.


O fi... ultima data cand am folosit C++ a fost acum 25 de ani... dar nu stiam sa faca automat conversia (la vremea aia)

Poate compilatoarele moderne...

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
char-ul ala trebuie sa tina un cod undeva. ASCII e cel mai frecvent (erau si altele pe vremuri pe altfel de sisteme).

#6
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
Atentie si la scanf. Amarata aia de functie trebuie sa primeasca adrese de memorie unde sa stocheze ca citeste de la tastatura. Nu intra in detalii acum, dar retine informatia.
char s[100], ch; // deja ti s-a spus ce nu era ok cu definitia lui s. pt inceput, codul asta e ok-ish. mai tarziu o sa mai trebuiasca sa citesti despre buffer overflow
int n, i;
scanf("%s", s); // s reprezinta adresa de inceput a "sirului"
scanf("%d", &n); // &n inseamna adresa unde este stocata variabila n


Edited by Cy_Cristian, 24 February 2022 - 09:20.


#7
andreixdebu

andreixdebu

    New Member

  • Grup: Candidate Members
  • Posts: 5
  • Înscris: 23.02.2022
Salut, am o problema cu un cod, imi merge la cuvinte normale, dar daca introduc o propozitie, ia doar pana la primul spatiu si imi da un output foarte aiurea, daca ma puteti ajuta sa identific problema, va postez codul meu mai jos si un exemplu la ceea ce imi afiseaza.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Substitution cipher or Caesar’s cipher.
// This program which reads a natural number n and a string s. The string s is encoded using Caesar’s cipher with a displacement of n (either positive or negative).
// The program decodes the message and display it on the screen. Punctuation marks and numbers are left as they are.

int main()
{
int i, key;
char a[500];
scanf("%[^\n]s", a);
scanf("%d", &key);
while (a[i] != '\0')
{
  if (a[i] >= 'a' && a[i] <= 'z')
   a[i] = a[i] - key;
  else
   if (a[i] >= 'A' && a[i] <= 'Z')
	a[i] = a[i] - key;
  i++;
}
printf("%s", a);
return 0;
}



#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,428
  • Înscris: 10.08.2005
problema este ca 'a' minus key este mai mic decat 'z' dar si mai mic decat 'a',

#9
andreixdebu

andreixdebu

    New Member

  • Grup: Candidate Members
  • Posts: 5
  • Înscris: 23.02.2022
Nvm, am rezolvat, problema era ca nu am initializat int i = 0, acuma merge, mersi mult tuturor care au incercat sa ma ajute!

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,428
  • Înscris: 10.08.2005
uita-te la ce ti-am spus eu
output-ul ala aiurea nu de la initializare

[ https://www.youtube-nocookie.com/embed/M7fV-eQwxrY?feature=oembed - Pentru incarcare in pagina (embed) Click aici ]

faptul ca merge nu inseamna ca ai rezolvat

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate