El que sea necesario o no lo debes de responder tú. Lee y documéntate para que sepas en qué te puede ser útil el Visual Basic
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCitarSe te agradecerá cuando cites algo importante sin citar de manera tan impulsiva un post) ).
CitarEn mi humilde opinión....
CitarEsa es mi opinión....... Pero creo que en algo puedo aportar. Y sí, como tú dices, estoy totalmente de acuerdo con esto:
Citaresto de usar scanf y printf no solo tiene que ver con formalismos, de hecho se hace mas legible un codigo a la hora de leer
Citar
lo ideal es que tus funciones que realicen un proceso X retornen códigos de error para que funciones madres por ejemplo main sepa que hacer ante mas de 1 o 2 situaciones. se puede usar de una manera pero seria con fprintf() en conjunto a Standard error stream (stderr) solamente para debugear y mostrar los errores, pero que solo una persona especializada (en este caso tu) sepas que a ocurrido y el usuario normal solo se preocupe en su funcionamiento y no en codigo o errores que a final de cuentas a el no le interesan... un ejemplo:
Código
#include <stdlib.h>
#include <stdio.h> //<stdio.h>
#include <string.h>
char* readInput(FILE* FileSrc)
// Retorna un puntero a una cadena ansi que debera ser liberada con free();
{
char c = 0;
char *szRet = NULL;
size_t size = 0;
while(++size)
{
szRet = (char*)realloc(szRet, size);
fread(&c, 1, 1, FileSrc);
if (c == '\n')
break; // exit while(1)
szRet[size - 1] = c;
}
return szRet;
}
long int getActionFromString(const char *szStr)
// Verifica la existencia de vocales dentro de una cadena dada.
{
long int lFlags = 0;
if (szStr)
{
do
{
switch(*szStr) // <-- en luigar de poner los printf usamos flags para saber que hacer en un proceso que nos llamo...
{
case 'A':case 'a': lFlags |= 0x1;
break;
case 'E':case 'e': lFlags |= 0x2;
break;
case 'I':case 'i': lFlags |= 0x4;
break;
case 'O':case 'o': lFlags |= 0x8;
break;
case 'U':case 'u': lFlags |= 0x10;
break;
}
} while (*(++szStr) != '\0');
}
return lFlags;
}
int main()
{
// claro evita poner mucho codigo tambien en el main()... evita esto que hice.
char* szTmp = NULL;
long int lFlags = 0;
puts("ingresa una cadena:");
szTmp = readInput(stdin);
lFlags = getActionFromString(szTmp);
if (lFlags == 0x0)
{
fprintf(stdout, "Cadena limpia de vocales\n");
} else {
fprintf(stdout, "Error cadena con vocales\n");
if (lFlags & 0x1)
fprintf(stderr, "Error Contiene la vocal \"a\" code: %d\n", lFlags);
if (lFlags & 0x2)
fprintf(stderr, "Error Contiene la vocal \"e\" code: %d\n", lFlags);
if (lFlags & 0x4)
fprintf(stderr, "Error Contiene la vocal \"i\" code: %d\n", lFlags);
if (lFlags & 0x8)
fprintf(stderr, "Error Contiene la vocal \"o\" code: %d\n", lFlags);
if (lFlags & 0x10)
fprintf(stderr, "Error Contiene la vocal \"u\" code: %d\n", lFlags);
}
free(szTmp);
return EXIT_SUCCESS;
}
Dulces Lunas!¡.
int main(){
return 0;
}
Citarint main(int argc, char *argv[]) {
CitarBuenas:
A parte de lo que te ha comentado rir3760 deberías, sobre lo del tamaño se debe a cómo incluyes las librerías, esto es, existen dos modos:
Librería estática: Se incluye en el ejecutable final todas las librerías que has usado en el programa.
Librería dinámica: No se incluyen las librerías sino que se añade información sobre dónde están situadas en el PC y al procesar el ejecuta ble se buscan las librerías y para usar las funciones.
Lógicamente si compilas con el modo "librería estática" el ejecutabe pesará más ya que se incluye la librería completa, pero esto tiene la ventaja de que si llevas el programa a otro PC no tendrás problemas de que en dicho PC no estén las librerías ya que ya van dentro del ejecutable.
Fíjate si el compilador en C te pone por defecto librería dinámica y en C++ librería estática.
Sobre el tamaño de las variables eso es en tu caso, con tu procesador y compilador, son ellos dos los que deciden qué tamaño debe tener cada tipo, en otro PC serán otros tamaños, de lo único que se puede estar seguro es que el "short int" es de menor tamaño que el "int" y este a su vez menor que el "long int".
CitarSi es que i=0, cuando entra al bucle for, asigna a j=i (osea cero) y luego dice hasta que j>1. Pero 0 no es mayor que 1, osea, ¿Cómo es que j puede retroceder desde 0 hasta mayor que 1? Esta parte me intriga un poco. Espero tu Ayuda.
for (i = 0; i <= num; i++){
fact = 1;
for (j = i; j > 1; j--)
fact *= j;
printf("%2d! = %ld\n", i, fact);
}
Citarprintf("%2d! = %ld\n", i, fact);Aquí pones en la parte de la especificación de conversión a entero siguiente "%d", pones el 2 en medio, ¿Me pregunto que es lo que permite hacer esto?
Citarreturn EXIT_SUCCESS;
#include <iostream>
using namespace std;
int main(){
int n;
long F;
do{
cin>>n;
if(n<0) cout<<"El numero es incorrecto!"<<endl;
}while(n<0);
for(int j=0; j<=n; ++j){
F=1;
if(j>1){
for(int i=1;i<=j;++i){
F*=i;
}
}
cout<<j<<"! = "<<F<<endl;
}
return 0;
}
#include <stdio.h>
int main(){
int n, i, j;
long F;
do{
scanf("%i", &n);
fflush(stdin);
if(n<0) printf("El numero es incorrecto!\n");
}while(n<0);
for(j=0; j<=n; ++j){
F=1;
if(j>1){
for(i=1; i<=j; ++i){
F=F*i;
}
}
printf("%d! = %ld\n", j, F);
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
cout<<sizeof(short)<<endl;
cout<<sizeof(int)<<endl;
cout<<sizeof(long)<<endl;
cout<<sizeof(long long)<<endl;
return 0;
}
Citar
2
4
4
8
#include <stdio.h>
int main(){
printf("%hd\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%ld\n", sizeof(long));
printf("%ld\n", sizeof(long long));
return 0;
}
Citar
2
4
4
8