|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
[C] Domande da principiante
ciao,
mi sto addentrando nel mondo del C per un esame, ma ho molti problemi nel cominciare. Per questo ho aperto questo thread, in modo da postare qui tutte le domande che mi verranno nel corso dello studio (anche quelle di altri sono bevenute ovviamente!). Per prima cosa: un esercizio mi chiede di creare un programma per il conteggio dei caratteri di tabulazione, di newline e di spazio in un testo in ingresso. ho pensato a una cosa del genere: Codice:
#include <stdio.h>
int main()
{
int c;
int ns, nt, nl;
ns = 0;
nt = 0;
nl = 0;
while((c = getchar()) != EOF)
{
if(c == '\n')
++nl;
else if(c == '\t')
++nt;
else if(c == ' ')
++ns;
}
printf("Spazi: %d\n", ns);
printf("Tabulazioni: %d\n", nt);
printf("Righe: %d\n", nl);
}
grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
perfetto! ora funziona! grazie!
in una versione precedente usavo EOF e fino a un certo punto mi dava risultati corretti (chiudevo il programmacon control+C) |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Dichiara la variabile c come char, e non come int.
Comunque l'EOF lo puoi dare facilmente anche via tastiera, su Linux con Control+D, su Windows con Control+Z.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Whoops è vero!
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ciao!
sono alle prese con un altro programma: devo calcolare la lunghezza delle parole inserite in input (da linea di comando) e poi crearne un istogramma in base alla loro lunghezza. in parole povere: l'output del programma dovrebbe essere per esempio: Codice:
parole con 0 lettere: parole con 1 lettere: X parole con 2 lettere: XXX parole con 3 lettere: XXXXXX ... questo è quello che ho provato a fare fin'ora: Codice:
#include <stdio.h>
#define MAX 20
int main()
{
int lung, c, i, fin, n;
int parole[MAX], ndigit[MAX];
for(i = 0; i < MAX; ++i)
ndigit[i] = 0;
lung = i = 0;
while((c = getchar()) != EOF)
{
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
++lung;
else if(c == ' ')
{
parole[i] = lung;
lung == 0;
++i;
}
fin = i;
}
for(i = 0; i <= fin; ++i)
{
n = parole[i];
++ndigit[n];
fin = i;
}
for(i = 0; i <= MAX; ++i)
printf("Parole con %d lettere: %d", i, ndigit[i]);
}
- l'uso di MAX deriva dal fatto che non mi ha permesso di definire un array di interi vuoto (e già qui è un problema, che ho pensato di risolvere usando l'intero "fin" che sarebbe l'indice finale dell'array riempito, ma su cui ho MOLTI dubbi) - il funzionamento del ciclo while mi sembra corretto perchè controlla se il carattere in ingresso è una lettera (ho usato la tabella ASCII per fare il controllo del if), incrementa la variabile "lung", mentre se è uno spazio il valore della lunghezza della parola viene inserità nell'array "parole", "lung" viene riportata a 0 per il prossimo calcolo e l'indice dell'array viene incrementato. infine ho pensato di assegnare alla variabile "fin" il valore di "i" così da avere il valore totale degli indici dell'array. - l'ultima parte è piena di dubbi: ho usato un secondo array "ndigit", per calcolare le varie occorrenze di lunghezze di parole (es: se ci fossero due parole di 3 lettere, allora all'indice 3 di ndigit avremo il valore 2), ma nonostante questo ho dei problemi. dove ho sbagliato? grazie! |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
No, un'array vuoto non avrebbe senso, e la larghezza variabile la puoi ottenere usando dei puntatori. Comunque, se la lunghezza massima è 20, puoi definire un'array di 20 interi inizializzati a zero, leggere la lunghezza di ogni singola parola, ed incrementare l'intero presente nell'indice (lunghezza-1) dell'array - la lunghezza è l'unico dato che ti interessi realmente, o mi sbaglio?
Una cosa tipo: Codice:
int nWordLength[N_MAX] = {0};
int nLength = 0;
char cInput = 0;
while ((cInput = getchar()) != EOF) {
if (isalpha(cInput)) {
nLength++;
continue;
}
else if (cInput == ' ') {
++nWordLength[nLength-1];
nLength = 0;
}
}
StampaIstogramma();
Comunque prova ad usare isalpha() invece che tutti quei controlli sul carattere, è una macro standard e dovrebbe funzionare.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 14-05-2008 alle 16:01. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
Quote:
con isalpha si alleggerisce molto il codice, però bene o male era come avevo fatto io, mentre il mio problema è più nel aumentare un "counter" per le parole di lunghezza uguale e poi stamparlo a video! |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Vabbe', lo scheletro è quello, ma era per farti vedere una specie di pseudocodice che potevi usare solo una array e un contatore per fare tutto, riduce un po' il lavoro che devi fare e migliora la leggibilità. Per il resto credo andasse bene.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Aug 2007
Messaggi: 50
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ho provato a fare come dicevi tu daniele e va già meglio!
però non mi funziona per ogni input! ad esempio per parole di 9 lettere non mi funziona! riposto il codice modificato: Codice:
#include <stdio.h>
#define MAX 20
int main()
{
int lung, c, i;
int parole[MAX] = {0};
lung = i = 0;
while((c = getchar()) != EOF)
{
if(isalpha(c))
{
++lung;
continue;
}
else if(c == ' ')
{
++parole[lung];
lung = 0;
}
}
for(i = 0; i <= MAX; ++i)
printf("Parole con %d lettere: %d\n", i, parole[i]);
}
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Aug 2007
Messaggi: 50
|
la variabile c e l'array li devi dichiarare come char, visto che stai inserendo dei caratteri e non dei numeri
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
con getchar() si usano gli interi, mentre nell'array non inserisco nessun carattere, ma solo l'intero che corrisponde alla lunghezza delle parole della stringa in ingresso!
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Da me veramente pare funzionare... fai una cosa però, non controllare solo (c == ' '), anche quella sostituiscila con isspace(c), che controlla anche altre punteggiature e altri separatori, fai prima.
Comunque:
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
qui c'è la versione finale!
in fase di stampa ho modificato in modo che stampi una X a ogni occorrenza di una parola di una certa lunghezza, mentre non stampi nulla se non ci sono occorrenze di parole di una certa lunghezza. ci può essere qualche ottimizzazione secondo voi? sapete se c'è qualche funzione standard di C per calcolare le prestazioni (tempo e memoria) di un programma? Codice:
#include <stdio.h>
#include <ctype.h>
#define MAX 20
int main()
{
int lung, c, i, n;
int parole[MAX] = {0};
lung = i = 0;
while((c = getchar()) != EOF)
{
if(isalpha(c))
{
++lung;
continue;
}
else if(isspace(c))
{
++parole[lung];
lung = 0;
}
}
for(i = 0; i < MAX; ++i)
{
if(parole[i] == 0)
{
continue;
}
else if(parole[i] != 0)
{
printf("Parole con %d lettere: ", i);
for(n = 1; n <= parole[i]; ++n)
printf("X");
}
printf("\n");
}
return 0;
}
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
time ./<programma> Altrimenti, se vuoi farlo da codice, ci sono vari modi. Puoi usare clock(), ad esempio.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ciao!
ho bisogno di un aiuto per un programma che copi due concateni due stringhe, tramite l'uso di puntatori. senza usare funzioni della libreria standard. ho provato a fare così: Codice:
#include <stdio.h>
int main()
{
strcon(char *s, char *t)
{
while(*s != '\0')
s++;
while(*t != '\0')
{
s + t;
t++
}
}
}
sapete dirmi i (numerosi) punti in cui ho sbagliato e perchè? grazie. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Codice:
while(*t != '\0')
{
s + t;
t++
}
PS: Nel tuo corso non avete ancora parlato di allocazione dinamica? Se sì in questo esercizio penso che dovresti sfruttarla, se no non importa, continua così |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
perchè non fa nulla?
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
perchè il risultato della somma non è assegnato a nessuna variabile.
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
è vero! ho fatto un sacco di errori in quel codice! dovevo essere fuso!
comunque ho modificato un po' la funzione è compilando questo codice non mi da errore (solo 2-3 warning). Codice:
#include <stdio.h>
int main()
{
char *(strcon)(char *s, char *t)
{
char *str;
while(*s != '\0')
{
str = s;
s++;
str++;
}
while(*t != '\0')
{
str = t;
t++;
str++;
}
return *str;
}
return 0;
}
grazie ancora per la pazienza |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:29.




















