Menú

Mostrar Mensajes

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ú

Mensajes - leosansan

#581
Si lo piensa más despacio seguro lo sacas sin problemas. Por si acaso te paso la función transponer corregida:

Código (cpp) [Seleccionar]

void transpuesta(int **matriz, int tam)
{
   int aux;
   for (int i=0; i < tam; i++ )
   {
       for(int j=0; j < tam && j<i;j++)
       {
           {
               aux = *(*(matriz+i)+j);
               *(*(matriz+i)+j) = *(*(matriz+j)+i);
               *(*(matriz+j)+i) = aux;
           }
       }
   }
}


Tenias dos fallos lógicos, por un lado sólo aplicabas los cambios a la diagonal- i==j- con lo que no cambia nada-, y por otro lado al recorrer  la matriz al completo, lo que haces en una mitad lo deshaces en la siguiente mitad. Por cierto, ¿no te falta un delete al final del main?.

Saluditos! ..... !!!!        
#582
Perdón, se me había olvidado la función isalpha para tener en cuenta sólo los caracteres alfabéticos. Ahora ya no cuenta los espacio, números, caracteres ....:


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <ctype.h> // para isupper,isalpha

int main()
{
   int cont_min=0,cont_may=0,i;
   char frase []="LeoSanSan RiR";//Desactiva esto y activa los de abajo
   //char frase [300];
   //printf("Ingrese un frase:\n");
   //scanf("%300[^\n]", frase);
   for (i=0;frase[i];i++){
       if ( isalpha(frase[i])!=0){
           if ((isupper(frase[i]))==0 ){
               printf("\nLa letra %c  minuscula.", frase[i]);//SOBRA
               cont_min++;
           }
           else {
               printf("\nLa letra %c es mayuscula.", frase[i]);//SOBRA
               cont_may++;
           }
       }
   }
   printf("\nLas letras en minuscula son %d.", cont_min);
   printf("\nY las letras en mayusculas son %d.", cont_may);
   return 0;
}


Saluditos! ..... !!!!        
#583
toupper y tolower son para transformar a mayúscula y minúscula respectivamente. En cambio isupper e islower son para comprobar si la letra es mayúscula o minúsucula, por lo que serán estas últimas las funciones a utilizar.

Fíjate que el espacio en blanco se cuenta como minúscula, por lo que si sólo quieres contar las letras habrá que desecharlos.

Y como muestra una salida:


Citar
La letra L es mayuscula.
La letra e  minuscula.
La letra o  minuscula.
La letra S es mayuscula.
La letra a  minuscula.
La letra n  minuscula.
La letra S es mayuscula.
La letra a  minuscula.
La letra n  minuscula.
La letra R es mayuscula.
La letra i  minuscula.
La letra R es mayuscula.
Y las letras en minuscula son 7.
Y las letras en mayusculas son 5.

En principio no suelo poner código a menos que el autor del tema lo haga y en realidad pregunte dudas o problemas del mismo.  Pero me has pillado sensible ya que a un tema anterior que te respondí tuviste la gentileza, que creo es lo normal, de dar las gracias. Y ese gesto te honra, así que ahí va mi propuesta, mejorable seguramente:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <ctype.h> // para isupper

int main()
{
   int cont_min=0,cont_may=0,i;
   char frase []="LeoSanSan RiR";//Desactiva esto y activa los de abajo
   //char frase [300];
  // printf("Ingrese un frase:\n");
   //scanf("%300[^\n]", frase);
   for (i=0;frase[i];i++){
       if ( frase[i]!=' '){
           if ((isupper(frase[i]))==0 ){
               printf("\nLa letra %c  minuscula.", frase[i]);//SOBRA
               cont_min++;
           }
           else {
               printf("\nLa letra %c es mayuscula.", frase[i]);//SOBRA
               cont_may++;
           }
       }
   }
   printf("\nLas letras en minuscula son %d.", cont_min);
   printf("\nY las letras en mayusculas son %d.", cont_may);
   return 0;
}


