El clásico del método de operación básico del lenguaje C incorporado.

     Una vez que apareció el lenguaje C, se popularizó y promovió rápidamente en todo el mundo debido a sus ricas funciones, gran capacidad expresiva, flexibilidad y conveniencia, y amplia gama de aplicaciones.

      El lenguaje C no solo tiene una alta eficiencia de ejecución sino que también tiene buena portabilidad y puede usarse para desarrollar software de aplicaciones, controladores, sistemas operativos, etc.

      El lenguaje C es también el lenguaje original de muchos otros lenguajes de alto nivel, por lo que aprender el lenguaje C es un curso obligatorio para ingresar al mundo de la programación.

      Hola Mundo

#include<stdio.h> 
int main()
{
    /*在双引号中间输入Hello World*/ 
    printf("Hello World");
    return 0; 
}

Nota: En el último estándar C, el tipo antes de la función principal intno esvoid

Estructura concreta del lenguaje C.

En términos simples, un programa en C se compone de varias 头文件sumas 函数.

imagen

#include <stdio.h>Es un comando de preprocesamiento, su función es informar al sistema de compilación del lenguaje C que se debe realizar algún trabajo de preprocesamiento antes de que el programa C se compile oficialmente.

  • 函数Es una pequeña unidad que implementa la lógica del código .

función principal esencial

Un programa en C tiene una y sólo una función principal, mainla función.

imagen

El programa C consiste en ejecutar el código en la función principal, también se puede decir que la función principal es la única entrada en el lenguaje C.

  • El int antes de main es el tipo de función principal.

  • printf()Es una función de salida de formato , recuerde que su función aquí es mostrar la información especificada en la pantalla.

  • return es el valor de retorno de la función, dependiendo del tipo de función, el valor de retorno también es diferente.

  • \nes una nueva línea dentro del carácter de escape. (Nota: El programa C debe ejecutarse desde la función principal)

normas de buenos hábitos

  1. Una descripción o una declaración ocupa una línea , por ejemplo: incluye un archivo de encabezado y una declaración ejecutable necesita un salto de línea al final .

  2. Las declaraciones en el cuerpo de la función deben tener una sangría clara ; normalmente se hace una sangría presionando la tecla Tab una vez .

  3. Los paréntesis deben escribirse por pares , y si es necesario eliminarlos, también se deben eliminar por pares .

  4. Se requiere un punto y coma al final de una declaración ejecutable .

  5. Todos los símbolos del código son símbolos ingleses de medio ancho .

imagen

Explicación del programa - Notas

Los comentarios están escritos para programadores, no para computadoras.

Hay dos formas de comentar en lenguaje C:

Comentarios de varias líneas: /* 注释内容 */

Comentario de una sola línea: //注释一行

Nombrado C (identificador)

El lenguaje C estipula que un identificador puede ser una cadena de letras (A~Z,a~z), números (0~9)y guiones bajos _, y el primer carácter debe ser una letra o un guión bajo . Tenga en cuenta los siguientes puntos al utilizar identificadores:

Es mejor que la longitud del identificador no exceda los 8 bits, porque en algunas versiones de C, los primeros 8 bits del identificador son válidos, y cuando los primeros 8 bits de dos identificadores son iguales, se consideran iguales. identificador.

  1. Los identificadores distinguen estrictamente entre mayúsculas y minúsculas. Por ejemplo Imoocy imooc son dos identificadores diferentes.

  2. Es mejor elegir palabras significativas en inglés para que el identificador "vea el nombre y conozca el significado" en lugar de usar chino.

  3. Los identificadores no pueden ser palabras clave en lenguaje C. Quiere obtener más información sobre las palabras clave del lenguaje C.

Variables y asignaciones

Una variable es una variable que se puede cambiar y cada variable tendrá un nombre (identificador). Una variable ocupa una determinada unidad de almacenamiento en la memoria. Las variables deben definirse antes de su uso . Los nombres de las variables y los valores de las variables son dos conceptos diferentes.

imagen

La forma general de definición de variable es: nombre de variable de tipo de datos;

Múltiples variables del mismo tipo: nombre de variable de tipo de datos, nombre de variable, nombre de variable...;

imagen

Nota: La asignación continua no está permitida en la definición, int a=b=c=5;por lo es ilegal.

Hay dos formas de asignar valores a las variables:

  1. declarar antes de asignar

  2. Cesión simultánea de declaración

tipo de datos básicos

En lenguaje C, los tipos de datos se pueden dividir en:

  1. tipo de datos básicos

  2. construir tipo de datos

  3. tipo de puntero

  4. Cuatro categorías de tipos vacíos.

imagen

Los tipos enteros, reales y de caracteres más utilizados (char, int, float, double):

imagen

Los datos enteros se refieren a números sin decimales (int, short int, long int, unsigned int, unsigned short int, unsigned long int):

imagen

Nota:

  • int short int long intDependiendo del entorno de compilación, los rangos tomados son diferentes.

  • Donde short inty long intes al menos el rango escrito en la tabla, pero inten la tabla está el rango de valores escrito en el entorno de compilación de 16 bits.

  • Además, el rango de valores del lenguaje C intdepende del número de bytes que ocupa y diferentes compiladores tienen diferentes regulaciones.

  • La definición del estándar ANSI intocupa 2 bytes y el TC se basa en el estándar ANSI, que intocupa 2 bytes. Pero en VC, uno intocupa 4 bytes.

Los datos de coma flotante se refieren a números con decimales.

Hay mucha información en la vida que es adecuada para ser representada mediante datos de punto flotante, como: peso humano (unidad: kilogramo), precios de productos básicos, pi, etc.

Debido a la diferencia de precisión, se divide en tres tipos (flotante, doble, doble largo):

imagen

Nota: No existe una variable de cadena en el lenguaje C y la cadena solo puede existir en una matriz de caracteres, lo cual se discutirá más adelante.

declaración de salida formateada

La declaración de salida formateada, también llamada salida de marcador de posición , muestra varios tipos de datos de la computadora según el tipo formateado y la posición especificada .

Su formato es: printf("输出格式符",输出项);

imagen

Cuando la declaración de salida contiene caracteres comunes, se pueden utilizar los siguientes formatos:

printf("普通字符输出格式符", 输出项);

imagen

