› Foros › PlayStation 3 › Scene
el_itineranT escribió:xXDraklordXx escribió:Prefiero empezar por aquí para tener claro como hacer el resto ya que si luego encuentro una forma mejor de pasar los argumentos tendría que volver a escribir todo lo que llevase hecho
Lo de ingenieria del software va por aqui, si tienes que volver a esribir codigo para hacer modificaciones, eso se considera un error de diseño, su escalabilidad es nula, y eso tambien es un error de programacion.Yo procuraria hacer muchos metodos que realicen las acciones simples, y el modulo principal, solo hace las llamadas a los metodos(estos metodos a su vez tienen que tener otros metodos), de manera que añadir funcionalidades nuevas o modificaciones no tengas que empezar de nuevo el codigo.
decir, que soy estudiante de ing.informatica (en curso) y que puedo estar metiendo la pata hasta el fondo, si me equivoco agradezco a qualquiera que me corrija.
char *commandBuffer = (char*)malloc(8096);
/*declaramos un buffer suficientemente grande como para obtener un comando largo *
gets(commandBuffer); // Obtenemos orden consola
char *subBuffer = (char*)malloc(strlen(commandBuffer));
/* Creamos un 2o buffer del tamaño de la orden (que no es el mismo que el del 1r buffer) */
strcpy(subBuffer, commandBuffer);
//strcpy se encuentra en "string.h"
/* Copiamos el contenido del 1r buffer al 2o */
free(commandBuffer); //Liberamos la memoria del primer buffer
char *commandBuffer = (char*)malloc(8096);
/*declaramos un buffer suficientemente grande como para obtener un comando largo */
while(1){ //bucle infinito!!
gets(commandBuffer);
//..... Operaciones
//Ejemplo para salir del loop
if(strstr(commandBuffer, "quit"))
break;
//strstr en "string.h"
/* si el texto contiene (si contiene, no si es igual a) "quit" sale del loop */
memset(commandBuffer, 0, 8096);
/*Ponemos cada 1 de las posiciones de memoria de la array commandBuffer a 0 para prepararlo para el siguiente loop. Solo utilizamos 8096 de memoria, o el tamaño que tu le des */
}
char txt[] = "hola cruel mundo";
char *str = strtok(txt, " ");
//strtok en "string.h"
/* Divide la cadena según el carácter (o caracteres) del 2o parámetro. Aquí es el espacio " ".
Nota: NO devuelve una array, sino cada ocurrencia por separado. Continua leyendo el ejemplo */
while(str){
printf("%s\n", str);
str = strtok(NULL, " ");
/* Fijate en el NULL, ya no hemos puesto la "txt". Esto indica que queremos la siguiente ocurrencia de la string previa. Si teníamos la 1, nos da la 2, si era la 2, la 3. Si no hay mas, devuelve NULL, y de aquí el while(str), que es lo mismo que while(str != NULL) */
}
//RESULTADO:
//hola
//cruel
//mundo
blipi escribió:No se a quien, pero he visto usar la palabra "new". Esta existe SOLO en c++, y aunque un compilador quizás os la acepte, en C debemos hablar de "malloc", no de "new".
No pasa nada, pero a bien clarificar.
memset(commandBuffer, 0, 8096); //O el tamaño que le des
memset(commandBuffer, 0, sizeof(commandBuffer));
function main
var a = 2
var b = "ool"
var c = 9.9
var d="ool"
var m = "lo l"
var n = "\n dod"
print m
print n & m
print "baaaaaaaaaab" & " caac " & n
print 2 & " " & m & "\n" & " " & OMFG
endfunction
void listFiles(char *commandBuff){
/*commandBuff es esto:
gets-> ls -a -b
[-a -b] = commandBuff, son los parámetros
Usa dirent.h y sys/stat.h
*/
if(strstr(commandBuff, "-h")){
printf("\tFuncionamiento:\n");
printf("\tls ~ Obtener listado de archivos y carpetas\n");
printf("\tls [-f] ~ Obtener listado de archivos\n");
printf("\tls [-d] ~ Obtener listado de carpetas\n");
printf("\tls [-a] ~ Obtener listado detallado\n");
return;
}
DIR *dir;
struct dirent *ent;
/*fullPath es la ruta a la carpeta*/
printf("P-\t%s\n\n", fullPath);
int displayFiles = 0;
if(strstr(commandBuff, "-f") || commandBuff == NULL)
displayFiles = 1;
int displayFolders = 0;
if(strstr(commandBuff, "-d") || commandBuff == NULL)
displayFolders = 1;
int displayDetail = 0;
if(strstr(commandBuff, "-a") || commandBuff == NULL)
displayDetail = 1;
if(displayFiles == 0 && displayFolders == 0)
displayFiles = displayFolders = 1;
dir = opendir (fullPath);
if (dir != NULL){
while ((ent = readdir (dir)) != NULL){
struct stat g;
char filename[2048];
/* Si el último carácter de la ruta no es \ ('\\'), lo añadimos */
strcpy(filename, fullPath);
if(filename[strlen(filename)-1] != '\\')
strcat(filename, "\\");
/* SISTEMAS UNIX, TERMINACIÓN '/'
if(filename[strlen(filename)-1] != '/')
strcat(filename, "/");
*/
strcat(filename, ent->d_name);
int displayItem = 0;
if(stat(filename, &g) >= 0){
//NOTA: _S_IFDIR = S_IFDIR = DT_DIR -> Depende del OS y del compilador
//S_ISREG -> Para comprobar archivos, si fuera necesario
if (_S_IFDIR & g.st_mode){
if(displayFolders == 1){
printf ("D-");
displayItem = 1;
}
}else{
if(displayFiles == 1){
printf ("F-");
displayItem = 1;
}
}
}
if(displayItem){
if(displayDetail)
printf("\t-%d%d", ent->data.nFileSizeHigh, ent->data.nFileSizeLow);
printf("\t\t%s\n", ent->d_name);
}
}
closedir (dir);
}
}
blipi escribió:jajaj tranquilo que no me estás dando por ningún lado =P
Si no tengo internet, solo escasos minutos cuando mis padres me lo dan, por eso no puedo ampliar el tuto. Pero cuando me lo dan, me gusta entrar al hilo y responder las dudas, ver que hay gente como tú que tiene ganas de aprender y de hacer cosas me da más ánimos para continuar.
Respecto al tema Objective-C, porqué motivo lo usas? Personalmente no es un lenguaje que me llame mucho la atención, puesto que antes que usar este me decanto más por C++. Pero bueno, a lo que iba. Postealo de todas formas si quieres, y le echo una ojeada. Aunque la sintaxis sea diferente se entiende bien, así que supongo que te podría ayudar en algo.
Para que iOS lo estás haciendo? Porqué yo estoy ansioso por tener un terminal en iOS 4.x, que la ultima versión se quedo para el 3.x. Ya me contarás =P
Mirate esto, quizás (casi seguro que sí) te sirva. Es parte de mi proyecto:void listFiles(char *commandBuff){
/*commandBuff es esto:
gets-> ls -a -b
[-a -b] = commandBuff, son los parámetros
Usa dirent.h y sys/stat.h
*/
if(strstr(commandBuff, "-h")){
printf("\tFuncionamiento:\n");
printf("\tls ~ Obtener listado de archivos y carpetas\n");
printf("\tls [-f] ~ Obtener listado de archivos\n");
printf("\tls [-d] ~ Obtener listado de carpetas\n");
printf("\tls [-a] ~ Obtener listado detallado\n");
return;
}
DIR *dir;
struct dirent *ent;
/*fullPath es la ruta a la carpeta*/
printf("P-\t%s\n\n", fullPath);
int displayFiles = 0;
if(strstr(commandBuff, "-f") || commandBuff == NULL)
displayFiles = 1;
int displayFolders = 0;
if(strstr(commandBuff, "-d") || commandBuff == NULL)
displayFolders = 1;
int displayDetail = 0;
if(strstr(commandBuff, "-a") || commandBuff == NULL)
displayDetail = 1;
if(displayFiles == 0 && displayFolders == 0)
displayFiles = displayFolders = 1;
dir = opendir (fullPath);
if (dir != NULL){
while ((ent = readdir (dir)) != NULL){
struct stat g;
char filename[2048];
/* Si el último carácter de la ruta no es \ ('\\'), lo añadimos */
strcpy(filename, fullPath);
if(filename[strlen(filename)-1] != '\\')
strcat(filename, "\\");
/* SISTEMAS UNIX, TERMINACIÓN '/'
if(filename[strlen(filename)-1] != '/')
strcat(filename, "/");
*/
strcat(filename, ent->d_name);
int displayItem = 0;
if(stat(filename, &g) >= 0){
//NOTA: _S_IFDIR = S_IFDIR = DT_DIR -> Depende del OS y del compilador
//S_ISREG -> Para comprobar archivos, si fuera necesario
if (_S_IFDIR & g.st_mode){
if(displayFolders == 1){
printf ("D-");
displayItem = 1;
}
}else{
if(displayFiles == 1){
printf ("F-");
displayItem = 1;
}
}
}
if(displayItem){
if(displayDetail)
printf("\t-%d%d", ent->data.nFileSizeHigh, ent->data.nFileSizeLow);
printf("\t\t%s\n", ent->d_name);
}
}
closedir (dir);
}
}
Suerte y ánimos con el proyecto! Y si lo subes a cydia avisa, que lo probaré!
void custom_strcat(char *in, char* add){
if(!in || !add) return;
in += strlen(in);
while(*add) *(in++) = *(add++);
*in = '\0';
}
int var_normal = 1;
&var_normal = 0x8792C /*Esto que acabo de hacer no tiene ningún sentido a nivel de programación, pero es para que se entienda*/
int *puntero_a_var; //Declaramos un puntero con *
puntero_a_var = &var_normal; //Le guardamos la dirección de var_normal
void cambiar_valor(int variable){ variable = 10; }
int main(){
int a = 8;
printf("%d\n", a); //Enseñamos el valor de a
cambiar_valor(a); //Se supone que le cambiamos el valor
printf("%d\n", a); //Enseñamos el valor de a
sytem("pause");
}
8
8
Presione...
void cambiar_valor(int *variable){
//Fíjate en el parámetro, un puntero
*variable = 10;
/*Fíjate en el *, si tenemos un puntero ya declarado, en este caso "variable", y le añadimos delante *, lo que modificamos no es el valor del puntero (la dirección), sino aquello que está dentro de esa dirección:
PUNTERO = 0x88E;
si hacemos PUNTERO = 10, lo único que hacemos es cambiarle la dirección a 0xA (10 en decimal = 0xA en hexadecimal)
*PUNTERO = 10
Esto hace:
1. PUNTERO = 0x88E, asi que, vamos a esa dirección
0x88E => aquí se encuentra la variable "a" (hipotéticamente)
a = 10
*/
}
int main(){
int a = 8;
printf("%d\n", a); //Enseñamos el valor de a
cambiar_valor(&a); //Es un puntero lo que nos pide, así que, le damos la dirección de a
printf("%d\n", a); //Enseñamos el valor de a
sytem("pause");
}
8
10
Presione...
blipi escribió:@xXDraklordXx
El problema esta en el strcat() o al hacer printf? Me extraña que strcat de problemas. El tamaño de tu buffer es suficientemente grande como para alojar el texto_base + el texto_añadir? Compruébalo.
xXDraklordXx escribió:Por falta de memoria no es, hay de sobra. El problema sé que está en strcat() porque al omitirlo el "lag" desaparece. Ademas, en lugar de strcat() uso strcpy(), salvo que elimina el texto anterior, el resultado es el mismo y sin lag.
Total, veré que puedo hacer con eso si no se me ocurre nada mas.
xXDraklordXx escribió:Offtopic: Vaya, he iniciado yo las 4 últimas páginas.. ¿no estaré siendo un poco pesado?
blipi escribió:strcpy() significa string_copy, es decir, te copia la 2a en la 1a, por eso te lo elimina.
void miThread(){
while(1){
sleep(20); //Evitar que se sobrecargue
}
}
int main(){
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)miThread, NULL, NULL, NULL);
while(1) sleep(20); //evitar que se salga del programa
}
blipi escribió:Visto que hagas lo que hagas se bloquea, sí, no lo veo tan mala solución.
Crear un proceso en si mismo no se a que te refieres, sin embargo, mirate el tema de los threads. No se hasta que punto deja iOS 4.x gestionar threads, pero si lo hace, esa podría ser tu solución.
Un thread es una "subrutina" que se ejecuta como parte de tu proceso pero no consume la memoria del thread principal (dígase programa).
En windows es algo tan sencillo como:void miThread(){
while(1){
sleep(20); //Evitar que se sobrecargue
}
}
int main(){
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)miThread, NULL, NULL, NULL);
while(1) sleep(20); //evitar que se salga del programa
}
Juen escribió:Exactamente, ¿que longitud de cadena te produce lag? Además, ¿estás haciendo pruebas en el ordenador o sobre el móvil?
Entiendo que usas una cadena como buffer de consola, ¿que estas usando para pintar en ventana el texto, un widget tipo TextEdit?
La verdad es que me dejas un poco perdido con el último mensaje que has puesto, dices que el retardo desaparece cuando lo muestras directamente por consola (¿entiendo que estás usando el ordenador?), ¿lo que muestras por consola es el resultado del strcat o sólo algo tipo printf(ls())?
...
De cualquier manera, si quieres, le echo un ojo al código.
@jorwipuc
Un puntero sirve, por ejemplo, para tener varios "nombres" para la misma zona de memoria. Además la "creación de variables" en tiempo de ejecución solo se puede realizar mediante la reserva de memoria dinámica, espacio que será accesible únicamente a través de un puntero. Leete esto y verás claramente la utilidad (más bien algo de la utilidad) de los punteros.
Se podría decir que con un puntero puedes "nombrar" cualquier zona de la memoria y además, y aquí es donde está toda la gracia del tema, la zona "nombrada" puede cambiar durante la ejecución de un programa (es decir, un puntero es un "alias" de una zona de memoria) cosa que no se puede realizar con las variables convencionales (variables estáticas) pues siempre "nombran" la misma zona. Estudia detenidamente la pagina de la Wikipedia y verás que no es posible montar esa estructura sin punteros.
- (int)ls:(NSArray *)args {
if ([args count]>3) {
[cmdView setText:[[cmdView text] stringByAppendingString:@"\tInvalid use. Type help for more info."]];
} else {
struct dirent *entry;
DIR *dir;
// ls() sin archivos ocultos
if ([args count]==1) {
dir = opendir(getcwd(NULL, 0));
if (dir) {
while (entry = readdir(dir)) {
if (entry->d_name[0]!='.') {
[cmdView setText:[[cmdView text] stringByAppendingString:
[NSString stringWithFormat:@"\t%s\n", entry->d_name]]];
}
}
[self delLastChar]; // Borra el ultimo caracter ('\n') tras añadir el texto
} else {
[cmdView setText:[[cmdView text] stringByAppendingString:@"\tNo such file or directory."]];
}
closedir(dir);
}
}
}
blipi escribió:El problema está, tal y omo supuse, en que cada vez que añades texto haces una lectura del buffer de dicho textView, en [cmdView text]. Claro, a cada llamada pasa lo siguiente. Suponiendo que el texto que se añade es siempre de 100 chars:
1a llamada: Leer buffer: 0 ; Añadir 100
2a llamada: Leer buffer: 100 ; Añadir 100
10a llamada: Leer buffer: 900 ; Añadir 100
Etc. Leer todo el buffer implica tiempo. A mas buffer, mas tiempo. No se como funcionan las appendString con o sin Format en Objective-C, pero parece ser que lo leen todo. En medida de lo posible, yo usaría una variable char* (o NSArray*) como único buffer. Usaría strcat explícitamente en ese buffer, y luego añadiría todo ese buffer al textView, sin leer el contenido de este ultimo.
Si sigue dando lag, estaría claro que el problema es que el textview no soporta gran cantidad de texto, ya que para poder enseñarlo tiene que leer todo el buffer, y lo hace de manera lenta e inefectiva.
Espero sea de ayuda,
Salu2!
help
cd(path)
ls(-a all files, -i info)
pwd
clear
read(text file, -b bin file)
echo(text, -f file, -b bin file)
about
chname(shell name)
exit
toni_23 escribió:Quiero empezar a aprender un poco de programación en C y me gustaria saber con que programa puedo simular el código que llevo.
Un saludo
blipi escribió:@toni_23
Hay infinidad de IDE y entornos de programación. En las páginas 1-15, no me acuerdo, ya se comentaron varios.
Además, en el capítulo 5 del tutorial, justo al principio de todo, describo como utilizar Visual C++ Express 2010 (o inferior), un IDE.
@xXDraklordXx
Pues entonces no me queda más que pensar que el problema es el propio textView. Realmente, hay alguna necesidad de usarlo? Quiero decir, no puedes simplemente tirar de la consola?
Si consigues resolverlo, ya me contarás como, que tengo curiosidad ya jeje
Salu2!
Qarl escribió:toni_23 escribió:Quiero empezar a aprender un poco de programación en C y me gustaria saber con que programa puedo simular el código que llevo.
Un saludo
Depende para la plataforma que quieras o hayas preparado el código.
Mediante esas líneas de código se genera un ejecutable (compilación) que después puedes "simular" como bien dices en la plataforma correspondiente.
Lo que tienes que hacer es instalarte un IDE (Entorno de Desarrollo) y compilar el código. Para Windows yo uso WxDev-C++ que es libre, gratuito y está bastante bien.
De todas formas, dinos para que plataforma te interesa desarrollar y te echamos un cable. Te recomiendo que empieces por PC ya que es lo más estándar y documentado.
Un saludo!
blipi escribió:Se que a la mayoría esto les va a importar poco, pero este es el estado actual de mi proyecto "Routin3". Para los que no lo leyeron, Routin3 será un intérprete o meta-lenguaje de programación, enfocado a aprender C de manera sencilla. La sintaxis se basa en la de Basic, pero incluirá modificaciones para adaptarla a C.
Se basa en un simple ejecutable de 20 kb de tamaño y un archivo de texto (o en cualquier formato) conteniendo el código. Se ejecuta mediante una simple orden "exec" (coge por defecto el archivo "routine.txt" en el directorio actual), o "exec [ruta]".
Estado actual:
- Declara variables
- Guarda valores a variables, tanto directamente, como (var a = "A"), como mediante funciones, (var b = obtenerValor())
- Se pueden declarar funciones con argumentos, y pasar dichos argumentos
- Implementada función print
- Corrector de sintaxis
- Llamadas a funciones
A hacer (por orden de prioridad):
- Detección de error al declarar string con más de 2 "", (esto: "hola "amigo"" y esto: "hola "amigo" es válido, pero no debería serlo)
- Aun no se acepta el rango de variable local / global. -> Después de esto sacaré un versión pública.
- Operaciones matemáticas y lógicas (+, -, pow, etc)
- Operaciones de condicionales y bucles (if, else, y bucles)
- Codificación de punteros de memoria
- Codificación de arrays
- Codificación de structs
- Codificación de clases
Aquí tenéis una foto del proyecto:
var mi_array[20] = "A"
mi_array[5] = "B"
function test(var una_array[])
test(mi_array)
function main()
var a[5] = "B\n"
print "MAIN1: " & a[2]
submain_1(a, "I\n\n")
a[2] = just_a_test()
submain_2(a[2])
print "\n\n"
var c = print_custom("TEST\n")
print c
endfunction
function submain_1(var b[], var m)
print "SUBMAIN_1: " & b[2] & " " & m
endfunction
function submain_2(var b)
print "SUBMAIN_2: " & b
endfunction
function just_a_test()
return "OMFG!"
endfunction
function print_custom(var value)
print value
return value
endfunction
exec ./archivo.txt //en la misma ruta
exec C:/archivo.txt //otra ruta
struct _PROGRAM_STACK;
struct _PROGRAM_FUNCS_MAP;
struct _PROGRAM_FUNCS_CURRENT;
struct _PROGRAM_VAR;
struct _PROGRAM_LINES;
struct _PROGRAM_COMMANDS;
//La parte más importante. Mantiene la cuenta de todo en cuanto pasa.
struct _PROGRAM_STACK{
int lineCount;
int mainFunc;
void *retVal;
_PROGRAM_VAR *parametersStack;
_PROGRAM_FUNCS_CURRENT *pCurrentFunc;
_PROGRAM_FUNCS_MAP *pMainMap;
_PROGRAM_FUNCS_MAP *pMap;
_PROGRAM_FUNCS_MAP *lastMap;
_PROGRAM_VAR *pVars;
_PROGRAM_VAR *lastVar;
_PROGRAM_LINES *pLines;
_PROGRAM_LINES *lastLine;
_PROGRAM_COMMANDS *cCommands;
};
//Cada una de las funciones mapeadas
struct _PROGRAM_FUNCS_MAP{
int lineNum;
int endLineNum;
_PROGRAM_LINES *openLine;
char *funcName;
int numArgs;
char *argName[10];
int argType[10];
_PROGRAM_FUNCS_MAP *next; //Siguiente variable
_PROGRAM_FUNCS_MAP *prev; //Anterior variable
};
//Función ejecutandose, por ejemplo: Test2->Test1->Main (hemos empezado desde main haciendo llamada a Test1 y luego desde Test1 a Test2, funciona como una pila)
struct _PROGRAM_FUNCS_CURRENT{
_PROGRAM_FUNCS_MAP *pFunc;
_PROGRAM_FUNCS_CURRENT *prev;
};
//Cada una de las variables que se declaran
struct _PROGRAM_VAR{
int varType;
int arrayType; //array type
int arrayMaxLen;
_PROGRAM_VAR *arrayValue;
_PROGRAM_VAR *lastArrayValue;
//
//1. INT
//2. FLOAT
//3. DOUBLE
//4. CHAR
//5. ARRAY
//
char *varName;
void *varValue;
char varRange[500];
_PROGRAM_VAR *next;
_PROGRAM_VAR *prev;
};
//Cada una de las línea del programa
struct _PROGRAM_LINES{
int lineNum;
char *lineLine;
int lineType;
//
//1. Simple command
//2. Function start
//3. Function end
//4. Composed command
//
int lineComposedReference;
_PROGRAM_LINES *next;
_PROGRAM_LINES *prev;
};
if (iguales = (x == y)? 1:0)
cltomas escribió:Ya que este es el hilo de programación, me sacan esta duda, se pueden utilizar este tipo de sentencias:if (iguales = (x == y)? 1:0)
Qarl escribió:cltomas escribió:Ya que este es el hilo de programación, me sacan esta duda, se pueden utilizar este tipo de sentencias:if (iguales = (x == y)? 1:0)
Pues así a simple vista no... que quieres hacer?? ponlo en pseudocódigo y te digo como sería en C.
Crear un programa que use el operador condicional para dar a una variable llamada
“iguales” (entera) el valor 1 si los dos números que ha tecleado el usuario son iguales,
o el valor 0 si son distintos.
#include <stdio.h>
int main()
{
int x, y, iguales,distintos;
printf("\nDame un numero =>");
scanf("%d", &x);
printf("Dame otro número =>");
scanf("%d", &y);
if (iguales = (x == y)? 1:0)
printf("\nLos numeros son iguales %d\n", iguales);
else
printf("\nLos números no son iguales %d\n", iguales);
getchar();
return 0;
}
iguales = ((x == y)?1:0)
blipi escribió:no exactamente, lo que tu quieres hacer es así:iguales = ((x == y)?1:0)
iguales = ((x == y)?1:0);
if(iguales == 0) printf("No iguales");
if(x == y)
iguales = 1;
else{
iguales = 0;
printf("No iguales");
}
if((iguales = ((x == y)?1:0)) == 0)
printf ("No iguales);
else printf("Iguales");
blipi escribió:EDITO: De hecho, si hay una solución más, creo, puesto que no lo he comprobado:if((iguales = ((x == y)?1:0)) == 0)
printf ("No iguales);
else printf("Iguales");
#include <stdio.h>
/*Dados como entrada 3 enteros representando la fecha como dia ́ mes, año, imprimir la fecha del dia anterior.
Por ejemplo para una entrada como: 1 3 1992 La salida seria: Fecha anterior a 1-3-1992 es 29-02-1992 */
int main()
{
int dia;
int mes;
int anno;
int dia2, mes2;
int fecha;
int anno2;
printf("\nIntroduce el Día del mes=>\n");
scanf("%d", &dia);
getchar();
printf("\nIntroduce el mes [numerario]=>\n");
scanf("%d", &mes);
getchar();
printf("\nIntroduce el año =>\n");
scanf("%d", &anno);
getchar();
dia2=dia-1;
mes2=mes-1;
anno2=anno-1;
/* como restringir la entrada del dia y mes a 2 digitos y año a 4 digitos*/
if((dia2 == 0) && (mes2 == 0) && (anno != 0)) //caundo fecha sea del tipo 1-1-1977
{
dia2 = 30;
mes2 = 12;
printf("\n[1º] La fecha anterior a %d-%d-%d es %d-%d-%d\n", dia, mes, anno, dia2, mes2, anno2);
}
else
if ((dia2 > 0) && (mes2 == 0) && (anno != 0))// cuando fecha sea del tipo 12-1-1977
{
dia2=dia - 1;
mes2=mes2 + 1;
printf("\n[2º]La fecha anterior a %d-%d-%d es %d-%d-%d\n", dia, mes, anno, dia2, mes2, anno);
}
else
if ((dia2 == 0) && (mes2 > 0) && (anno != 0))// cuando fecha sea del tipo 1-12-1977
{
dia2= 30;
mes2=mes -1;
printf("\n[3º]La fecha anterior a %d-%d-%d es %d-%d-%d\n", dia, mes, anno, dia2, mes2, anno);
}
else
if ((dia2 > 0) && (mes2>0) && (anno != 0))//cuando fecha sea del tipo 16-4-1977
{
dia2=dia -1;
mes2=mes2 + 1;
printf("\n[4º]La fecha anterior a %d-%d-%d es %d-%d-%d\n", dia, mes, anno, dia2, mes2, anno);
}
else
if ((dia == 0) || (mes == 0) || (anno == 0))
{
printf("\n[5] ERROR ..Has introducido un 0.. \n");
}
else
{
printf("\nERROR!!!! (día, mes, año negativo?)\n");//para números negativos LoL!!!!
}
getchar();
return 0;
}
#include <stdio.h>
int main()
{
int x, y;
printf("Dame un numero => ");
scanf("%d",&x);
printf("Dame otro número => ");
scanf("%d",&y);
if(x == y)
printf("\nLos numeros son iguales.\n", iguales);
else
printf("\nLos números no son iguales.\n", iguales);
getchar();
return 0;
}
Qarl escribió:La forma más fácil que veo para hacer lo que comentas cltomas es la siguiente:#include <stdio.h>
int main()
{
int x, y;
printf("Dame un numero => ");
scanf("%d",&x);
printf("Dame otro número => ");
scanf("%d",&y);
if(x == y)
printf("\nLos numeros son iguales.\n", iguales);
else
printf("\nLos números no son iguales.\n", iguales);
getchar();
return 0;
}
Salu2
?
int main()
{
int x, y, iguales;
printf("Dame un numero => ");
scanf("%d",&x);
printf("Dame otro número => ");
scanf("%d",&y);
iguales = ((x==y) ? (1:0));
if(iguales == 1)
printf("\nLos numeros son iguales.\n", iguales);
else
printf("\nLos números no son iguales.\n", iguales);
getchar();
return 0;
}
iguales = (x==y) ? 1:0;
$ gcc -o igual igual.c
igual.c: In function ‘main’:
igual.c:5: warning: incompatible implicit declaration of built-in function ‘printf’
igual.c:6: warning: incompatible implicit declaration of built-in function ‘scanf’
#include <stdio.h>
iguales = (x==y) ? 1:0;
iguales = ((x==y) ? 1:0);
iguales = ((x==y) ? (1:0));
blipi escribió:Mucho me temo que:iguales = (x==y) ? 1:0;
es lo mismo queiguales = ((x==y) ? 1:0);
que es lo mismo queiguales = ((x==y) ? (1:0));
y que muchas mas variantes que se pueden escribir.
Salu2