Otra forma es la que te indica ivancea96,más efectivo ya que el mío cuenta los signos y números como minúsculas. Pero como en el enunciado dices de hacer uso de funciones es por lo que te propongo el código anterior.

Saluditos! ..... !!!!        
#584
Posteo como nuevo porque he introducido las mejoras que indiqué en el post anterior.

Ya se pueden introducir números con distinto número de cifras, queda solventado el problema del número total de cifras y el echo de que sumen dos dígitos más de nueve.

No es exactamente como yo resolvería este problema de la suma de dos enteros con un número cualquiera de cifras pero tampoco quería modificar drástica mente el código original. Bueno un poquito sí, como el idioma para enterarme mejor de lo que hacia  :silbar:

La "potencia" del código está en que puede sumar enteros de 30, 100 o más dígitos, cosa que como "int" en C no se puede hacer.

Y para muestra un botón:


Citar
Diga cuantas cifras tiene el primer numero: 3
Diga cuantas cifras tiene el segundo numero: 4
Indique los digitos del primer numero:
6
3
9
Indique los digitos del segundo numero:
9
8
7
5
v1[0]=0 v1[1]=0 v1[2]=6 v1[3]=3 v1[4]=9

v2[0]=0 v2[1]=9 v2[2]=8 v2[3]=7 v2[4]=5


El resultado de la suma es Vt[4]= 4

El resultado de la suma es Vt[3]= 1

El resultado de la suma es Vt[2]= 5

El resultado de la suma es Vt[1]= 0

El resultado de la suma es Vt[0]= 1

La suma es:
1 0 5 1 4
*/

Código (cpp) [Seleccionar]

#include <stdio.h>

int main()
{
int i,j, k ,ch;
int digito1=0, digito2=0, digito_suma=0;
printf("Diga cuantas cifras tiene el primer numero: ");
scanf("%d", &digito1);
printf("Diga cuantas cifras tiene el segundo numero: ");
scanf("%d", &digito2);
   if (digito1 >= digito2)
       digito_suma=digito1;
   else
       digito_suma=digito2;
int v1[digito_suma+1],v2[digito_suma+1],Vt[digito_suma+1];
   for (i=0;i<digito_suma;i++)
       v1[i]=v2[i]=0;
   for (i=0;i<=digito_suma+1;i++)
       Vt[i]=0;

printf("Indique los digitos del primer numero: \n");
for( i=0; i<digito1;i++){
if (digito1<digito2)
           scanf("%d", &v1[i+digito2-digito1+1]);
       else
           scanf("%d", &v1[i+1]);
}
printf("Indique los digitos del segundo numero: \n");
for(i=0; i<digito2; i++){
if (digito2<digito1)
           scanf("%d", &v2[i+digito1-digito2+1]);
       else
           scanf("%d", &v2[i+1]);
}
for(i=0; i<=digito_suma; i++)
printf("v1[%d]=%d\t", i,v1[i]);
puts("\n");
for(i=0; i<=digito_suma;i++)
printf("v2[%d]=%d\t", i,v2[i]);
//Suma
puts("\n");
for(k=digito_suma; k>=0; k--){
       Vt[k] = Vt[k]+ v1[k] + v2[k];
       if(Vt[k]>9){
           Vt[k]-= 10;
           Vt[k-1]+= 1;
       }
       printf("\nEl resultado de la suma es Vt[%d]= %d\n",k, Vt[k]);
   }
puts("\nLa suma es:");
for (k=0; k<=digito_suma; k++)
printf("%d ", Vt[k]);
return 0;
}


Saluditos! ..... !!!!        
#585
Perdonen que postee nuevamente, pero el aporte quedo pendiente y por ser tan diferente lo hago así.

Esta vez construyo una función a la que invoco para extraer tanto por la derecha como por la izquierda:


Código (cpp) [Seleccionar]
#include <stdio.h>

void extraer_y_resto (char *Cadena_lado, char *Cadena,char *Cadena_resto,int a, int b,int c, int d);
void imprimir(char *msg,char *Cadena_resto,char *Cadena_lado);