Nota: El número de símbolos de formato debe corresponder al número de variables, constantes o expresiones uno a uno.

constante inmutable

Una cantidad cuyo valor no cambia durante la ejecución del programa se llama constante .

mtianyan: Las constantes en lenguaje C se pueden dividir en constantes directas y constantes simbólicas.

  • Las constantes directas también se denominan cantidades literales , que pueden usarse directamente sin explicación, como por ejemplo:

    • Constantes enteras: 13, 0, -13;

    • Constantes reales: 13,33, -24,4;

    • Constantes de caracteres: 'a', 'M'

    • Constante de cadena: "¡Me encanta imooc!"

imagen

En lenguaje C, se puede utilizar un identificador para representar una constante, lo que se denomina constante simbólica. Las constantes simbólicas deben definirse antes de poder usarse y su forma general es:

 
 

#define 标识符 常量值

#include <stdio.h>
#define POCKETMONEY 10    //定义常量及常量值
int main()
{
    // POCKETMONEY = 12;  //小明私自增加零花钱对吗?
    printf("小明今天又得到%d元零花钱\n", POCKETMONEY);
    return 0;  
}

Las constantes simbólicas no se pueden cambiar.

conversión automática de tipos

Hay casos de conversión automática de tipos de datos:
la conversión automática ocurre cuando se operan diferentes tipos de datos y se completa automáticamente en el momento de la compilación .

imagen

charLa conversión de datos escritos a intdatos escritos sigue ASCIIel valor correspondiente en el código.

Nota:

Los bytes pequeños se pueden convertir automáticamente en bytes grandes, pero los bytes grandes no se pueden convertir automáticamente en bytes pequeños

char se puede convertir a int, int se puede convertir a double y char se puede convertir a double. Pero no se puede revertir.

elenco

La coerción se logra definiendo operaciones de conversión de tipos . Su forma general es:

 
 

(tipo de datos) (expresión)

Su función es convertir el resultado de la operación de la expresión en el tipo indicado por el especificador de tipo.

Preste atención a las siguientes cuestiones al utilizar la coerción:

  1. Tanto el tipo de datos como la expresión deben estar entre paréntesis, si se (int)(x/2+y)escribe (int)x/2+ycomo, se transformará en una formax , luego se dividirá y luego se agregará.int2y

  2. Después de la conversión, el tipo y el valor de la variable de los datos originales no se cambiarán, solo la conversión temporal en esta operación .

  3. El resultado de la operación después de la conversión forzada no sigue el principio de redondeo.

calculando signos

Operadores en lenguaje C:

※ 算术运算符
※ 赋值运算符
※ 关系运算符
※ 逻辑运算符
※ 三目运算符

operador aritmético

Operadores básicos del lenguaje C :

imagen

Preste atención a la operación de división :

Si los dos números a dividir son enteros, el resultado también será un número entero y se omitirá la parte decimal , como por ejemplo 8/3 = 2;

Si uno de los dos números es decimal, el resultado es decimal, como por ejemplo: 9.0/2 = 4.500000.

mtianyan:  Preste atención a la operación restante :

Esta operación solo es adecuada para la operación restante con dos números enteros10%3 = 1 , como por ejemplo :;

mtianyan: notas: Y 10.0%3 es incorrecto; el signo después de la operación depende del signo del módulo , como (-10)%3 = -1;por ejemplo10%(-3) = 1;

mtianyan:  %%indica que se trata de un %símbolo.

Nota: No existe un operador de exponenciación en lenguaje C y no se pueden utilizar ×, ÷símbolos aritméticos iguales .

Operadores de incremento y decremento

  • El operador de autoincremento es ++, su función es hacer que el valor de la variable se autoincremente en 1

  • El operador de autodecremento es --, cuya función es disminuir el valor de una variable en 1.

A menudo se utilizan en bucles. Los operadores de incremento y decremento tienen las siguientes formas:

imagen

operador de asignación

Los operadores de asignación en lenguaje C se dividen en operadores de asignación simples y operadores de asignación compuestos.

=Símbolos de operadores de asignación simples , hablemos de operadores de asignación compuestos:

Los operadores de asignación compuestos se =forman agregando otros operadores antes de un operador de asignación simple.

Por ejemplo+=、-=、*=、/=、%=

Análisis: Defina una variable entera a y asígnele un valor de 3. a += 5;Esta fórmula equivale a a = a+5; sumar la variable a y 5 y luego asignarla a a

Nota: No hay espacio entre el operador y el signo igual en los operadores compuestos .

operador relacional

Operadores relacionales en lenguaje C :

imagen

El valor de la expresión relacional es la suma , que está representada por la suma de números enteros en el programa C.10

Nota: No puede haber espacios>=, <=, ==, != entre dichos símbolos .

Operadores logicos

Operadores lógicos en lenguaje C:

imagen

También hay dos tipos de valores de operación lógica y están representados por números enteros 1 y 0 en lenguaje C. Sus reglas de evaluación son las siguientes:

  • Y operación &&

El resultado es verdadero cuando ambas variables involucradas en la operación son verdaderas, en caso contrario es falso. Por ejemplo: 5>=5 && 7>5, el resultado de la operación es verdadero;

  • O operación ||

Mientras una de las dos variables involucradas en la operación sea verdadera, el resultado es verdadero. Cuando ambas cantidades son falsas, el resultado es falso. Por ejemplo: 5>=5||5>8, el resultado de la operación es verdadero;

  • no operación!

Cuando la variable involucrada en la operación es verdadera, el resultado es falso; cuando la variable involucrada en la operación es falsa, el resultado es verdadero. Por ejemplo:! (5>8), el resultado de la operación es verdadero.

operador ternario

El operador ternario en lenguaje C:, ?:su formato es:

表达式1 ? 表达式2 : 表达式3;

El proceso de ejecución es:

Primero juzgue si el valor de la expresión 1 es verdadero, si es verdadero, ejecute la expresión 2; si es falso, ejecute la expresión 3.

 
 
#include <stdio.h>
int main()
{
    //定义小编兜里的钱
    double money =12.0      ; 
    //定义打车回家的费用
    double cost =11.5       ;  
    printf("小编能不能打车回家呢:"); 
    //输出y小编就打车回家了,输出n小编就不能打车回家
    printf("%c\n",money>=cost?'y':'n'                        );
    return 0;
}

