Sì, il primo funziona, il secondo nemmeno compila.
strcpy è solo per le stringhe di caratteri, per cui la normale assegnazione non funziona dato che bisogna copiare più caratteri (e fermarsi al terminatore della stringa); per tutti i tipi primitivi si usa la normale assegnazione.
Bisogna scrivere float esattamente perché sono dichiarati numeri interi. Dato che AT e AB sono interi, AT/AB effettua una divisione intera, che non calcola le cifre decimali; moltiplicare per 100 dopo non serve a niente - la precisione si è persa nella divisione. Se ad esempio AT fosse 2 e AB fosse 3, il risultato che tu vorresti è 66, mentre quello che otterresti facendo AT/AB*100 sarebbe 0 (2/3 = 0 in divisione intera; 0*100 = 0).Come mai bisogna scrivere float se sono state dichiarati numeri interi?codice:I=(float)AT/(float)AB*100;
Fare un cast a float fa in modo che la divisione venga eseguita in floating point, per cui (float)2/(float)3 = 0.6666666f; 0.6666666f * 100 = 66.666f.
Nota che il fatto che il tutto venga assegnato ad una variabile di tipo float non ha alcuna influenza su come viene valutata l'espressione: il calcolo dell'espressione avviene indipendentemente da dove andrà ad essere assegnato il suo risultato.