Colección de citas famosas - Consulta de diccionarios - Los temas para las preguntas de lenguaje C de primer año son los siguientes

Los temas para las preguntas de lenguaje C de primer año son los siguientes

¿Por qué algunos de los mismos programas son eficientes y otros no?

Los algoritmos son el alma de los programas.

¿Cómo es el tercer piso? Si hay 1000 cadenas, ¿es necesario copiar la clasificación muchas veces? Además, las cadenas pueden tener una longitud inconsistente. ¿Es razonable copiar cadenas de diferentes longitudes? Aunque se estipula que cada cadena no puede exceder los 50 bytes, esto no es algorítmicamente razonable. Si hay 10.000 caracteres, hay 100.000 caracteres, entonces, ¿dónde podemos encontrar la eficiencia con esta forma de copiar?

¿Qué hacemos? No necesitamos intercambiar el contenido de la cadena en absoluto, solo necesitamos intercambiar la dirección que apunta a la cadena. Debido a que la dirección de una cadena es un número hexadecimal de 16, intercambiar solo un valor es mucho más eficiente que copiar la cadena completa. Por ejemplo, los punteros p1 y p2 apuntan a las cadenas cadena1 y cadena2 respectivamente. Si String1 es mayor que String2, entonces se intercambian los valores de P1 y P2, y luego solo se debe generar el contenido de las cadenas intercambiadas apuntadas por P1 y P2, que es el resultado ordenado.

El libro de Tan Haoqiang habla sobre este tema, por lo que debemos leerlo detenidamente y comprenderlo.

El programa es el siguiente, que se ha ejecutado bajo dev-c y vs2005.

# incluir ltstdio.h gt

# incluir ltstdlib.h gt

# incluir ltstring.h gt

Void sort(char ** p, int n)/* clasificación de burbujas, si desea ordenar más rápido, también puede usar clasificación rápida qsort */

{

char * temp

int i, j;

for(I = 0; i ltn-1; I ) /*Tenga en cuenta que esto es n-1, no n */

for (j = 0; j ltn-I-1; j )

if(strcmp(p[j], p[j 1]) gt; 0) /*Dado que P es un puntero secundario, aquí p[j ] sigue siendo un puntero*/

{

temp = p[j];/*El intercambio es el valor de la dirección apuntada por el puntero, que es el hexadecimal valor de 16, no intercambiar el contenido de la cadena*/

p[j]= p[j 1];

p[j 1]= temp;

}

}

int main()

{

int n, I;

char * * p;

printf("Ingrese el número n:");

Cuando (1) /*Se detecta el formato de entrada y se ingresa el número n, el El error de formato de entrada solicita volver a ingresar*/

{

if(scanf("d ", ampn)==1)

Break;

fflush(stdin);

}

fflush(stdin);/*Borra el búfer del teclado y prepárate para get() para leer la siguiente cadena, porque get () también leerá caracteres del búfer* /

p =(char * *)malloc(n * sizeof(char *)); puntero y asignarle espacio.

Su miembro es el puntero principal*/

printf("Ingrese d cadenas: \n ", n

for(I = 0; iltn; i)< /p); >

{

p[I]=(char *)malloc(256 * sizeof(char));/*Asigne la cadena apuntada por el puntero primario apuntado por cada espacio de memoria del puntero secundario . Aquí, la longitud de cada cadena se establece en no más de 256-1 bytes, que se pueden cambiar*/

gets(p[I]); */

}

sort(p, n); /*Clasificación de burbujas, pasando un puntero secundario, por lo que la función no necesita devolver un valor*/

printf("El orden de clasificación es:\n ");

for(I = 0;iltn;i)

printf("s\n ",p [ I]);

for(I = 0; Iltn; I) /*Liberar el espacio de memoria al que apunta cada puntero de primer nivel*/

Libre (p[I] );

Free (p); /*Libera el espacio de memoria señalado por el puntero secundario*/

p = NULL/*Devuelve el puntero a cero, esta oración puede ser eliminado aquí*/

System("pause"); /*Presione cualquier tecla para salir*/

Devuelve 0;

}