Comparación de prioridades de la competencia de operadores

El orden de varios símbolos de operación:

imagen

Una prioridad de 1 tiene la prioridad más alta y una prioridad de 10 tiene la prioridad más baja.

Declaración if simple de estructura de rama

if条件Una declaración en una declaración de estructura de rama en lenguaje C.

La estructura básica de una declaración if simple es la siguiente:

if(表达式)
{
  执行代码块;
}

Su semántica es: si el valor de la expresión es verdadero, ejecute la siguiente declaración, en caso contrario, no ejecute la declaración.

Nota: if()No hay punto y coma detrás, solo escriba directamente{}

Declaración simple if-else de la estructura de la rama

La estructura básica de una declaración simple if-else:

imagen

La semántica es: si la expresión se evalúa como verdadera, se ejecuta el bloque de código 1; de lo contrario, se ejecuta el bloque de código 2.

Aviso:

if()No hay punto y coma después, solo escribe {}, no hay punto y coma después, solo escribe {}

Múltiples declaraciones if-else en estructura de rama

if-elseLa estructura de múltiples declaraciones en lenguaje C es la siguiente:

imagen

La semántica es: juzgar el valor de la expresión a su vez, cuando un determinado valor es verdadero, ejecutar el bloque de código correspondiente; de ​​lo contrario, ejecutar el bloque de código n.

Nota: Cuando una determinada condición es verdadera, otras declaraciones de la estructura de rama no se ejecutarán hacia abajo.

Declaración anidada if-else de la estructura de la rama

if-elseDeclaraciones anidadas en lenguaje C. El significado de una declaración anidada if-elsees if-elseescribir la declaración en la declaración if-else. Su forma general es:

imagen

El bucle while de la estructura del bucle.

La gente del curandero llama ciclo a la realización de una determinada acción repetidamente  .

Hay tres estructuras de bucle en lenguaje C. Primero mire la estructura del bucle while en lenguaje C.

imagen

La expresión representa la condición del bucle y el bloque de código de ejecución es el cuerpo del bucle .

La semántica de la declaración while es: calcular el valor de la expresión y 真(非0)ejecutar el bloque de código del cuerpo del bucle cuando el valor sea igual.

  1. La expresión en la declaración while es generalmente una expresión relacional o una expresión lógica. Cuando el valor de la expresión es falso, el cuerpo del bucle no se ejecuta; de lo contrario, el cuerpo del bucle siempre se ejecuta.

  2. Asegúrese de recordar cambiar el valor de la variable del bucle en el cuerpo del bucle; de ​​lo contrario, habrá un bucle infinito (ejecución sin fin).

  3. Si el cuerpo del bucle contiene más de una declaración, debe estar entre {}corchetes para formar una declaración compuesta.

Bucle do- while de estructura de bucle

La forma general de un bucle en lenguaje C do-whilees la siguiente:

imagen

La semántica de la declaración del bucle do- while es:

Primero ejecuta el bloque de código de ejecución en el bucle y luego juzga si la expresión while es verdadera; si es verdadera, continúa el bucle; si es falsa, finaliza el bucle. Por lo tanto, el bucle do- while debe ejecutar la instrucción del bucle al menos una vez .

Nota: mtianyan: do-whilecuando se utiliza una declaración estructural, debe haber un punto y coma después de los corchetes while.

Para bucle de estructura de bucle (1)

La forma general de bucle for en lenguaje C :

imagen

Su proceso de ejecución es el siguiente:

  1. Ejecute la expresión 1 para inicializar la variable del bucle;

  2. Expresión de juicio 2, si su valor es verdadero (no 0) , luego ejecute el bloque de código en el cuerpo del bucle for y luego ejecútelo hacia abajo; si su valor es falso (0) , finalice el bucle;

  3. Ejecute las expresiones 3, (i++) y otras declaraciones que operen sobre variables de bucle;

  4. Ejecute el segundo paso después de ejecutar el bloque de código en el bucle for; la inicialización del primer paso solo se ejecutará una vez.

  5. El ciclo finaliza y el programa continúa ejecutándose hacia abajo.

Nota: Los dos puntos y comas en el bucle for deben escribirse

Para bucle de estructura de bucle (2)

En el bucle for:

  • La expresión 1 es una o más declaraciones de asignación , que se utilizan para controlar el valor inicial de la variable ;

  • La expresión 2 es una expresión relacional que determina cuándo salir del ciclo;

  • La expresión 3 es el valor del paso de la variable del bucle , que define cómo cambia la variable del bucle después de cada bucle.

  • Estas tres partes están separadas por punto y coma  ; .

Al utilizar la declaración for, debes prestar atención a :

  1. Es posible que la "expresión 1, 2, 3" en el bucle for no esté vacía, pero los dos puntos y coma (;;)no se pueden establecer de forma predeterminada.

  2. Omitir la "expresión 1 (asignar valor inicial a la variable de bucle)" significa no asignar el valor inicial a la variable de bucle.

  3. Omita la "expresión 2 (condición de bucle)", no realice ningún otro procesamiento y el bucle siempre se ejecutará ( bucle infinito ).

  4. Omita la "expresión 3 ( aumento y disminución de la variable del bucle )", no realice ningún otro procesamiento y el bucle siempre se ejecutará (bucle infinito).

  5. La expresión 1 puede ser una expresión de asignación para establecer el valor inicial de la variable de bucle u otras expresiones .

  6. La expresión 1 y la expresión 3 pueden ser una expresión simple o múltiples expresiones separadas por comas.

imagen

  1. La expresión 2 es generalmente una expresión relacional o una expresión lógica , pero también puede ser una expresión numérica o una expresión de caracteres. Siempre que su valor sea distinto de cero , se ejecuta el cuerpo del bucle.

  2. Las variables en cada expresión deben definirse antes del bucle for .

Cómo sacar las centenas, decenas y unidades de un número.

  • Cienas: num/100 se pueden obtener, al  int ser de tipo entero se omitirá la parte decimal. Por ejemplo,  765/100 el resultado es7

  • Dígito de las decenas: num%100/10 . como 765%100llegar primero 65, 65/10obtener6

  • Un solo dígito: num%10. 765%10conseguir5