int  main(void)
{
   int ch,extraer,longitud,i,j,flag;
   char cadena[]="leosansan";
   for (i=0;cadena[i] ;i++);
   longitud=i;
   do {
       printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
       fflush(stdout);
       flag=(scanf("%d", &extraer));
       while( (ch = getchar()) != '\n' );
   }while (extraer > longitud ||flag==0);
   char cadena_Lado[longitud-extraer+1],cadena_resto[extraer];
   printf("\nCadena original:  %s\n",cadena);
   extraer_y_resto (cadena_Lado, cadena,cadena_resto,0,longitud-extraer ,longitud-extraer, longitud);
   imprimir ("derecha",cadena_resto,cadena_Lado);
   extraer_y_resto (cadena_Lado,cadena, cadena_resto, extraer, longitud, 0,extraer);
   imprimir ("izquierda",cadena_resto,cadena_Lado);
   return 0;
}

void extraer_y_resto (char *Cadena_lado, char *Cadena,char *Cadena_resto,int a, int b,int c, int d)
{
   int i,j;
   for (i=a,j=0; i<b; i++,j++)
       Cadena_lado[j]=Cadena[i];
   Cadena_lado[j]='\0';
   for (i=c,j=0; i<d; i++,j++)
       Cadena_resto[j]=Cadena[i];
   Cadena_resto[j]='\0';
}
void imprimir(char *msg,char *Cadena_resto,char *Cadena_lado)
{
   printf("\nSe ha extraido por la %s: %s\n",msg,Cadena_resto);
   printf("\nY queda la cadena: %s\n", Cadena_lado);
}


Saluditos! ..... !!!!        
#586
Tal como lo tienes planteado no es muy útil introducir el número como vector, sería mejor hacerlo directamente como un número:


Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
   int n, i, num;
   do{
       printf("Introduce el numero: ");
       scanf("%d", &num);
   }while(num<10 || num>999999999);
   // Mostrar vector
   printf("\n\nNumero:\n");
   printf("____________________\n\n");
   printf(" %d \n\n", num);
   // PALINDROMO
   int temp = num;
   int extraer = 0;
   int nuevonumero = 0;
   for(i = 0; temp > 0; i++){
       extraer = temp%10;
       nuevonumero = (nuevonumero*10) + extraer;
       printf("nuevonumero=%d\n",nuevonumero);;system("pause");//sobra
       temp = temp/10;
   }
   if(num == nuevonumero)
       printf("\n\nEs palindromo");
   else
       printf("\n\nNo es palindromo");
   return 0;
}


Pero si quieres usar el vector y nuevonumero te serviría;

Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
   int n, i, num;
   do{
       printf("Grandaria del vector: ");
       scanf("%d", &n);
   }while(n<2 || n>20); //Entre 2 y 20
   int vector[n];
   for (i=0; i<n; i++){
       do{
          printf("Introduce un numero, vector %i: ", i+1);
          scanf("%d",&num);
          vector[i] = num;
       }while(num<0 || num>9); // Entre 0 y 9
   }
   // Mostrar vector
   printf("\n\nVector:\n");
   printf("____________________\n\n");
   for (i=0; i<n; i++)
       printf(" %d ", vector[i]);
   int temp = 0;
   for (i=0; i<n; i++){
       temp=temp*10+vector[i];
   }
   printf("\ntemp=%d\n",temp);//sobra
   // PALINDROMO
   int nuevonumero = 0;
   for(i = n-1;  i>=0 ; i--){
       nuevonumero= nuevonumero*10+vector[i] ;
       printf("nuevonumero=%d\n",nuevonumero);system("pause");
   }
   if(temp == nuevonumero)
       printf("\n\nEs palindromo");
   else
       printf("\n\nNo es palindromo");
   return 0;
}


Aunque ya que estas usando un array, lo más simple sería ir comparando los extremos del vector:, como indico Almapa

Código (cpp) [Seleccionar]
#include <stdio.h>

int main(){
   int n, i, num;
   do{
       printf("Tam\xA4o del vector: ");
       scanf("%d", &n);
   }while(n<2 || n>20); //Entre 2 y 20
   int vector[n];
   for (i=0; i<n; i++){
       do{
          printf("Introduce un numero, vector %i: ", i+1);
          scanf("%d",&num);
          vector[i] = num;
       }while(num<0 || num>9); // Entre 0 y 9
   }
   // Mostrar vector
   printf("\n\nVector:\n");
   printf("____________________\n\n");
   for (i=0; i<n; i++)
       printf(" %d ", vector[i]);
   // PALINDROMO
   for(i = 0;  i<n/2 ; i++){
       printf("\n\ni=%d  vector[%d]=%d  vector[%d]=%d\n",i,i,vector[i],n-i-1,vector[n-i-1]);//sobra
       system("pause");//sobra
       if (vector[i]!=vector[n-i-1]){
           printf("\n\nNo es palindromo");
           return 1;
       }
   }
   printf("\n\nEs palindromo");
   return 0;
}


Saluditos! ..... !!!!        
#587


Una muestra de que el código si puede funcionar:


Citar
Digues quantes xifres tÚ el primer numero: 2
Digues quantes xifres tÚ el segon numero: 2
Digues els numeros de la suma (separa cada numero amb un espai): 1
3
Digues els numeros de la suma (separa cada numero amb un espai): 4
5
v1[1]=3 v1[0]=1

v2[1]=5 v2[0]=4
El resultat de la suma es Vt[0]= 5

El resultat de la suma es Vt[1]= 8

La suma es:
5 8

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
int *v1=0, i,*v2=0,j, *Vt, k ,ch;
int espai1=0, espai2=0, espai3=0;

printf("Digues quantes xifres té el primer numero: ");
scanf("%d", &espai1);
printf("Digues quantes xifres té el segon numero: ");
scanf("%d", &espai2);
   if (espai1 >= espai2)
       espai3=espai1;
   else
       espai3=espai2;
//Per a adjudicar el tamany dels vectors
v1 = (int *)malloc( espai3*sizeof(int) );
v2 = (int *)malloc( espai3*sizeof(int) );
Vt = (int *)malloc( espai3*sizeof(int) );
for (i=0;i<espai2;i++)
           v1[i]=v2[i]=0;
       // Dar la cantidad de numeros

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for( i=0; i<espai1;i++)
{
scanf("%d", &v1[i]);
}

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for(j=0; j<espai2; j++)
{
scanf("%d", &v2[j]);
}

//Poner los numeros en un orden inverso

for(i=espai1-1; i>=0; i--)
{
printf("v1[%d]=%d\t", i,v1[i]);
}
puts("\n");
for(j=espai2-1; j>=0;j--)
{
printf("v2[%d]=%d\t", j,v2[j]);
}

//Suma
for(k=0; k<espai3; k ++)
{
Vt[k] =0;
Vt[k] = v1[k] + v2[k];
if(Vt[k]>9)
{
k++;
Vt[k]= Vt[k] + 1;
}
printf("\nEl resultat de la suma es Vt[%d]= %d\n",k, Vt[k]);
}

// Ordenar el resultado
puts("\nLa suma es:");
for (k=0; k<espai3; k++)
{
printf("%d ", Vt[k]);//system("pause");
}

return 0;
}


Pero tal como está suma números de iguales cifras -puedes solventar el problema introduciendo ceros al de menos cifras o mejor modificando el código pata tener en cuenta esta opción- ,. Tienes que arreglar lo anterior y también tienes que arreglar cuando sumen dos dígitos más de nueve. Como está no furula.  :rolleyes:

Pero ese no es el único de tus problemas ya que la dimensión de la suma debería ser "espai3+1", en previsión de lo que te comenté de que la suma de las cifras más significativas sea superior a 9.  :silbar:


Saluditos! ..... !!!!        
#588
Programación C/C++ / Re: que algoritmo utilizar?
15 Diciembre 2013, 16:18 PM

Para un número tan pequeño no me complicaría la vida y elegiría el método de burbuja sólo que aprovecharía y, a la vez que ordeno los tiempos, iría ordenando los atletas.

Saluditos! ..... !!!!       
#589
Cita de: ivancea96 en 15 Diciembre 2013, 15:02 PM
Naada era de coña. Pero más explicado no puede estar xD

Sorry, "toy" sencible, pero ahora lo pillo, tipo C++. ;-)

Aprovecho para postear el código con las dos operaciones a la vez:

Código (cpp) [Seleccionar]

#include <stdio.h>

int  main(void)
{
   int ch,extraer,longitud,i,j,flag;
   char cadena[]="leosansan";
   for (i=0;cadena[i] ;i++);
   longitud=i;
   do {
       printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
       fflush(stdout);
       flag=(scanf("%d", &extraer));
       while( (ch = getchar()) != '\n' );
   }while (extraer > longitud ||flag==0);
   char cadenaDcha[longitud-extraer+1];
   for (i=0,j=0; i<longitud-extraer; i++,j++)
       cadenaDcha[j]=cadena[i];
   cadenaDcha[j]='\0';
   printf("\nCadena original:  %s\n",cadena);
   printf("\nSe ha extraido por la derecha: ");
   fflush(stdout);
   for (i=longitud-extraer; i<longitud; i++)
       printf("%c", cadena[i]);
       printf("\n\nY queda la cadena: %s\n", cadenaDcha);

   char cadenaIzq[longitud-extraer+1];
   for (i=extraer,j=0; i<longitud; i++,j++)
       cadenaIzq[j]=cadena[i];
   cadenaIzq[j]='\0';
   printf("\nSe ha extraido por la izquierda: %.*s\n", extraer, cadena);
   printf("\nY queda la cadena: %s\n", cadenaIzq);
   return 0;
}


Pero mejor es el que sigue, ya que guarda en arrays los restos de las cadenas:

Código (cpp) [Seleccionar]


#include <stdio.h>

int  main(void)
{
   int ch,extraer,longitud,i,j,flag;
   char cadena[]="leosansan";
   for (i=0;cadena[i] ;i++);
   longitud=i;
   do {
       printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
       fflush(stdout);
       flag=(scanf("%d", &extraer));
       while( (ch = getchar()) != '\n' );
   }while (extraer > longitud ||flag==0);

   char cadenaDcha[longitud-extraer+1],cadenaIzq[longitud-extraer+1],cadenaDcha_resto[extraer],cadenaIzqda_resto[extraer];
   printf("\nCadena original:  %s\n",cadena);

   for (i=0,j=0; i<longitud-extraer; i++,j++)
       cadenaDcha[j]=cadena[i];
   cadenaDcha[j]='\0';
   for (i=longitud-extraer,j=0; i<longitud; i++,j++)
       cadenaDcha_resto[j]=cadena[i];
   cadenaDcha_resto[j]='\0';
   printf("\nSe ha extraido por la derecha: %s\n",cadenaDcha_resto);
   printf("\nY queda la cadena: %s\n", cadenaDcha);

   for (i=extraer,j=0; i<longitud; i++,j++)
       cadenaIzq[j]=cadena[i];
   cadenaIzq[j]='\0';
   for (i=0,j=0; i<extraer; i++,j++)
       cadenaIzqda_resto[j]=cadena[i];
   cadenaIzqda_resto[j]='\0';
   printf("\nSe ha extraido por la izquierda: %s\n", cadenaIzqda_resto);
   printf("\nY queda la cadena: %s\n", cadenaIzq);
   return 0;
}


Ya sólo queda hacerlo mediante una función que sirva tanto para la izquierda como para la derecha aprovechando que esas partes del código son cuasi-iguales.

Saluditos! ..... !!!!        
#590

¿Te puedes explicar mejor ivancea96?.

Saluditos! ..... !!!!