PDA

Visualizza la versione completa : [C++] Giustificazione del testo


Iena87
12-01-2005, 17:29
Ho scritto questo programma (assai grezzo) pre giusitifcare del testo, solo che mandandolo in esecuzione, una volta che ho scritto il testo di una riga e premo invio, invece di passare alla scrittura della riga successiva chiude la schermata del DOS e termina il programma, che invece dovrebbe terminare, dato il mio ciclo, inserendo il carattere '*' .
Ecco il programma:


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

void clear_buffer(), giustifica();
const int n=5;
int i;
char testo[80], testo2[80];

int main(){
cout<<"Inserire il testo (Premere * per terminare):\n\n";
i=0;
do{
cin.get(testo,80,'\n');
clear_buffer();
if(testo[0] != '*')
giustifica();
i++;
}while((i<n)&&(testo[0]!='*'));
getch();
return 0;
}

void clear_buffer(){
char car;
do{
car=cin.get();
}while(car != '\n');
}

void giustifica(){
int j, conta_caratteri, conta_parole, num_spazi, spa_ins, k, l;
// conteggio dei caratteri e delle parole
for(j=0;j<80;j++){
if(testo[j]!=' ')
conta_caratteri++;
else
conta_parole++;
}
// determ. spazi
num_spazi=80-conta_caratteri;
spa_ins=conta_parole/num_spazi;
// inserimento spazi
k=0;
while(testo[k]!='\n'){
if(testo[k]==' '){
l=0;
while(l<spa_ins){
testo2[k+l]=' ';
l++;
}
}
else
testo2[k]=testo[k];
k++;
}
}


Uso Dev-C++....sarà ò'istruzione cin.get???
Perchè facendolo a scuola in lab, con il turbo-c++ funzionava...