Comparación de tres tipos de estructuras de bucle

Los tres bucles while, do- while y for son diferentes en ocasiones de uso específicas, como se muestra a continuación:

Es más adecuado utilizar un bucle for cuando se conoce el número de bucles ;

  1. Un bucle while o do- while es adecuado cuando se desconoce el número de bucles:

    • Si es posible no realizar un bucle una vez, considere utilizar un bucle while.

    • Si realiza un bucle al menos una vez, debería considerar utilizar un bucle do- while.

Pero, en esencia, los bucles while, do- while y for son intercambiables.

Múltiples bucles en estructura de bucle.

Los bucles múltiples son estructuras de bucle que aparecen en el cuerpo del bucle de la estructura del bucle.

En el desarrollo real, generalmente se utilizan hasta tres ciclos pesados .

Debido a que cuantas más capas de bucle, mayor será el tiempo de ejecución y más complicado será el programa, generalmente 2-3 capas de múltiples bucles son suficientes. Además, también se pueden anidar diferentes bucles.

Durante la ejecución de múltiples bucles, el bucle externo es y el bucle interno es el bucle secundario .

Una vez en el bucle principal, el bucle secundario debe ejecutarse por completo hasta que salga del bucle. El bucle principal ingresa la próxima vez y el bucle secundario continúa ejecutándose ...

imagen

mtianyan: imprimir pila triangular de estrellas

 
 
#include <stdio.h>
int main()
{
    int i, j, k;
    for(i=1; i<5; i++)
    {
        /* 观察每行的空格数量,补全循环条件 */
        for(j=i; j<5; j++)  
        {
            printf(" ");    //输出空格
        }
        /* 观察每行*号的数量,补全循环条件 */
        for( k=0;k<2*i-1;k++) 
        {
            printf("*");   //每行输出的*号
        }
        printf("\n");     //每次循环换行
    }
    return 0;
}

Imprima la tabla de multiplicar de 9 × 9 usando el bucle for

#include <stdio.h>
int main() 
{ 
    // 定义相乘数字i,j以及结果result
    int i, j, result;
     for(i=9;i>=1;i--)
     {
        for(j=1;j<=i;j++)
        {
            printf("%d*%d=%d ",i,j,result=i*j);
        }
        printf("\n");
     }
    return 0;
}

La declaración de interrupción de la declaración final.

Luego cuando el ciclo sea de 5 veces, es necesario parar y no continuar el entrenamiento. En lenguaje C, puedes usar breakuna declaración para hacer esto.

Tenga en cuenta los siguientes puntos al utilizar breakdeclaraciones:

break no se puede utilizar en una sola declaración if-else sin una construcción de bucle.

  1. En bucles de varios niveles, una declaración de interrupción solo sale del bucle actual.

La declaración continua de la declaración final.

Luego, cuando el ciclo sea 5 veces, es necesario continuar entrenando después de la interrupción. En C, continueesto se puede hacer usando la declaración

La función de la declaración de continuación es finalizar este ciclo e iniciar el siguiente.

La diferencia entre una declaración de interrupción y una declaración de continuación es:

break es saltar del ciclo completo actual y continuar es finalizar este ciclo y comenzar el siguiente.

declaración de cambio de estructura de rama

La estructura de la declaración de cambio es la siguiente:

imagen

mtianyan:  También debes prestar atención aswitch los siguientes puntos al hacer declaraciones :

  1. Los valores de cada expresión constante después del caso no pueden ser los mismos; de lo contrario, se producirá un error.

  2. Si no hay interrupción , después de la cláusula case, se ejecutará hasta que se encuentre una interrupción, y luego saltará la instrucción switch.

  3. La declaración de expresión detrás del interruptor sólo puede ser de tipo entero o carácter .

  4. Después del caso, se permiten varias declaraciones sin corchetes {}.

  5. La secuencia de cada caso y cláusula predeterminada se puede cambiar sin afectar el resultado de la ejecución del programa.

  6. defaultSe pueden omitir cláusulas.

mtianyan: Aplicación de cambio y declaración if (el cálculo es el día del año)

 
 
#include <stdio.h>

int main() 

{ 

    /* 定义需要计算的日期 */

    int date = 0;

    int year = 2008;

    int month = 8;

    int day = 8;

    switch(month)

    {

        case 12:date+=30;

        case 11:date+=31;

        case 10:date+=30;

        case 9:date+=31;

        case 8:date+=31;

        case 7:date+=30;

        case 6:date+=31;

        case 5:date+=30;

        case 4:date+=31;

        case 3:

        if((year%4==0&&year%100!=0)||year%400==0)

        {

            date+=29;

        }

        else

        {

            date+=28;

        }
        case 2:

        date+=31;

        case 1:

        date+=day;

        printf("%d年%d月%d日是该年的第%d天",year,month,day,date);

        break;

        default:

        printf("error");

        break;

    }

    return 0;

}

Correcto: continuar solo se puede usar dentro de un cuerpo de bucle

La famosa declaración goto

También existe una declaración de este tipo en lenguaje C, que es gotouna declaración, y la declaración goto es una declaración de rama incondicional .

El formato de uso de la declaración goto es:

goto 语句标号;

imagen

función creada por uno mismo

El lenguaje C proporciona una gran cantidad de funciones de biblioteca: como stdio.hproporcionar funciones de salida

La forma general de una función personalizada:

imagen

Aviso:

  1. [] El contenido incluido se puede omitir, se omite la descripción del tipo de datos y el valor predeterminado es  int una función de tipo; el parámetro se omite para indicar que la función es una función sin parámetros y el parámetro no se omite para indicar que la función es una función con parámetros ;

  2. El nombre de la función sigue la convención de nomenclatura de identificadores;

  3. mtianyan: Coloque la función personalizada  main antes de la función tanto como sea posible. Si desea colocarla después de la función principal , debe declarar la función personalizada antes de la función principal . El formato de declaración es:

[数据类型说明] 函数名称([参数]);

Llamada de función

Cuando necesitamos usar una función personalizada, tenemos que llamarla, por lo que se llama llamada de función cuando la llamamos .

En lenguaje C, la forma general de una llamada a función es:

函数名([参数]);

