Non capisco queste cose ... (linguaggio C) prima volta

PatrickJane

Nuovo Utente
54
1
Salve sto cercando di imparare il C solo che sto ripassando il ciclo for (sono proprio all'inizio) e ho fatto questo esercizio:

#include <stdio.h>


int main() {
long long p = 1;
int n;
int i;
printf("Numero di potenze: ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
p *= 2;
printf("2 alla %d fa %lld\n", i, p);
}
}

Fino a qui ho capito tutto solo che non ho capito la variabile "p", cioè lui parte dichiarando la variabile di tipo long long e gli da valore 1, poi nell'istruzione del ciclo for dice: che p è uguale a p * 2 solo che p all'inizio ha valore 1 e non capisco come possa aumentare il suo valore dao che quello che aumenta è "i", però il programmino funziona ma non capisco come.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Senza return 0 in un int main difficile che te lo compili.
Comunque l'algoritmo è molto semplice: acquisisce fino a quale potenza elevare ed esegue x iterazioni.
Ad ogni iterazione moltiplica p per due (p = p * 2).
 

PatrickJane

Nuovo Utente
54
1
Grazie adesso ho capito, scusa ma ho ancora un problema (è un problema se chiedo di questo cose qui?).
Allora il mio problema che non ho ben capito è:
#include <stdio.h>


int main() {
long long n;
printf("Digita un intero positivo: ");
scanf("%lld", &n);
long long k = 2;
while (k*k < n && (n % k) != 0) k++;
if (n == 2 || (n % k) != 0)
printf("E' un numero primo\n");
else
printf("Non è un numero primo\n");
}

Cioè io digito un numero e lui praticamente dice finché 2*2 < di n e n/2 non ha resto allora aggiungo +1 a K (giusto?); non ho capito poi quando parte if, parte subito o while deve verificare finché questa non diventi falsa? e poi dice se n è uguale a 2 o se il resto di n/2(che poi aumenta il k se la condizione di while è vera) non da resto scrive è un numero primo,. E poi non capisco. Magari sono io che non vedo una cosa banale o è stato complicato anche per voi la prima volta?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
L'algoritmo mi sembra sbagliato.
Non dovrebbe essere k*k ma k*2
Fatta questa correzione, il while aumenta k di 1 finchè k è inferiore della metà di n e finchè il resto della divisione intera n/k è diverso da zero.
In altre parole, dato un numero naturale, per k che va da 2 a n/2 verifica se il numero n è divisibile o meno per k.
Il ciclo può terminare in 2 casi diversi:
A: n%k == 0: n è divisibile per k
B: k*2 >= n: k ha superato la metà del valore di n
Nel caso A, uno dei valori di k è divisore di n, per cui n non è numero primo,
Nel caso B, ho verificato che nessuno dei numeri naturali compresi tra 2 e n/2 - 1 è divisore

Nell'if finale non si fa altro che testare quale di questi casi è vero.
Se n==2 (caso A), n è primo, questa clausola serve per correggere il fatto che se n è 2, e k parte proprio da 2, allora n%k = 0 per cui n sarebbe non primo, ma sappiamo che 2 invece è un numero primo.
Se n%k != 0, vuol dire che il ciclo è finito perchè ha testato tutti i valori di k e anche l'ultimo valore che ha reso falsa la condizione k*2<n (k varrà n/2 - 1) non è divisore di n per forza (perchè k sarà compreso tra n/2 e n), ergo n è primo
Se nessuna di queste due condizioni è vera, allora il numero non è primo
 
Ultima modifica:
M

Mursey

Ospite
Grazie adesso ho capito, scusa ma ho ancora un problema (è un problema se chiedo di questo cose qui?).
Allora il mio problema che non ho ben capito è:
#include <stdio.h>


int main() {
long long n;
printf("Digita un intero positivo: ");
scanf("%lld", &n);
long long k = 2;
while (k*k < n && (n % k) != 0) k++;
if (n == 2 || (n % k) != 0)
printf("E' un numero primo\n");
else
printf("Non è un numero primo\n");
}

Cioè io digito un numero e lui praticamente dice finché 2*2 < di n e n/2 non ha resto allora aggiungo +1 a K (giusto?); non ho capito poi quando parte if, parte subito o while deve verificare finché questa non diventi falsa? e poi dice se n è uguale a 2 o se il resto di n/2(che poi aumenta il k se la condizione di while è vera) non da resto scrive è un numero primo,. E poi non capisco. Magari sono io che non vedo una cosa banale o è stato complicato anche per voi la prima volta?

E' complicato se e' spiegato male o il codice e' scritto male.
Immagina il while come un "mentre" la condizione e' vera esegui quello che ha all'interno, quando non lo e' piu' termina il ciclo.
 

PatrickJane

Nuovo Utente
54
1
Scusatemi proprio, non so a chi chiedere e allora chiedo agli esperti di questo forum.
Allora, ho trovato questo esercizio molto semplice e che mi funziona pure solo che se funziona ma non ho capito, io non vado avanti ma mi fermo e cerco di capire.
int main() {
printf("Inserire una linea di testo: ");
char c;
int parole = 0, iniziata = 0;
do {
scanf("%c", &c);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
if (!iniziata) {
iniziata = 1;
parole++;
}
} else iniziata = 0;
} while (c != '\n');
printf("Numero parole: %d\n", parole);
}

