Programación en C. Starting C" 12. Ejercicio

variante

christen

  1. ¿Puede un nombre de variable empezar por un número?
  2. ¿Puede un nombre de variable empezar por un símbolo impreso (por ejemplo, #, *, _)?
  3. Pon un ejemplo de nombre de variable en C(prefijo negativo)El trabajo. ¿Por qué no funciona?

tipo de datos

  1. Enumere al menos tres tipos de datos en C
    1. ¿Cuánta memoria necesita cada uno en su ordenador?
    2. ¿Cuál puede utilizarse en lugar del otro? ¿Por qué?
      1. ¿Existen restricciones para estos usos?
      2. En caso afirmativo, ¿cuáles son?
      3. ¿Es necesario hacer algo especial para utilizar la alternativa?
  2. ¿Pueden utilizarse como variables los nombres que utilizamos para los tipos de datos (por ejemplo, "int", "float")?

operar

  1. ¿Cómo asignarías el valor 3,14 a una variable llamada pi?
  2. ¿Es posible especificar el nombre de una organización con unINThastaapellido Shuang?
    1. ¿Es posible al revés?

consulta

  1. Un error común entre los nuevos estudiantes es deshacer la sentencia de asignación. Supongamos que desea asignar el valor almacenado en la variable "pi" a otra variable, como "pi2":
    1. ¿Cuál es la afirmación correcta?
    2. ¿Qué es lo contrario? ¿Es una sentencia C válida (aunque dé un resultado erróneo)?
    3. ¿Y si quieres asignar un valor constante (por ejemplo, 3,1415) a "pi2"?a. ¿Cómo es una declaración correcta?b. ¿Sería la inversa una sentencia C válida o inválida?

E/S sencillas 

operación de cadena

1. Escribe un programa que pida al usuario una cadena e imprima su inverso.

2. Escribe un programa que pida al usuario que introduzca una frase e imprima cada palabra en su línea correspondiente.

ciclo

1. Escriba una función que indique la altura y la anchura de un objetondel triángulo isósceles rectángulo, por lo quen = 3así como

*
**
***

2. Escribe una altura de salidapara 2n-1y una anchura dendel triángulo transversal delfunción (matem.)Por lo tanto, eln = 4La salida para:

*
**
***
****
***
**
*

3. Escriba una altura de salida deny anchurapara 2n-1El lado derecho del triángulo ascendente delfunción (matem.) ; n = 6La salida será:

     *
    ***
   *****
  *******
 *********
***********

flujo del proceso

1. construya un programa en el que el control pase de 4 funciones diferentes a 4 llamadas.

2. Ahora utiliza la llamada a función en el bucle main for while. Pide la entrada al principio del bucle. Si el usuario hace clic en Q, finaliza el bucle while.

3. A continuación, añada condiciones para llamar a la función cuando el usuario introduzca un número, de modo que 1 en la función 1, 2 en la función 2 y así sucesivamente.

4. la función 1 llama a la función a, llama a la función b, llama a la función c

5. Dibuje un diagrama de flujo del programa con flechas para indicar la ubicación de los controles

funcionalidad

1. Escribe una función que compruebe si un entero es negativo; la declaración debería ser como bool es_positivo(int i);

2. Escriba una función que eleve un número en coma flotante a una potencia entera, por ejemplo, cuando se utiliza

Float uno = elevar_a_potencia (2, 3);     // a obtiene 8 
Float b = elevar_a_potencia (9 , 2);     // b tiene 81 
Float elevar_a_potencia (float f, entero potencia);     // Conviértelo en tu manifiesto

matemáticas

1. Escribe una función que calcule si un número es primo. Devuelve 1 si es un número primo y 0 si no lo es.

2. Escribe una función para determinar el número de primos menores que n.

3. escribe una función para hallar raíces cuadradas utilizando el método de Newton.

4. escribir funciones para evaluar funciones trigonométricas.

5. Intenta escribir un generador de números aleatorios.

6. Escribe una función para determinar los números primos entre 2 y 100.

recursivo (cálculo)

fusionar clasificación

1.Escribe un programa en C para generar un array de enteros aleatorios de longitud n dada y ordenarlo recursivamente utilizando el algoritmo de ordenación Merge.

  • El algoritmo de ordenación merge es recursivo.

- Ordenar una matriz de elementos es fácil.

- La ordenación de dos matrices de un solo elemento requiere una operación de fusión. La operación de fusión considera las dos matrices ordenadas como listas y compara las cabezas de las listas y la cabeza que sea más pequeña, este elemento se coloca en la lista ordenada y la cabeza de esa lista se marca para que el siguiente elemento sea la cabeza de esa lista. Esto se hace hasta que una de las listas se agota y entonces la otra lista se copia al final de la lista ordenada.

- La recursión se produce porque la fusión de dos matrices de un elemento produce una matriz ordenada de dos elementos que se puede fusionar con otra matriz ordenada de dos elementos generada de la misma manera. Esto produce una matriz de 4 elementos que ha sido ordenada, y lo mismo se aplica a otra matriz ordenada de 4 elementos.

- La ordenación por fusión básica consiste en comprobar el tamaño de la lista que se va a ordenar y, si es mayor que 1, dividir el array en dos partes y volver a llamar a la ordenación por fusión en ambas mitades. Después, fusionar ambas mitades en un espacio temporal del mismo tamaño y copiar el array ordenado final al array original.

montón binario

2. montón binario  ::

  • Un max-heap o min-heap binario es una estructura ordenada en la que se garantiza que algunos nodos son mayores que otros, por ejemplo, el padre de dos nodos. Un montón binario puede almacenarse en una matriz en la que los valores

- posición dadai(padres).i * 2Es el niño de la izquierda.i * 2 + 1Es el chico adecuado.

- (Los arrays en C empiezan en la posición 0, pero 0 * 2 = 0 y 0 * 2 + 1 = 1, lo cual es incorrecto, así que empieza el montón en la posición 1, o suma 1 para cálculos padre-hijo y resta 1 para cálculos hijo-padre).

  • Pruebe un modelo de lápiz y papel utilizando 10 números aleatorios sin ordenar e insértelos en una matriz "heapsort" de 10 elementos.
  • Para insertar en el montón, el Por último, añadaresponder cantandoPadre de intercambio ((si es superior) hasta que el padre sea superior.
  • Para eliminar la parte superior de la pila, mueva el botón de extremo a extremofusionar Aplazamiento de subprogramas superiorestal vezcribadohasta que ningún niño sea mayor.
  • Prueba los números 10,4,6,3,5,11 en un papel con un bolígrafo.
  • Las respuestas son 11,5,10,3,4,6.
  • Ejercicio: Ahora intenta eliminar el elemento superior de cada uno de 11,5,10,3,4,6, utilizando end-to-top y shift-down (o swap-higher-child) para obtener el número

En orden descendente.

  • Las colas de prioridad permiten insertar elementos con prioridad y extraerlos en función de esa prioridad. (Esto puede ser útil si los elementos tienen una estructura emparejada, en la que una parte es la clave y la otra los datos. De lo contrario, es sólo un mecanismo de ordenación).
  • Ejercicio: implemente una ordenación de montón o cola prioritaria utilizando las técnicas anteriores de insertar-atrás / retar-padre y eliminar-adelante / último-adelante / aplazar-hijo-mayor.

Algoritmo de Dijsktra

El algoritmo de Dijsktra es un algoritmo de búsqueda que utiliza una cola de prioridad. Primero inserta el nodo de inicio con prioridad 0. Inserta todos los demás nodos con un valor de prioridad N grande. Cada nodo tiene una lista de vecinos de otros nodos, la distancia actual al nodo de inicio y el puntero anterior al nodo anterior para calcular el nodo actual. La alternativa a la lista de adyacencia es la matriz de adyacencia, que requiere nxn adyacencias booleanas.

Básicamente, el algoritmo recorre la cola de prioridad, elimina los nodos predecesores, comprueba los nodos vecinos y los actualiza con una distancia igual a la suma de las distancias de los nodos predecesores de cada nodo vecino, así como las distancias dadas por la información de vecindad de los nodos vecinos. .

Utilizar operaciones adicionales en cada nodo después de actualizarlo"Actualizar prioridades"::

(coll.) suspender (a un estudiante)Cuando la distancia de un nodo es menor que la de su padre (para esta cola de prioridad, la distancia del padre es menor que la del hijo), el nodo se intercambia con el padre.

Después de esto.(coll.) suspender (a un estudiante)Un nodo cuya distancia es mayor que la de uno o más de sus hijos se intercambia con su nodo hijo más lejano, de modo que el nodo hijo más lejano se convierte en el padre de su hermano más lejano y el nodo padre se convierte en el nodo actual más lejano.

Al actualizar la prioridad, los nodos vecinos al nodo actual tienen un puntero hacia atrás que cambia al nodo actual.

El algoritmo finaliza cuando el nodo de destino se convierte en el nodo actual a eliminar y el camino hasta el nodo de partida puede registrarse en una matriz siguiendo el puntero hacia atrás y realizando a continuación una operación similar a la partición de ordenación rápida para invertir el orden de la matriz, el camino más corto desde el nodo de partida hasta el nodo de destino.

clasificación rápida

3.Escribe un programa en C para realizar una ordenación recursiva utilizando el algoritmo Quick Sort Partition Swap.

  • Puede utilizar el "conductor" o los datos de prueba de números aleatorios en Q1. En "mergesort". Esto es "reutilización", que generalmente se fomenta.

- La ventaja de la reutilización es que reduce el tiempo de escritura, depuración y prueba.

  • El concepto de intercambio de particiones es que los elementos de la partición se seleccionan (aleatoriamente) y todo lo que hay que ordenar se coloca en 3 equivalentes

clases: los elementos menores que el valor de partición, el elemento de partición y todo lo que esté por encima (y sea igual) al elemento de partición.

  • Esto puede hacerse sin asignar más espacio que el de un elemento temporal para intercambiar dos elementos. Por ejemplo, un entero temporal para datos enteros.
  • Sin embargo, se desconoce la ubicación en la que los elementos particionados deben utilizar el espacio original de la matriz.
  • Esto se suele hacer colocando la partición al final del array a ordenar, y luego colocando dos punteros (uno al principio del array, el

y otro en el elemento contiguo al elemento de partición, y repite la exploración del puntero izquierdo hacia la izquierda y del puntero derecho hacia la izquierda.

  • La exploración izquierda se detiene cuando se encuentra un elemento igual o mayor que la partición, y la exploración derecha se detiene para elementos menores que el valor de la partición, el

Estos se intercambian y utiliza espacio extra temporal.

  • Si el escaneo a la izquierda alcanza un elemento particionado, siempre se detendrá y el elemento particionado será el último elemento; esto significa que todo el array es menor que el valor particionado.
  • Si todo el array es mayor que la partición, el escaneo derecho puede alcanzar el primer elemento, que debe ser comprobado o el escaneo no se detendrá.
  • Cuando los punteros izquierdo y derecho se cruzan, el anillo exterior sale. Prueba de cruce de punteros y salida del anillo exterior

debe ocurrir antes del intercambio, de lo contrario el puntero derecho puede estar intercambiando elementos más pequeños que la partición previamente escaneada por el puntero izquierdo.

  • Por último, una vez que los punteros se cruzan, es necesario colocar los elementos de partición entre las particiones izquierda y derecha.
  • En un cruce de punteros, el puntero izquierdo puede detenerse en la última posición del elemento de partición en la matriz, y el puntero derecho no pasa por el puntero

justo antes del último elemento. Esto ocurre cuando todos los elementos son más pequeños que la partición.

- Si se selecciona el puntero derecho para intercambiarlo con la partición, se genera un estado de error en el que el último elemento de la matriz izquierda pasa a ser menor que el valor del elemento de la partición.

- Si elige intercambiar el puntero izquierdo con la partición, la matriz izquierda será más pequeña que la partición y la partición se intercambiará con un elemento cuyo valor sea mayor que la partición o la partición misma.

  • Debe comprobar la asignación rápida de 2 elementosfalta de ordenLa esquina del array.

- El puntero izquierdo se detiene en el primertrastornoelemento. El puntero derecho del primerfalta de ordencomienza, pero el bucle externo sale porque éste es el elemento situado más a la izquierda. A continuación, el elemento de partición se intercambia utilizando el primer elemento del puntero izquierdo, y los dos elementos son ahorasecuencia.

- con respecto apedirCon 2 elementos en el array, el puntero izquierdo se salta el primer elemento menor que la partición y se detiene en la partición. El puntero derecho empieza en el primer elemento y sale porque es la primera posición. Los punteros se han cruzado, por lo que sale el anillo exterior. Las particiones se intercambian consigo mismas, por lo que permanecen en orden.

  • Después de realizar el intercambio, el puntero izquierdo debería incrementarse y el puntero derecho decrementarse, para que no se vuelvan a escanear las mismas posiciones, ya que esto podría llevar a un bucle infinito (posiblemente con el puntero izquierdo saliendo cuando un elemento es igual o mayor que la partición, y el elemento de la derecha siendo igual al valor de la partición). Una implementación, Sedgewick, resta uno del puntero izquierdo y del puntero derecho para iniciar el puntero

Añade una posición de exploración inicial predeterminada y utiliza operadores de preincremento y predecremento, por ejemplo (++ i, - i).

Supongo que quieres leer:Programación en C. Intermediate C" 1. Tipos de datos avanzados

EL FIN
compartir (alegrías, ventajas, privilegios, etc.) con los demás