Aviso:

  1. Al llamar a una función sin parámetros, []se puede omitir la inclusión.

  1. []pueden ser constantes, variables u otros datos y expresiones estructurados, y varios parámetros están separados por comas.

Con participación sin participación

Una función que no requiere un parámetro de función se llama función sin parámetros , y una función que requiere un parámetro de función en una función se llama función parametrizada.

La forma general de una función con y sin parámetros es la siguiente:

imagen

La única diferencia entre una función parametrizada y una función sin parámetros es que () hay una lista de parámetros adicional en la función  .

  • Las funciones con parámetros son más flexibles y el contenido de salida se puede cambiar a voluntad como n cambios, siempre que se pase un parámetro en la función principal.

  • Sin embargo, la salida en la función sin argumentos es relativamente fija y, cuando es necesario cambiarla, es necesario cambiar el valor de la variable de bucle en un método personalizado.

mtianyan: Parámetros reales de participación formal

Los parámetros de función se dividen en parámetros formales y parámetros reales .

  • Los parámetros formales son los parámetros utilizados al definir el nombre de la función y el cuerpo de la función, y el propósito es recibir los parámetros pasados ​​al llamar a la función.

Al igual que Xiao Ming, quien dijo lo que dijo pero no actuó;

  • Los argumentos son los parámetros que se pasan a la función cuando se llama.

Al igual que Xiaogang realmente puede actuar.

Los parámetros de función y los parámetros reales tienen las siguientes características:

  • Los parámetros formales asignan unidades de memoria solo cuando se llaman y liberan las unidades de memoria asignadas inmediatamente cuando finaliza la llamada. Por tanto, los parámetros formales sólo son válidos dentro de la función.

Una vez que finaliza la llamada a la función y regresa a la función que llama, la variable de parámetro formal ya no se puede utilizar.

  • Los parámetros reales pueden ser constantes, variables, expresiones, funciones, etc.

No importa qué tipo de cantidad sean los parámetros reales, deben tener valores definidos cuando se llama a la función , para que estos valores puedan transferirse a los parámetros formales. Por lo tanto, se deben utilizar métodos como la asignación con antelación para obtener un valor definido para el parámetro real.

  • Al pasar parámetros, los parámetros reales y los parámetros formales deben ser estrictamente consistentes en cantidad, tipo y orden; de lo contrario, se producirá un error de discrepancia de tipos .

imagen

valor de retorno de la función

El valor de retorno de una función se refiere al valor obtenido al ejecutar el segmento del programa en el cuerpo de la función después de llamar a la función y devolverla a la función que la llama.

El valor de retorno de la función debe prestar atención a los siguientes puntos:

  • El valor de la función solo returnse puede devolver a la función que llama a través de la declaración.

La forma general de una declaración de devolución es:

return 表达式   或者为:return (表达式);
  • El tipo de valor de la función debe ser coherente con el tipo de función en la definición de la función .

notas: Si los dos son inconsistentes, el tipo de retorno de la función prevalecerá y la conversión de tipo se realizará automáticamente.

  • Una función que no devuelve un valor , con  un tipo de retornovoid de .

Aviso:

void Las funciones pueden tener bloques de código de ejecución, pero no pueden devolver valores.

mtianyan:  voidSi hay una declaración en la función return, la declaración solo puede finalizar la función. Su formato es: return;

Función recursiva (1)

La recursividad es cuando una función se llama a sí misma dentro de su cuerpo.

La ejecución de una función recursiva se llamará a sí misma repetidamente, ingresando a un nuevo nivel con cada llamada.

Tenga en cuenta que las funciones recursivas deben tener una condición final.

Función recursiva (2)

Analicemos el ejemplo del factorial de 5 y echemos un vistazo a su proceso de cálculo:

imagen

Cuando el programa calcula el factorial de 5, primero realiza la recursividad, devuelve 1 cuando n=1 o n=0, y luego retrocede para calcular y regresar. Se puede ver que la función recursiva debe tener una condición final.

Características de la función recursiva:

  1. Cada nivel de función tiene su propia variable al llamar, pero el código de la función no se copiará, como calcular el factorial de 5, la variable es diferente cada vez que es recursiva;

  2. Cada llamada regresará una vez, por ejemplo, al calcular el factorial de 5, regresará la próxima vez en cada recursión;

  3. En una función recursiva, la declaración antes de la llamada recursiva tiene el mismo orden de ejecución que la función llamada en todos los niveles;

  4. En una función recursiva, el orden de ejecución de las declaraciones después de la llamada recursiva es opuesto al de cada función llamada;

  5. Debe haber una declaración final en una función recursiva.

Resuma la recursividad en una oración: autoinvocación y estado de finalización

Tarea
El mono recogió N melocotones el primer día y se comió la mitad de ellos en ese momento, pero no quedó satisfecho, por lo que se comió uno más. Al día siguiente, se comió la mitad de los melocotones restantes y se comió uno más. Después de eso, come todos los días la mitad y una parte del resto del día anterior. El décimo día, cuando quise comer, solo quedaba un durazno ¿Cuántos duraznos se recogieron el primer día? E imprima la cantidad de melocotones que quedan por día a la inversa.

 
 
#include <stdio.h>
int getPeachNumber(int n)  
{
    int num;    
    if(n==10)
    {
       return 1;      
    } 
    else
    {
        num = (getPeachNumber(n+1)+1)*2;  
        printf("第%d天所剩桃子%d个\n", n, num); 
    }
    return num;
}
int main()
{
    int num = getPeachNumber(1);
    printf("猴子第一天摘了:%d个桃子。\n", num);
    return 0;
}

Demostración recursiva.

Hay 5 personas sentadas juntas, ¿cuántos años tiene la quinta persona? Dijo que era 2 años mayor que la cuarta persona. Pregunte la edad de la cuarta persona, dijo que es 2 años mayor que la tercera persona. Pregúntale a la tercera persona y dile que es dos años mayor que la segunda. Pregúntale a la segunda persona y dile que es dos años mayor que la primera. Finalmente le pregunté a la primera persona y me dijo que tenía 10 años. ¿Cuántos años tiene la quinta persona?

Análisis del programa:
utilizando el método recursivo, la recursividad se divide en dos etapas: retroceso y recursividad. Si desea saber la edad de la quinta persona, necesita saber la edad de la cuarta persona, y así sucesivamente, hasta la primera persona (10 años), y luego retroceder.

 
 
