Notes techniques sur le langage C

Fonction qsort intégrée en C

#include<stdio.h>
#include<stdlib.h>
int comparaison(const void *elem1, const void *elem2) // Fonction de comparaison
{
    return *(int*)elem1 - *(int*)elem2;
}
int main()
{
    int donnees[10] = {2,4,1,5,5,3,7,4,1,5}; // Tableau non trié
    int i;
    qsort(donnees,10,sizeof(int),comparaison); // Appel de qsort pour trier
    return 0;
}

Pour un tri croissant, utilisez b-a pour un tri décroissant.

Fonction memset

# include <stdio.h>
# include <string.h>
int main(void)
{
    int i;  // Variable de boucle
    char chaine[10];
    char *pointeur = chaine;
    memset(chaine, 0, sizeof(chaine));  // Utilisez sizeof(chaine), pas sizeof(pointeur)
    for (i=0; i<10; ++i)
    {
        printf("%d\x20", chaine[i]);
    }
    printf("\n");
    return 0;
}

16 novembre

Plusieurs sauts de ligne en fin de sortie n'affectent généralement pas le résultat.

Pour l'entrée de multiples chaînes de caractères, un tableau à deux dimensions est généralement préférable. Cependant, ce n'est pas une règle absolue, comme dans le cas de l'algorithme d'allocation mémoire.

Implémentation d'une pile avec un tableau

char contenu[TAILLE];
int sommet=0;
void empiler(char valeur){
    contenu[sommet++]=valeur;
}
char depiler(void){
    if(sommet==0){
        printf("Vide\n");
    }
    else{
        return contenu[--sommet];
    }
}

18 novembre

Recherche de la plus petite puissance de 2 supérieure à un nombre

int puissance_de_deux(int x){
    int resultat=-1;
    for(int i=1;;i*=2){
        resultat++;
        if(i>=x){break;}
    }
    return resultat;
}

Pour calculer une puissance de 2, utilisez simplement 1<<n.

19 novembre

Utilisation de la fonction malloc

    char *memoire;
    memoire=malloc(TAILLE);
    memoire=malloc(TAILLE);

Conversion IEEE754 : hexadécimal en décimal (flottant simple précision)

#include <math.h>
float convertir(int nombre)
{
    int signe = (nombre & 0x80000000) ? -1 : 1; // Opérateur ET bit à bit pour le bit de signe
    int exposant = ((nombre >> 23) & 0xff) - 127; // Décalage puis ET bit à bit
    float mantisse = 1 + ((float)(nombre & 0x7fffff) / 0x7fffff); // Conversion des bits 22-0
    return signe * mantisse * pow(2, exposant);
}
int main()
{
    int valeur;
    scanf("%x",&valeur);
    float resultat = convertir(valeur);
    printf("%f", resultat);
    return 0;
}

20 novembre

Recherche binaire

int rechercher(int x){
    int gauche=0,droite=n-1; // Plage de k[gauche] à k[droite]
    while(droite>=0&&gauche<n&&gauche<=droite){
        int milieu = (gauche+droite+1)/2;
        if(k[milieu]==x){
            return 1;
        }
        else if(k[milieu]<x){
            gauche=milieu+1;
        }
        else{
            droite=milieu-1;
        }
    }
    return 0;
}

Ceci est un algorithme de recherche binaire - le tableau doit être trié par ordre croissant.

Tri à bulles

void echanger(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}
void trier(int longueur, int tableau[]){
    for(int i=0;i<longueur-1;i++){
        for(int j=0;j<longueur-i-1;j++){
            if(tableau[j]>tableau[j+1]){
                echanger(&tableau[j],&tableau[j+1]);
            }
        }
    }
}

Fonctions de string.h

char *copier_chaine(char *dest,const char *src){
    char *p=dest;
    while (*dest++ = *src++);
    return p;
}
char *concatener_chaine(char *dest,const char *src){
    char *p = dest;
    while(*p){
        p++;
    }
    while(*p++ = *src++)
        ;
    return dest;
}

Macro pour la comparaison : #define min(a, b) ((a) < (b) ? (a) : (b))