E' un esercizio dove tu scrivi un testo e lui ti conta quante parole ci sono fino al primo if ho capito tutto, l'unica cosa che non ho capito è cos'è "iniziata". All' inizio prende il valore 0 ma poi dice if (!iniziata) cioè se iniziata è diverso (diverso da cosa scusa) e poi gli dice iniziata = 1 e aggiunge 1 a parole e questo l'ho capito, ma è quel iniziata che non ho capito cos'è, cioè so che intende dire che inizia una nuova parola e quindi conta "parole+1" ma non capisco cosa voglia dire quel diverso da iniziata.
Un'altra cosa quando scrivo qui e faccio copia e incolla del testo in c me lo fa vedere come l'ho scritto (cioè con gli spazi, ecc.) ma qui poi me lo attacca tutto a sinistra quando faccio invio.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Per quanto riguarda !iniziata , presumo ti manchi la conoscenza base sulle espressioni booleane.
Dovresti coprire questa lacuna il prima possibile, in quanto è basilare.
L'operatore ! (punto esclamativo) è l'operatore booleano NOT.
Il costrutto IF, come dovresti sapere, valuta il valore booleano dell'espressione contenuta fra le parentesi, in questo caso !iniziata.
In C (ma in quasi tutti i linguaggi), un numero intero vale, in termini booleani, TRUE se diverso da zero, FALSE se uguale a zero.
!iniziata sarà quindi NOT(0) quando iniziata vale 0, e NOT(0) = TRUE quindi esegue il codice iniziata=1 e parole++.
!iniziata sarà NOT(1) quando iniziata vale 1, e NOT(1) = FALSE.
iniziata viene settata a 1 quando il carattere esaminato è una lettera, mentre viene settata a zero quando il carattere non è una lettera.
In realtà sarebbe stato concettualmente, e programmativamente più corretto usare un valore booleano e non un intero...

Per l'identazione del codice C, prova a racchiudere il codice fra i tag
Codice:
, comunque non sono sicuro che le tabulazioni ti vengano riportare correttamente.
 

PatrickJane

Nuovo Utente
54
1
Scusatemi ancora, questa volta non ho un problema che non riesco a risolvere (lol), ma volevo chiedere una cosa a proposito di diventare programmatore.
Quello che volevo sapere a parte imparare il linguaggio come può essere C, cos'altro dovrei studiare? Io sono al secondo anno delle superiori e vado molto bene in matematica, ma io non faccio uno scientifico o comunque non è un liceo, e ho sentito parlare che all'università (ovviamente come ipotesi per un mio futuro ma bisogna vedere se imparo veramente e se rimane la passione) fanno molta matematica e anche cose di logica che neanche dal nome ho capito. Ad esempio se voi avete fatto l'università (piccola curiosità come si chiama il corso ho visto che c'è ingegneria informatia/informati/ingegneria dell'informazione, qual'è di questi?) che cosa avete studiato a parte il linguaggio?
Il mio problema, che sorge in modo evidente anche dai problemi che vi ho fatto vedere qui sopra, è che capisco il linguaggio cioè quella cosa serve per quello e quell'altra cosa serve a quello, cioè fin li riesco a capire ma se mi chiedi di crearti un problema dove dietro ci deve essere un processo logico non so da dove partire, cosa dovrei studiare? In pratica se a me danno un problema di matematica te lo risolvo in mezzo secondo ma se mi dai un problema (come quelli degli invalsi, non so se avete capito) mi blocco e non so andare avanti. Come devo fare?
 