Iena87
15-01-2005, 15:15
Ehm....nessuno può aiutarmi??? :(

Iena87
16-01-2005, 12:03
Scusate i tre post di fila ma qui nessuno mi aiuta e io nn so come fare...almeno ditemi che nn sapete come fare che mi metto l'animo in pace :dhò: :confused:

Lardoman 2.0
16-01-2005, 12:05
invece di cin.get , prova a utilizzare getchar ()

k42x
16-01-2005, 15:56
credi che l'errore principale sia il fatto che cin.get() esclude il carattere '\n' nel suo input, cosa invece necessaria nella funzione giustifica().

Ci sono poi altri piccoli errori, per esempio le dichiarazioni non rispettano del tutto l'ANSI; infatti andrebbero fatte in questo modo :
#include <cstdio>
/* per quanto riguarda le librerie del C che vuoi usare nel C++*/

#include <iostream>
/* Librerie del C++, inoltre devi anche definire il namespace std attraverso l'istruzione using namespace std.*/

Altro errore nella funzione giustifica sta nel fatto che la stringa testo2 non termina con un carattere '\0'

Iena87
17-01-2005, 18:31
Ho provato a mettere le librerie da te indicate, ma lo stesso nn va, anche con getchar().
Ecco il programma:


#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <cstdio>
#include <iostream>

void clear_buffer(), giustifica();
const int n=5;
int i;
char testo[80], testo2[80];

int main(){
cout<<"Inserire il testo (Premere * per terminare):\n\n";
i=0;
do{
getchar(testo,80,'\n');
clear_buffer();
if(testo[0] != '*')
giustifica();
i++;
}while((i<n)&&(testo[0]!='*'));
for(i=0;i<80;i++)
cout<<testo2[i] ;
getch();
return 0;
}

void clear_buffer(){
char car;
do{
car=getchar();
}while(car != '\n');
}

void giustifica(){
int j, conta_caratteri, conta_parole, num_spazi, spa_ins, k, l;
// conteggio dei caratteri e delle parole
for(j=0;j<80;j++){
if(testo[j]!=' ')
conta_caratteri++;
else
conta_parole++;
}
// determ. spazi
num_spazi=80-conta_caratteri;
spa_ins=conta_parole/num_spazi;
// inserimento spazi
k=0;
while(testo[k]!='\n'){
if(testo[k]==' '){
l=0;
while(l<spa_ins){
testo2[k+l]=' ';
l++;
}
}
else
testo2[k]=testo[k];
k++;
}
}

Così scritto,mandandolo in esecuzione, scritta una riga e premendo invio, la schermata del DOS si chiude...come devo fare?
Potreste illustrarmi una versione del programma che funzioni? :confused:

k42x
17-01-2005, 19:27
guarda così dovrebbe funzionare un po meglio (è una risposta frettolosa quindi non so se funziona) :


#include <cstdio>
#include <iostream>
#include <cstring>
// #include <cconio>
#include <cstdlib>

using namespace std;

void clear_buffer(), giustifica();
const int n=5;
int i;
char testo[80], testo2[200];

int main(){
cout<<"Inserire il testo (Premere * per terminare):\n\n";
i=0;
do{
cin.get(testo,79,'\n');
testo[strlen(testo) + 1] = '\n';
clear_buffer();
if(testo[0] != '*')
giustifica();
i++;
}while((i<n) && (testo[0]!='*'));
// getch();

cout << "\n\ntesto2: " << testo2 << endl;

return 0;
}

void clear_buffer(){
char car;
do{
car=cin.get();
}while(car != '\n');
}

void giustifica(){
int j, conta_caratteri=0, conta_parole=1, num_spazi, spa_ins, k, l;

// conteggio dei caratteri e delle parole
for(j=0;j<80;j++){
if(testo[j]!=' ')
conta_caratteri++;
else
conta_parole++;
}

// determ. spazi
num_spazi=80-conta_caratteri;
spa_ins= conta_parole/num_spazi;

// inserimento spazi
k=0;
while(testo[k]!='\n'){
if(testo[k]==' '){
l=0;
do{
testo2[k+l]=' ';
l++;
}while(l < spa_ins);
k += l;
}
else
testo2[k]=testo[k];
k++;
}
testo2[k] = '\0';
}

Iena87
17-01-2005, 20:42
No nn funziona correttamente...cmq ho aggiutno qualcosa e adesso comincia a funzionare, più o meno...
In effetti se io scrivo:


a b

Devo vedere visualizzato un testo giustificato in modo tale da ottenere:


a b

Ma è nella determinazione degli spazi che nn funziona qualcosa...ci sto sbattendo troppo la testa e sto un pò fuso...se come determinazione degli spazi da inserire tra una parola e l'altra facessi: spa_ins=80-conta_caratteri la cosa potrebbe anche funzionare se io scrivessi due parole da un carattere ciascuna, cioè a b ma per gli altri casi no....come li posso determinare?

Questa è l'ultima versione:


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


void clear_buffer(), giustifica();
const int n=5;
int i;
char testo[80], testo2[80];

int main(){
cout<<"Inserire il testo (Premere * per terminare):\n\n";
i=0;
do{
cin.get(testo,80,'\n');
clear_buffer();
if(testo[0] != '*')
giustifica();
i++;
}while((i<n)&&(testo[0]!='*'));
for(i=0;i<80;i++)
cout<<testo2[i] ;
getch();
return 0;
}

void clear_buffer(){
char car;
do{
car=cin.get();
}while(car != '\n');
}

void giustifica(){
int s=0, j, conta_caratteri=0, conta_parole=0, num_spazi, spa_ins, k, l;
// conteggio dei caratteri e delle parole
j=0;
while(testo[j]!='\0'){
if(testo[j]!=' ')
conta_caratteri++;
if(((testo[j]==' ')&&(testo[j+1]!=' ')||(testo[j+1]=='\0')))
conta_parole++;
j++;
}
// determ. spazi
num_spazi=80-conta_caratteri;
spa_ins=num_spazi/conta_parole;
// inserimento spazi
k=0;
l=0;
while(testo[k]!='\0'){
if(testo[k]==' '){
l=0;
while(l<spa_ins){
testo2[k+s]=' ';
l++;
s++;
}
s--;
}
else
testo2[k+s]=testo[k];
k++;
}
}

Loading