Les macros offrent une syntaxe concise.

Fonctions courantes : inversion de chaîne et vérification de nombre premier

    int resultat = 0;
    while (nombre) {   // Inversion de nombre
        resultat = resultat * 10 + nombre % 10;
        nombre/=10;
    }
    return resultat;
}

Vérification de nombre premier :

int est_premier(int n) {
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)  // Si un facteur est trouvé, ce n'est pas premier
            return 0;
    return 1;
}

Lecture d'entrée

while(scanf("%s",&chaine)!=EOF){
    // Traitement
}

Bonne méthode de lecture. Dans CLion, utilisez Ctrl+D en mode débogage pour entrer EOF.

Listes chaînées

#include <stdlib.h>
struct element{
    int valeur;
    struct element* suivant;
};
struct element* ajouter_en_tete(int valeur,struct element*liste){
    struct element*nouveau= malloc(sizeof(struct element));
    nouveau->valeur=valeur;
    nouveau->suivant=liste;
    return nouveau;
}
struct element* supprimer_element(int valeur,struct element*liste){
    struct element* actuel,*precedent;
    for(actuel=liste,precedent=NULL;actuel!=NULL&&actuel->valeur!=valeur;precedent=actuel,actuel=actuel->suivant){
    }
    if(actuel==NULL)return liste;
    if(precedent==NULL)liste=liste->suivant;
    else
        precedent->suivant=actuel->suivant;
    free(actuel);
    return liste;
}
int main(){
    struct element* p;
    struct element* premier = NULL;
    premier = ajouter_en_tete(114514,premier);
    premier = ajouter_en_tete(1919810,premier);
    for(p=premier;p!=NULL;p=p->suivant){
        printf("%d\n",p->valeur);
    }
    premier = supprimer_element(1919810,premier);
    for(p=premier;p!=NULL;p=p->suivant){
        printf("%d\n",p->valeur);
    }
    return 0;
}

Opérations de base sur les listes chaînées, avec insertion en tête.

Opérations sur les pointeurs et les bits

Pointeurs restreints. Pointeurs de pointeurs. Solutions astucieuses pour des cas particuliers.

int (*p) [10] = malloc(sizeof(int)*200); - Généralemetn utilisé pour opérer sur une colonne de tableau à deux dimensions. p pointe vers un tableau de 10 éléments, avec 20 lignes. p++ passe à la ligne suivante, même colonne.

Opérations sur les bits

  • i & (1 << j) : Lit le j-ième bit de i
  • i &= ~(1 << j) : Met le j-ième bit de i à 0
  • i |= (1 << j) : Met le j-ième bit de i à 1
  • L'opération XOR peut être utilisée pour le chiffrement : a^b^b = a, où b est la clé et a^b est le texte chiffré.

Conversion décimal → binaire → hexadécimal

#include<stdio.h>
#include<string.h>
#include<math.h>
void convertir(char entree[],char binaire[],hexadecimale[]){
    char*p,*p1,c;int j,t;
    p=binaire;
    for(;*entree!='\0';entree++){
        t=*entree-'0';
        p+=2;
        for(j=0;j<3;j++){
            *p=t%2+'0';
            p--;t/=2;}
        p+=4;
        }
    *p='\0';
    p=binaire+ strlen(binaire)-1;
    p1=hexadecimale;
    for(t=0,j=0;p>=binaire;p--){
        t+=(*p-'0')*(int)pow(2,j++);
        if(t!=0&&(j%4==0||p==binaire)){
            if(t<10)*p1=t+'0';
            else *p1=t-10+'A';
            j=0;t=0;p1++;
        }
    }
*p1='\0';
    for(p1--;hexadecimale<p1;hexadecimale++,p1--){
        c=*hexadecimale;*hexadecimale=*p1;*p1=c;
    }

}
int main(){
char entree[]="357",binaire[20],hexadecimale[10];
    convertir(entree,binaire,hexadecimale);
    printf("%s,%s\n",binaire,hexadecimale);
}

Étiquettes: programmation C algorithmes fonctions standard manipulation de pointeurs tri

Publié le 29 mai à 20h42