#include <stdio.h> 
int dfs(int n) {
    return n == 1 ? 10 : dfs(n - 1) + 2;
}
int main() 
{

    printf("第5个人的年龄是%d岁", dfs(5)); 
    return 0;
} 

locales y globales

Las variables en lenguaje C se pueden dividir en dos tipos según el alcance, a saber, variables locales y variables globales.

  • Las variables locales también se conocen como variables internas. Las variables locales se definen dentro de la función. Su alcance está limitado a la función y es ilegal utilizar esta variable después de salir de la función. Las variables también se pueden definir en una declaración compuesta y su alcance está solo dentro del alcance de la declaración compuesta.

  • Las variables globales también se conocen como variables externas, que son variables definidas fuera de una función. No pertenece a ninguna función, pertenece a un archivo de programa fuente. Su alcance es todo el programa fuente.

clase de almacenamiento variable

mtianyan: el lenguaje C se divide según el ciclo de vida de las variables, que se pueden dividir en modo de almacenamiento estático y modo de almacenamiento dinámico.

  • Método de almacenamiento estático: se refiere al método de asignar espacio de almacenamiento fijo durante la ejecución del programa. Las variables que existen durante la ejecución del programa, como las variables globales, se almacenan en el área de almacenamiento estático.

  • Método de almacenamiento dinámico: se refiere al método de asignar dinámicamente espacio de almacenamiento de acuerdo con las necesidades durante la ejecución del programa. Las variables almacenadas en el área de almacenamiento dinámico se establecen y liberan de acuerdo con las necesidades de operación del programa, y ​​generalmente incluyen: parámetros formales de la función; variables automáticas; protección de campo y dirección de retorno cuando se llama a la función, etc.

La categoría de almacenamiento en lenguaje C se divide en cuatro categorías:

  • automático (automático),

  • estático,

  • registro

  • externo (externo).

1. La variable definida con la palabra clave auto es una variable automática y se puede omitir auto. Si no se escribe auto, se designa implícitamente como "categoría de almacenamiento automático", que pertenece al método de almacenamiento dinámico. como:

imagen

2. Modificada con estática es una variable estática. Si se define dentro de una función, se llama variable local estática, si se define fuera de una función, se llama variable externa estática. Las siguientes son variables locales estáticas:

imagen

Nota: Las variables locales estáticas pertenecen a la categoría de almacenamiento estático. Las unidades de almacenamiento se asignan en el área de almacenamiento estático y no se liberan durante toda la ejecución del programa; a las variables locales estáticas se les asignan valores iniciales en el momento de la compilación, es decir, solo se les asignan valores iniciales una vez; si las variables locales están definidas Si el valor inicial no se asigna en ese momento, entonces para las variables locales estáticas, el valor inicial 0 (para variables numéricas) o un carácter nulo (para variables de caracteres) es asignado automáticamente en el momento de la compilación.

3. Para mejorar la eficiencia, el lenguaje C permite colocar el valor de una variable local en un registro en la CPU, esta variable se denomina "variable de registro" y se declara con la palabra clave registro. Por ejemplo:

imagen

mtianyan: Nota: Solo las variables automáticas locales y los parámetros formales se pueden utilizar como variables de registro; el número de registros en un sistema informático es limitado y no se puede definir cualquier número de variables de registro; las variables estáticas locales no se pueden definir como variables de registro.

4. La variable declarada con extern es una variable externa. El significado de una variable externa es que una función puede llamar a una variable definida después de la función. como:

imagen

Funciones intrínsecas y extrínsecas

  • En lenguaje C, las funciones que no pueden ser llamadas por otros archivos fuente se denominan funciones internas. Las funciones internas se definen mediante la palabra clave estática, por lo que también se denominan funciones estáticas. La forma es: estática [tipo de datos] nombre de función ([parámetro
    ] )

  • Lo estático aquí es una limitación en el alcance de la función, y la función solo se puede usar en el archivo fuente donde se encuentra, por lo que no hay problema con funciones internas con el mismo nombre de función que aparecen en diferentes archivos.

  • En lenguaje C, una función que puede ser llamada por otros archivos fuente se llama función externa. La función externa se define mediante la palabra clave extern y el formato es: extern [tipo de datos
    ] nombre de función ([parámetro])

  • El lenguaje C estipula que cuando no se especifica el alcance de la función, el sistema la considerará como una función externa de forma predeterminada, por lo que extern también se puede omitir cuando es necesario definir una función externa.

Las variables estáticas solo se asignan una vez

Ejercicio de función externa.

Hola C

#include <stdio.h>
#include "test.c"   //引用test.c文件
extern void printLine()     //这里定义的方法对吗?
{
   printf("**************\n");   
}
int main()
{
    say();
    return 0;
}

prueba.c

 
 
#include <stdio.h>
void printLine();
static void say(){
printLine();
printf("I love imooc\n");
printf("good good study!\n");
printf("day day up!\n");
printLine();
}

Para hello.c, el archivo test.c se introduce directamente. Luego puede llamar al método estático say () en testc,
que no se introduce en test.c, y puede llamar al método expuesto en otro archivo fuente mediante una declaración.

Entrenamiento combinado

Las reglas de tarifa de taxi en Beijing son las siguientes:

  1. El precio unitario por kilómetro es de 2,3 yuanes.

  2. El precio inicial es 13 yuanes (incluidos 3 kilómetros)

  3. Tome un taxi desde las 23:00 de la tarde (inclusive) hasta las 5:00 de la mañana del día siguiente (exclusivo), y el precio unitario por kilómetro se cobrará un 20%.

  4. Se cobra un recargo por combustible de 1 yuan por cada viaje.
    Xiao Ming tiene que tomar un taxi para ir y volver del trabajo todos los días y la distancia entre la empresa y su casa es de 12 kilómetros.
    Escriba un pequeño programa para calcular el costo total de los viajes diarios en taxi de Xiao Ming.

#include <stdio.h>