M

Mursey

Ospite

PatrickJane

Nuovo Utente
54
1
Grazie, quindi per imparare bene basta che vado avanti ad imparare il linguaggio (ho capito bene?), non ho capito in che senso posso programmare anche in italiano? Invece per imparare la metodologia va bene il C come primo approccio alla programmazione, ok ho capito quello che dicono quelle guide ma come lo metto in pratica? Una domanda: tu lavori come programmatore perché hai fatto il perito informatico o si può lavorare come programmatore senza di quello ma con un altro diploma? o bisogna avere (dato che sto facendo un altro tipo di scuola superiore) tipo quei certificati di programmazione e cose del genere? o basta la conoscenza della programmazione? altra cosa (Scusa se mi dilungo) ad esempio tu lavori in azienda o in proprio? in qualunque di questi casi cos'è in pratica questo lavoro?
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Da dove studi? Io ti consiglio un buon manuale.
Leggo molta confusione in quello che scrivi; per farti un esempio, le variabili char contengono un solo carattere, non stringhe/parole. Dunque il risultato sarà sempre 1...
Non ho capito cosa tu voglia raggiungere: magari diccelo e vediamo di trovare una soluzione.

Il C è un linguaggio ostico per i novellini, ma generalmente questi sono argomenti semplici. Il difficile (per molti) sono i puntatori e l'allocazione dinamica della memoria (che sfrutta i puntatori). Anche se alla fine, non vi è nulla di complesso.

 
M

Mursey

Ospite
Grazie, quindi per imparare bene basta che vado avanti ad imparare il linguaggio (ho capito bene?)
In realta' prima del linguaggio sarebbe meglio leggere quello che ti ho linkato, se entri nel giusto modo di pensare poi il linguaggio lo impari.

non ho capito in che senso posso programmare anche in italiano?
Nel senso che devi ragionare per la soluzione di un problema, ad esempio :
Se ti dico fammi un programma che somma due numeri e stampa il risultato tu puoi scrivere
- acquisisci il primo numero e mettilo in A
- acquisisci il secondo numero e mettilo in B
- fai la somma e mettila in C
- stampa C
Questo e' gia' un programma in italiano, a quel punto che sia VB,C++ o C# non conta.

ok ho capito quello che dicono quelle guide ma come lo metto in pratica?
Si impara a programmare facendo, quindi trova cose da fare ma parti gradualmente.
Ad esempio fai un programma che ordina dei numeri, uno che concatena parole poi... e aumenti di livello.
Io di solito all'inizio come esercizio per imparare un nuovo linguaggio creavo una calcolatrice...

Una domanda: tu lavori come programmatore perché hai fatto il perito informatico o si può lavorare come programmatore senza di quello ma con un altro diploma?
Da me programmano anche laureati in fisica, il titolo conta fino ad un certo punto. Devi saper fare.
Quello che conta di piu' quindi e' l'esperienza.

Io lavoro in una multinazionale e faccio software di automazione industriale.
Si sviluppa un prodotto e tu ti occupi di una parte, io sono nel gruppo interfacce grafiche (GUI) di Ricerca & Sviluppo.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Questo e' gia' un programma in italiano, a quel punto che sia VB,C++ o C# non conta.
Beh in realtà si. A seconda del software, può esservi un linguaggio migliore o da preferire. E (in teoria) dovresti sfruttare tutte le potenzialità che il linguaggio ti offre.
E qui entra in ballo l'ingegneria del software.
 
M

Mursey

Ospite
Beh in realtà si. A seconda del software, può esservi un linguaggio migliore o da preferire. E (in teoria) dovresti sfruttare tutte le potenzialità che il linguaggio ti offre.
E qui entra in ballo l'ingegneria del software.

Vero.
Nella pratica finale conta moltissimo la scelta del linguaggio ma nello studio da principiante e' importante capire il meccanismo.
Una volta che hai la mentalita' del programmatore sei in grado di scegliere il linguaggio piu' adatto.

Se devo fare la somma di due numeri la faccio in VB6 e non certo in C++ :D
 
Ultima modifica da un moderatore:

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Ma lui è un inesperto, io non gli consiglierei di proseguire con C. Ha problemi con le basi, figuriamoci quando dovrà scrivere e progettare programmi complessi.
Python o visual basic.net sono imho la scelta migliore.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili