Red de conocimiento informático - Computadora portátil - ¡Problema de programación en lenguaje C! !

¡Problema de programación en lenguaje C! !

1. Programa para encontrar la palabra más larga en una cadena conocida. ¡Suponga que la cadena solo contiene letras y se utilizan espacios para separar diferentes palabras!

Método 1:

//VC++ 6.0 compilado y aprobado

#include

void main()

{

char str[]="¡hola mundo, mi nombre es xun yi cao!!"

char*p=str,*p1; int max=0,count=0,i;

mientras(*p)

{

cuenta=0; ( *p==' ')p++;

while(*p!=' '&&*p)

{//Asegúrese de prestar atención al juicio aquí *p !=0 también Tienes que juzgar; de lo contrario, cuando llegue a la última palabra, seguirá agregando al final hasta que encuentre un espacio, por lo que excederá el límite.

p++;

cuenta++;

}

if(máx

{

max=count;

p1=p-count;

}

}

printf("el número más grande es :%d \n",max);

printf("la palabra más grande es : ");

while(*p1!=' '&&*p1) // También es necesario juzgar *p1!='\0' aquí, porque si la palabra más larga está al final de la cadena, si no se juzga *p1!='\0', también cruzará el límite.

{

putchar(*p1);

p1++;

}

putchar('\n; ');

}

/*

Encuentra la palabra más larga en la cadena. Lo que se debe tener en cuenta es: si hay un bucle B dentro de un bucle A. Entonces no solo se debe garantizar en el bucle B que la matriz no esté limitada.

Y debemos asegurarnos de que la matriz en el bucle A no exceda los límites. Como en el ejemplo anterior. A continuación se muestra un ejemplo que es más fácil de entender.

mientras(*p)

{

mientras(*p!=' '&&*p)

{

p++;

}

}

Aunque no existe una conexión necesaria entre el bucle exterior y el bucle interior en términos de condiciones del bucle, por una matriz En lo que respecta a los punteros (si se accede a la matriz en forma de subíndice variable

, la suma y resta del subíndice también debería llamar la atención), su suma y resta también debería llamar la atención. y hay que garantizar que no pueda salirse de los límites.

*/

Método 2:

//VC++ 6.0 compilado y aprobado.

#include

#include

void main()

{

char str[]=" Soy estudiante";

char*p=str,Array[10][20]={0};

int i=0,j=0,max=0

mientras(*p)

{

mientras(*p==' ')*p++; p&&*p!=' ')

{

Array[i][j++]=*p

p++; }

i++;j=0;

}

i=0;

max=strlen(Array[i]);

p=Array[i];

mientras(strlen(Array[i]))

{

if(max< strlen(Matriz[i]))

{

max=strlen(Matriz[i]

p=Matriz[i]); >

}

i++;

}

printf("%d\n%s\n",max,p

}

/*

Para encontrar la palabra más larga en una cadena (las palabras que contienen caracteres no alfabéticos no se pueden distinguir), se juzga en forma de dos -matriz dimensional.

Define una matriz bidimensional, cada elemento del cual se utiliza para almacenar una cadena (cada palabra separada).

Luego juzga el más largo.

En comparación con el primer método, este método tiene una idea más clara. Pero la desventaja es que se debe asignar una matriz bidimensional para almacenar cada palabra

separada, lo que ocupa espacio de almacenamiento.

*/

2. Escribe e implementa cualquier número decimal y conviértelo en un número de base r (r está entre 2 y 16)

Convierte a binario. :

//VC++ 6.0 compilado y aprobado

#include

#include

void main()

{

int a,b[30],i

scanf("%d",&a); != 0;i++)

{

b[i]=a%2

a=a/2; }

for(--i;i>=0;i--)

{

printf("%d",b[i]) ;

}

putchar('\n');

}

//Para la conversión binaria, también puedes usar el operador de desplazamiento de bits. Al aplicar AND bit a bit a un número como 1, se obtiene su

bit binario más bajo. Después del desplazamiento, se obtiene el bit binario más bajo, y así sucesivamente.

Convertir a octal:

/Compilado con VC++ 6.0.

#include

#include

void main()

{

int a,b[20 ],i;

scanf("%d",&a);

for(i=0;a!=0;i++)

{

b[i]=a%8;

a=a/8;

}

para(--i;i >=0;i--)

{

printf("%d",b[i]

}

putchar('\n');

}

/*

La conversión a octal no es tan problemática como a hexadecimal. Además, Defina una matriz de caracteres para almacenar todas las bases en base

, pero simplemente envíelas directamente. Y para hexadecimal, se debe almacenar su base. De 0 a F

*/

Convertir a hexadecimal:

//Compilado bajo VC++ 6.0

#include

#include

void main()

{

int a,b[20],i,base=16

int a,b[20],i,base=16;

p>

char X[16]={'0','1','2','3' ,'4','5','6','7','8','9 ','A','B','C','D','E','F'};

scanf("%d",&a);

for(i=0;a!=0;i++)

{

b[i]=a%base;

a=a/base ;

}

for(--i;i>=0; i--) //Hay un --i al principio

{

int j=b[i]

printf("%c ",X[j]);

}

printf(" \n");

}

/*

Generalmente es más fácil convertir números en otras bases a números decimales. Existe una fórmula de multiplicación lista para usar.

Pero para convertir números decimales en otros números base, es necesario utilizar la división. La idea de esta pregunta es relativamente clara y debería ser un algoritmo típico para resolver este tipo de problemas.

Para convertir números decimales en números binarios, además de la división, también se pueden utilizar operaciones de bits.

La razón principal de este problema es que vale la pena entender estas dos oraciones:

b[i]=a%base

a=a/base; ;

Usamos estas dos oraciones en un bucle para obtener los dígitos de un número entero. Esto también muestra que el método que usamos para obtener los dígitos de un número entero es exactamente El algoritmo para convertir un decimal. número en un número "decimal"

Es decir, obtenemos los dígitos de cada dígito de un número decimal. De hecho, es convertirlo en un número decimal

El proceso. de números (aunque no es necesario convertir aquí, porque ya es un número decimal). El mismo principio se puede utilizar para calcular el proceso de convertir números decimales en otros números base, que es similar a este.

Luego, el resultado obtenido más tarde se genera primero, y el resultado obtenido al tomar el resto primero está al final del número, en el bit bajo.

*/

Solución general:

#include

#include

void main()

p>

{

int a[10]={0,1,2,9,10,5,12,7,8,15}; int i=9;i>=0;i--)

{

if(a[i]>=10)

cambiar(a [ i])

{

caso 10: printf("%c",'A');break

caso 11: printf("% c; ",'B');romper;

caso 12: printf("%c",'C');romper;

caso 13: printf("%c" , 'D');romper;

caso 14: printf("%c",'E');romper

caso 15: printf("%c",' F; ');romper;

}

else

printf("%d",a[i]); /p>

}

/*

De hecho, todos conocemos el algoritmo de conversión de base, que consiste en utilizar el número que queremos convertir, la base del base (si es hexadecimal)

Realizar el resto, guardar el resultado en un array, luego redondearlo hacia arriba y reasignarlo, es decir, descartar el resto,

Equivalente a tomar el cociente del paso anterior, luego toma el resto y luego redondea hacia arriba. Este ciclo continúa hasta llegar a 0.

De hecho, el algoritmo anterior no es difícil de entender siempre que recordemos el método de cálculo para convertir un número decimal en un número binario,

porque todos están conectados.

La clave ahora es que si he hecho todas estas cosas, es decir, los restos se colocan en una matriz, lo que tengo que hacer ahora es generar la matriz en orden inverso. Entonces, si es binario u octal, solo necesitamos generarlo directamente, pero si es hexadecimal, esto no se puede hacer. Es decir, si hay un elemento en la matriz que es 14, entonces no se puede generar como tal. es

En este momento, se debe generar E, porque E es la base en hexadecimal y también corresponde a 14 en decimal. Pero si

es un número binario o octal, se puede generar directamente, porque los números en la matriz son todos 0, 1 (para binario)

o (0... .8), estos números son las bases del binario y del octal.

Entonces, el problema que debemos enfrentar aquí es que, al generar un número entero, si el número entero cumple una determinada condición, ¿qué caracteres se generarán?

Por ejemplo: si este número entero es igual. a 14, se emite el carácter 'E'.

Por supuesto, podemos usar la declaración if...else para juzgar. Para números hexadecimales, solo hay seis caracteres especiales: A, B, C, D, E y F

. No es demasiado engorroso de usar si... más para juzgar. Por supuesto, también podemos usar switch para juzgar, que es más organizado. El código

también es más claro.

Por supuesto, esto es para números hexadecimales, podemos juzgar de esta manera, pero si los problemas encontrados en la vida real son algo similares a este y hay muchas letras. Si es así, sería demasiado engorroso usarlo. juicio condicional o cambio, el código no sería intuitivo y sería propenso a errores.

Luego podemos definir una matriz de caracteres en este momento y colocar los caracteres que queremos generar respectivamente si existe la siguiente relación correspondiente:

10 A

11 B

12 C

13 D

14 E

15 F

16 G

17 H

18 I

19 J

Es decir, los números se colocan en la matriz a y los caracteres se colocan en la matriz b., se requiere que cuando el número en la matriz a sea 10, se genere 'A' en lugar de 10, y así sucesivamente (consulte la relación correspondiente arriba, por supuesto, las relaciones correspondientes). Todos los anteriores son secuenciales. De hecho, es posible que no sean secuenciales y los números y caracteres pueden estar desordenados. Por supuesto, esto depende del problema real encontrado. Si

todavía usamos if...else para juzgar el problema anterior, sería demasiado engorroso. Entonces definimos una matriz de caracteres para almacenar específicamente caracteres

. Entonces, cómo conectar números y caracteres, cómo generar 'A' cuando el valor de a[i] es 10 pero generar 'E' cuando el valor de a[i] es 14

Aquí tenemos la b la matriz se puede definir así:

char b[30]={0};

b[10]='A'; ] ='B';

b[12]='C';

b[13]='D'; ' E';

...

b[19]='J';

Esto significa que cuando el valor del elemento a[i] es 10, cuando es, se genera b [10], y cuando es 11, se genera b [11], esto corresponde al número

. Podemos usarlo así:

int t=a[i];

printf("%c",b[t]); ], solo generamos b[cuánto]

Pero para el ejemplo anterior, puede ser así:

if(a[i]>=10&&a[i]<= 19) // Sólo cuando la correspondencia es continua podemos juzgar de esta manera

{

int t=a[i]; ",b[t ]);

}

else

{

printf("%d",a[i] );//si Los caracteres especiales correspondientes que no pertenecen a la definición se muestran tal como están.

}

Por supuesto, lo anterior es la situación continua correspondiente. La conversión entre decimal y binario, octal y hexadecimal es toda situación continua.

Qué debemos hacer si la situación correspondiente es discontinua:

20 'A'

25 'B'

30 'D '

50 'G'

53 'H'

58 'C'

100 'Z'

200 'W'

Para la situación anterior, no hay ninguna regularidad, y si define una matriz de 200 elementos solo para estos números, es realmente irrazonable

Vale la pena. Entonces, si este es el caso anterior, no hay mejor manera. Simplemente use la declaración de juicio. Por supuesto, si hay más de 20

caracteres correspondientes, la declaración de juicio tampoco es apropiada, por lo que no hay mejor manera. Necesito explorar más...

*/

Estas son las preguntas que encontré al realizar el examen de nivel de computadora. Los algoritmos son bastante típicos y algunos de ellos están en libros. Algo de lo que veo es mi propia expansión. Aún tienes que tomarte en serio contigo mismo. . .

La tercera pregunta no se puede enviar debido a demasiado texto. . Disculpe. . .