float taxifee(int clock,int miles)
{
    float money;
    if(miles<=3)
    {
        money=14;
        printf("费用为14\n");
    }
    else
    {
        if(clock>=23 || clock<5)
        {
            money=13+1+2.3*(miles-3)*1.2;
            printf("夜间车费为:%f\n",money);
        }
        else
        {
            money=13+1+2.3*(miles-3);
            printf("日间车费为:%f\n",money);
        }
    }

    return money;    
}
int main()
{
    printf("打的总费用:%.1f\n",taxifee(9,12)+taxifee(18,12));
    return 0;
}

Primera experiencia de matriz

El programa también necesita un contenedor, pero el contenedor es un poco especial. Es un espacio de memoria continuo con un tamaño fijo y el mismo tipo de datos en el programa . También tiene un bonito nombre llamado matriz. Una matriz puede entenderse como un tamaño fijo, los artículos colocados son una bolsa de compras del mismo tipo y
los artículos en la bolsa de compras se colocan en un orden determinado.

Veamos cómo declarar una matriz:

数据类型 数组名称[长度];

Simplemente declarar la matriz no funciona, veamos cómo se inicializa la matriz. Hablando de inicialización, existen tres formas de inicialización de matrices en lenguaje C, a saber:

  1. nombre de matriz de tipo de datos [longitud n] = {elemento1, elemento2...elementon};

  2. nombre de matriz de tipo de datos [] = {elemento1, elemento2...elementon};

  3. Tipo de datos NombreArray[longitud n];NombreArray[0] = Elemento 1;NombreArray[1] = Elemento 2;NombreArray[n-1] = Elemento n;

¿Cómo obtenemos los elementos de la matriz después de colocar los datos en la matriz?

Al obtener un elemento de matriz: nombre de la matriz [subíndice correspondiente al elemento];

Por ejemplo: para inicializar una matriz  int arr[3] = {1,2,3}; , entonces arr[0] es el elemento 1.

Aviso:

  1. Todos los subíndices de la matriz comienzan con 0 ;

  2. Cuando se inicializa la matriz, el número de elementos de la matriz no puede ser mayor que la longitud de la matriz declarada;

  3. mtianyan: si se utiliza el primer método de inicialización, cuando el número de elementos es menor que la longitud de la matriz, los elementos redundantes de la matriz se inicializan a 0;

  4. Cuando la matriz no se inicializa después de la declaración, el valor inicial de los elementos de la matriz de tipo estático (estático) y externo (externo) es 0 , y el valor inicial de los elementos de la matriz de tipo automático (auto) es incierto .

recorrido de matriz

La matriz puede atravesar cada elemento de forma circular, en lugar de obtener manualmente el elemento en una posición específica cada vez. Por ejemplo, usamos un bucle for para atravesar una matriz:

imagen

Tenga en cuenta los siguientes puntos:

  1. Es mejor evitar el acceso fuera de límites a la matriz y la variable de bucle no debe exceder la longitud de la matriz.

  2. Una vez que se declara la longitud de la matriz en lenguaje C, la longitud es fija y no se puede cambiar , y el lenguaje C no proporciona un método para calcular la longitud de la matriz .

Dado que el lenguaje C no tiene un mecanismo para verificar la longitud de la matriz o la matriz está fuera de los límites, se puede compilar y pasar en el editor, pero el resultado no es seguro, por lo que es mejor no cruzar los límites. o cambiar la longitud de la matriz.

lenguaje c para obtener la longitud de la matriz

 
 
int length = sizeof(arr)/sizeof(arr[0]);

matriz como parámetro de función

Las matrices pueden usar la matriz completa como parámetro de función o un elemento de la matriz como parámetro de función:

  1. La matriz completa se utiliza como parámetro de función, es decir, el nombre de la matriz se pasa a la función , por ejemplo:

imagen

Los elementos de la matriz se utilizan como parámetros de función, es decir, los parámetros de la matriz se pasan a la función, por ejemplo:

imagen

Tenga en cuenta lo siguiente cuando utilice matrices como parámetros de función:

  1. Cuando el nombre de la matriz se pasa como argumento de función, el parámetro de tipo de matriz en la definición de la función como parámetro receptor puede especificar la longitud o no especificar la longitud.

  2. Cuando se pasa un elemento de matriz como argumento de función, el tipo de elemento de matriz debe ser coherente con el tipo de datos del parámetro formal.

mtianyan: Aplicación de matrices (1) [clasificación de burbujas]

Tomando como ejemplo la ordenación ascendente, la idea de la ordenación por burbujas: compare los elementos adyacentes por pares y coloque el número mayor detrás hasta que todos los números estén ordenados. Al igual que cuando hacemos cola en la escuela primaria, nos alineamos según el tamaño y sacamos a un compañero para compararlo con los que están detrás.

#include <stdio.h>
int main()
{
    double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80};
    int i,j;
    printf("\n************排队前*************\n");
    for(i=0;i<10;i++)
    {
        if(i != 9)   
            printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位
        else
            printf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位
    }
    for(i=8; i>=0; i--)
    {
        for(j=0;j<=i;j++)
        {
            if( arr[j]>arr[j+1])      //当前面的数比后面的数大时
            {
                double temp;    //定义临时变量temp
                temp=arr[j];//将前面的数赋值给temp
                arr[j]=arr[j+1];             //前后之数颠倒位置
                arr[j+1]=temp;//将较大的数放在后面    
            }                 
        }                
    }
    printf("\n************排队后*************\n");
    for(i=0;i<10;i++)
    {
        if(i != 9)   
            printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位     
        else
            printf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位
    }
    return 0;    
}

Aplicación de matriz (2) [Función de búsqueda de matriz]

Cuando vamos de compras y regresamos a casa con una bolsa de compras, revisaremos los artículos de la bolsa uno por uno para ver si faltan o son todas las cosas que queremos comprar.

Luego, cuando se aplica al programa, puede usar la función de búsqueda de matriz para ver si los datos existen y, de ser así, devolver el subíndice del elemento.

#include <stdio.h>
int getIndex(int arr[5],int value)
{
    int i;
    int index;
    for(i=0;i<5;i++)
    {
       /* 请完善数组查询功能 */
       if(arr[i]==value)
        {
            index=i;
            break;
        }  
       index=-1;
    }
    return index;
}

int main()
{
    int arr[5]={3,12,9,8,6};
    int value = 8;
    int index = getIndex(arr,value);      //这里应该传什么参数呢?
    if(index!=-1)
    {
        printf("%d在数组中存在,下标为:%d\n",value,index);             
    }
    else
    {
        printf("%d在数组中不存在。\n",value);    
    }
    return 0;    
}

