Zadanie z literami - błąd w kodzie tzn. inne na wejściu inne na wyjściu.

0

Zadanie polega na wczytaniu L znaków i wypisaniu ich w kwadratowej tablicy, o jak najkrótszym boku. Długość boku kwadratu w tej metodzie możemy traktować jako klucz szyfrowania. Litery z wejścia należy zapisywać kolumnami tzn. pierwszy znak w pierwszym wierszu, drugi znak w drugim wierszu i tak do wiersza o numerze odpowiadającym długości boku kwadratu. Kolejny znak znowu w pierwszym wierszu, następny w drugim itd. Brakujące litery należy uzupełnić znakiem ‘’.
Wejście W pierwszym wierszu standardowego wejścia zapisano ciąg L znaków z pośród wielkich liter alfabetu łacińskiego – tekst do zaszyfrowania. Tekst kończy znak ‘!’, którego nie przetwarzamy.
Wyjście Na standardowe wyjście wypisz zakodowany tekst w postaci opisanego kwadratu ze znaków.
Przykłady
Wejście
ABC!
Wyjście
AC
B

Wejście
XYXZ!
Wyjście
XX
YZ

Wejście
RYSZARD!
Wyjście
RZD
YA*
SR*

**Mój kod tworzy kwadrat, ale na wyjściu "wypuszcza" zupełnie inne litery - przy dużej ilości liter (przy mniejszej wszystko jest OK). Mam błąd uruchomienia i złe odpowiedzi. **

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    int ile=0;
    char tab[ile];
cin>>tab[ile];
while (tab[ile]!='!')
{
ile++;
cin>>tab[ile];
}
int b=1;
while (b<sqrt(ile))
b++; 
while (ile%b!=0 || ile==b) 
    {
        tab[ile]='*'; 
        ile++; 
    }
    for (int i=0; i<b; i++)
    {
        for (int o=i; o<ile; o+=b)
        cout<<tab[o];
        cout<<endl;    
    }
    return 0;
}

 
0

Zacznij od podstaw, lekcja tablice.

    int ile=0;
    char tab[ile]; // tworzysz tablice o rozmiarze 0
0

To są podstawy, bo zadanie jest z projektu, który nazywa się programowanie na start. Dzięki za podpowiedź sprawdzę.

Po sprawdzeniu: jak wpiszemy AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB!
wyświetla różne znaki, nie będące literami.
Co z tym?

0

I to działa OK :D

 
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	long long int b=1;
	string a;
	getline(cin, a);
	int ile=a.size();
	double d=sqrt(ile-1);
	int c=d;
	double n=sqrt(ile);
	int e=n;
	if (e==n)
	{
		for (long long int i=0; i<n; i++)
    	{
    	    for (long long int o=i; o<a.size(); o+=n)
        	{
        		if (o!=a.size()-1) cout<<a[o];
        		else cout<<"*";
        	}
			cout<<endl;    
    	}
		return 0;
	
	}
	if (d==c || a.size()==1)
	{
		for (long long int i=0; i<d; i++)
    	{
    	    for (long long int o=i; o<a.size(); o+=d)
        	if (o!=a.size()-1) cout<<a[o];
        	cout<<endl;    
    	}
		return 0;
	}
	while (b<sqrt(a.size()))
		b++;
	bool wejscie=false;
	do
    {    	    
		a[a.size()-1]='*';
		a.resize(a.size()+1); 
		wejscie=true;
	}
	while (a.size()!=b*b);
	if (wejscie==true)
		a[a.size()-1]='*';
	for (long long int i=0; i<b; i++)
    {
        for (long long int o=i; o<a.size(); o+=b)
        	cout<<a[o];
        cout<<endl;    
    }
    return 0;
}                
0

OMG! A czemu nie zrobić po ludzku?

#include <iostream>
//#include <iomanip>
#include <string>
#include <cmath>
using namespace std;

int main()
  {
   string line;
   //while(getline(cin>>ws,line,'!'))
   //  {
      getline(cin,line);
      unsigned len=line.size()-1,sq=(unsigned)ceil(sqrt(len));
      for(unsigned y=0;y<sq;++y,cout<<endl) for(unsigned x=0,p=y;x<sq;++x,p+=sq) cout<<(p<len?line[p]:'*');
      cout<<endl;
   //  }
   return 0;
  }

Poprawka, specjalnie dla tych, którzy nie są w stanie zrobić prostych poprawek w kodzie.

0

Tak.... kod 13th_Dragon niby działa, ale... na sprawdzarce zaliczyło 0/100 wskazując "zła odpowiedź". Nie wiem czemu, ale tak jest. Przerabialiśmy już, że pod "złą odpowiedzią" mogą być limity lub inne cuda. Nie wiem. Mój kod chociaż długi i z wieloma warunkami przeszedł 100/100.

0

W czasie sobotnich zajęć z informatyki uczestnicy uczą się wykorzystywać figury geometryczne do
szyfrowana tekstów.
Metoda polega na wczytaniu L znaków i wypisaniu ich w kwadratowej tablicy, o jak najkrótszym boku.
Długość boku kwadratu w tej metodzie możemy traktować jako klucz szyfrowania. Litery z wejścia należy
zapisywać kolumnami tzn. pierwszy znak w pierwszym wierszu, drugi znak w drugim wierszu i tak do
wiersza o numerze odpowiadającym długości boku kwadratu. Kolejny znak znowu w pierwszym wierszu,
następny w drugim itd. Brakujące litery należy uzupełnić znakiem ‘*’.
Wejście
W pierwszym wierszu standardowego wejścia zapisano ciąg L znaków z pośród wielkich liter alfabetu
łacińskiego – tekst do zaszyfrowania. Tekst kończy znak ‘!’, którego nie przetwarzamy.
Wyjście
Na standardowe wyjście wypisz zakodowany tekst w postaci opisanego kwadratu ze znaków.

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