Cadenas y matrices

En lenguaje C, no hay forma de definir directamente el tipo de datos de cadena, pero podemos usar una matriz para definir la cadena que queremos. Generalmente existen dos formatos:

  1. nombre de cadena de caracteres [longitud] = "valor de cadena";

  2. nombre de cadena de caracteres[longitud] = {'Carácter 1','Carácter 2',...,'Carácter n','\0'};

Aviso:

  1. La longitud entre [] se puede omitir;

  2. Cuando se utiliza el segundo método, el último elemento debe ser '\0', '\0' significa el final de la cadena;

  3. Cuando se utiliza el segundo método, no se puede escribir chino en la matriz. Utilice : o ;
    al generar cadenas .printf(“%s”,字符数组名字);puts(字符数组名字)

mtianyan: función de cadena

Las funciones de cadena más utilizadas son las siguientes (strlen, strcmp, strcpy, strcat, atoi):

imagen

Tenga en cuenta lo siguiente cuando utilice funciones de cadena:

strlen () obtiene la longitud de la cadena, '\0' no está incluido en la longitud de la cadena y la longitud de los caracteres y letras chinos es diferente. Por ejemplo:

imagen

Cuando strcmp() compara, convierte las cadenas en códigos ASCII y luego las compara. El resultado devuelto es 0, lo que significa que los códigos ASCII de s1 y s2 son iguales. El resultado devuelto es 1, lo que significa que los códigos ASCII de s1 son mayores que s2. El resultado devuelto es -1 indica que el código ASCII de s1 es menor que el de s2, por ejemplo:

imagen

Después de copiar con strcpy(), la cadena original se sobrescribirá y la constante de cadena no se podrá copiar, por ejemplo:

imagen

Cuando se usa strcat, los espacios de memoria a los que apuntan s1 y s2 no pueden superponerse, y s1 debe tener suficiente espacio para acomodar la cadena que se va a copiar, como por ejemplo:

imagen

Matrices multidimensionales

El formato de definición de una matriz multidimensional es:
tipo de datos nombre de la matriz [expresión constante 1] [expresión constante 2]...[expresión constante n];

imagen

Se define una matriz bidimensional denominada num y tipo de datos int. Entre ellos, el primero [3] indica la longitud del subíndice en la primera dimensión, al igual que las compras que se almacenan en categorías al comprar; el segundo [3] indica la longitud del subíndice en la segunda dimensión, al igual que el elementos en cada bolsa de compras.

imagen

La inicialización de matrices multidimensionales es similar a la inicialización de matrices unidimensionales y existen dos tipos:

  1. Nombre de matriz de tipo de datos [expresión constante 1] [expresión constante 2]...[expresión constante n] = {{ valor1,..,valorn},{valor1,..,valorn},. ..,{valor1,. .,valor}};

  2. TIPO DE DATOS ARRAYNAME[CONSTEXPR1][CONSTEXPR2]...[CONSTEXPRn];ARRAYNAME[SUBSCRIPT1][SUBSCRIPT2]...[SUBSCRIPTn] = valor;

Al inicializar matrices multidimensionales, preste atención a lo siguiente:

  1. Cuando se utiliza el primer tipo de inicialización, la declaración de matriz debe especificar la dimensión de la columna. mtianyan: Debido a que el sistema asignará espacio de acuerdo con el número total de elementos en la matriz, cuando se conozca el número total de elementos y la dimensión de la columna, la dimensión de la fila se calculará directamente;

  2. Cuando se utiliza el segundo tipo de inicialización, la declaración de matriz debe especificar las dimensiones de fila y columna.

Al definir una matriz bidimensional, no se puede especificar el número de filas, pero se debe especificar el número de columnas.

Al definir una matriz bidimensional, no se puede especificar el número de filas, pero sí se debe especificar el número de columnas.

Recorrido de matrices multidimensionales.

También existen matrices multidimensionales para el recorrido y, al igual que el recorrido de matrices unidimensionales, también se requieren bucles. La diferencia es que las matrices multidimensionales necesitan utilizar bucles anidados.

Nota: El subíndice de cada dimensión de la matriz multidimensional no puede exceder los límites.

Entrenamiento combinado:

#include <stdio.h>
#define N 10
//打印分数 
void printScore(int score[])
{
    int i;
    printf("\n");
    for(i=0;i<N;i++)
    {
        printf("%d ",score[i]);               
    }
    printf("\n");     
}
//计算考试总分 
int getTotalScore(int score[])
{
    int sum = 0;
    int i;
    for(i=0;i<N;i++)
    {
        sum+=score[i];                
    } 
    return sum;
}
//计算平均分 
int getAvgScore(int score[])
{
    return getTotalScore(score)/N;   
}
//计算最高分 
int getMax(int score[])
{
    int max = -1;
    int i;
    for(i=0;i<N;i++)
    {
        if(score[i]>max)
        {
            max = score[i];              
        }                
    } 
    return max;
}
//计算最低分 
int getMin(int score[])
{
    int min =100;
    int i;
    for(i=0;i<N;i++)
    {
        if(score[i]< min)
        {
            min = score[i];              
        }                
    } 
    return min;
}
//分数降序排序 
void sort(int score[])
{
    int i,j;
    for(i=N-2;i>=0;i--)
    {
        for(j=0;j<=i;j++)
        {
            if(score[j]<score[j+1])
            {
                int temp;
                temp = score[j];
                score[j] = score[j+1]; 
                score[j+1]=temp;                  
            }                 
        }                   
    }
    printScore(score);     
}

int main()
{
    int score[N]={67,98,75,63,82,79,81,91,66,84};
    int sum,avg,max,min;
    sum = getTotalScore(score);
    avg = getAvgScore(score);
    max = getMax(score);
    min = getMin(score);
    printf("总分是:%d\n",sum);
    printf("平均分是:%d\n",avg);
    printf("最高分是:%d\n",max);
    printf("最低分是:%d\n",min);
    printf("----------成绩排名---------\n");
    sort(score);
    return 0;    
}

Supongo que te gusta

Origin blog.csdn.net/weixin_41114301/article/details/132415970
Recomendado
Clasificación