Compare commits

...

21 Commits

Author SHA1 Message Date
EmmanuelTiamzon
93a79b5efc Gros controle nul de DEV sujet 5 2025-12-10 16:35:13 +01:00
EmmanuelTiamzon
8773a2093d update 2025-12-05 11:15:44 +01:00
EmmanuelTiamzon
19e02c8747 Ajout fenetre 2025-12-05 10:52:51 +01:00
EmmanuelTiamzon
c92acbe2e7 update 2025-12-05 10:52:29 +01:00
EmmanuelTiamzon
016441867c correction README 2025-12-05 10:39:25 +01:00
EmmanuelTiamzon
2a4b74f54e update 2025-12-05 10:36:05 +01:00
EmmanuelTiamzon
0ae7d097f9 ajout SAE PHP 19/20 Meilleure note de la promo 2025-12-05 10:30:43 +01:00
EmmanuelTiamzon
b05817dbcd ajout première SAE WEB 1ere année 17/20 2025-12-05 10:29:17 +01:00
EmmanuelTiamzon
936915e585 ajout 2eme SAE DEV 1ere année 15,50/20 2025-12-05 10:28:17 +01:00
EmmanuelTiamzon
89feabab98 ajout première SAE de DEV 1ere année 15/20 2025-12-05 10:27:08 +01:00
EmmanuelTiamzon
ada85c86c2 TP3 DEV.3.2 Luminaicance 2025-12-05 10:25:26 +01:00
EmmanuelTiamzon
ec98d50009 TP2 Fibonacci 2025-12-05 10:24:29 +01:00
8f1146fc94 Upload files to "DEV.3.2/cours"
Cours listes
2025-12-05 10:07:07 +01:00
b59223768a Delete DEV.3.2/cours/1Généricité.pdf 2025-12-05 08:51:57 +01:00
726c156546 Upload files to "DEV.3.2/cours" 2025-12-05 08:51:51 +01:00
c9ee10e59a Upload files to "DEV.3.2/cours" 2025-12-05 08:51:14 +01:00
e1a1b73f37 Update README.md 2025-12-01 14:42:43 +01:00
EmmanuelTiamzon
77e2c58445 update 2025-11-12 11:16:54 +01:00
EmmanuelTiamzon
baa90530f9 exo 4 fin du tp generecite 2025-11-07 17:03:40 +01:00
EmmanuelTiamzon
1ccfe90def exo 3 tp generecite 2025-11-07 16:39:12 +01:00
EmmanuelTiamzon
aa9142a9c4 exo2 TP Generecite 2025-11-07 16:11:14 +01:00
411 changed files with 89442 additions and 2 deletions

123
DEV-R3.03/srivastava_5.txt Normal file
View File

@@ -0,0 +1,123 @@
- Q1-a:
- Demande : Je veux un chatbot d'IA sur le RGPD et l'AI act afin d'être tranquille niveau conformité
- Besoin A: Je dois pouvoir discuter avec une IA sur les différents droits et régulations informatique
- Besoin B: Je dois pouvoir être tranquille niveau conformité sur le RGPD et l'AI act
- Besoin C: Je dois pouvoir recevoir des informations qui sont dans la base documentaire interne
- Q1-b:
- Questions ouvertes :
1. Pourriez-vous me décrire une journée type de travail où vous auriez besoin d'informations juridique informatique ?
2. Qu'est-ce qui vous frustre le plus lorsque vous avez besoin d'utiliser la base documentaire interne ?
3. Si le chatbot IA était là et était fonctionnel, que lui demanderiez-vous ?
4. Décrivez moi les défis que vous rencontrez au niveau conformité au quotidien.
- Q1-c:
- Mauvaises question 1: Voulez-vous le modèle d'IA GPT4o ou GPT-5 ?
- Mauvaises question 2: Donc faut-il que le chatbot IA puisse donner un tableau de type tableur pour tout ce qui est RGPD ?
- Car: Elles sont problématique car souvent c'est au développeur de penser à comment répondre à ce genre de question, et que le client n'est pas un client trop technique qui a un besoin et qui veut une solution.
- Q2-a:
- E1: EF, Il décrit ce que le chatbot doit faire, son comportement face à un langage naturel et son action de renvoyer une réponse textuelle.
- E2: ENF, Il décrit ici comment est-ce que le chatbot doit répondre donc avec une contrainte de temps et une contrainte de connexion.
- E3: EF, Il décrit ce que le chatbot doit faire avec les données personnelles identifiable des employés, qui est de ne pas les envoyés à de API d'IA externes.
- E4: ENF, Il décirt comment le chatbot doit se comporter vis-à-vis des journaux de conversation contenant des données personnelles.
- E5: EF, Il décrit ce que le chatbot doit faire, il n'y a aucune précision sur comment mais il veut qu'il soit intelligent et toujours donner des réponses de haute qualité.
- E6: EF, Il décrit ce que le chatbot doit faire donc brièvement sans détail, que faire lorsque la question dépasse son périmètre, qui est d'escalader la demande vers une autre équipe.
- Q2-b:
- ENF-reformulée-1: Le chatbot doit maintenir un taux d'hallucination inférieur à 10%
- ENF-reformulée-2: le chatbot doit atteindre un score de satisfaction moyen de 4/5
- Q2-c:
Pour E3: envoyer des données vers une API externe fait sortir l'information du périmètre sécurisé de l'entreprise. Cela expose les secrets et les données critique à un tiers, violant le principe de confidentialité requis pour la conformité.
Pour E4: Une ocnversation illimitée permettrait de "profiter" ou surveiller les employés sur le long terme. La limitation de 30 jours et l'anonymisation qui garanti le droit à l'oubli et empêche l'outil de devenir un outil de surveillance intrusive.
- Q3-a:
- US1: S, E, T ne sont pas respectés
- S: "chatbot complet" est bien trop gros pour une seule story, c'est le projet en entier.
- E: Impossible d'estimer la charge de travail sur un pérmiètre aussi vague "complet"
- T: "Conforme au RGPD" est un audit juridique pas un test binaire simple...
- US2: T, E, I ne sont pas respectés
- T: "Aimer utiliser" est une émotion subjective, impossible à tester.
- E: les adjectifs "moderne et intuitive" sont trop flous pour estimer le temps de développement.
- I: L'interface dépend entièrement des fonctionnalités backend qui seront développées.
- US3: N, V, I ne sont pas respectés
- N: la user story impose la solution technique ("API SuperLM-9000") au lieu de décrire le besoin, fermant la discussion.
- V: C'est une tâche technique ("Conencter l'API"). La valeur pour n'est pas claire.
- I: Elle crée une dépendance forte et immédiate à un fournisseur spécifique.
- US4: S, E, T ne sont pas respectés
- S: "Tous les droits" (accès rectification, oubli, portabilité...) est une Epic géante, pas une story.
- E: Trop large pour être chiffré dans un sprint.
- T: On ne peut pas écrire un test unique pour "gérer tous les droits" en même temps.
- Q3-b nouveau backlog (8 user stories INVEST):
- Transparence :
- US-A: En tant qu'utilisateur, je veux voir une mention explicite "Réponse générée par IA" sous chaque message afin de ne pas confondre le chatbot avec un interlocuteur humain RH.
- US-B: En tant qu'utilisateur, je veux que le chatbot affiche les liens vers les documents internes (sources) utilisés pour construire sa réponse afin de pouvoir vérifier l'exactitude de l'information par moi-même.
- Droit des personnes :
- US-C: En tant qu'employé, je veux pouvoir télécharger un export PDF de mes conversations afin d'exercer mon droit d'accès et de portabilité des données.
- US-D: En tant qu'employé, je veux un bouton "Effacer mes données" qui supprime l'historique de la session courante afin d'exercer mon droit à l'effacement concernant des questions sensibles
- Epic:
- US-E: En tant que DPO, je veux une interface d'administration complète pour gérer les audits de logs, les alertes de sécurité et les demandes de droits complexes afin de garantir la conformité légale globale de l'outil.
- Autres (Fonctionnel/Qualité):
- US-F: En tant qu'utilisateur, je veux poser des questions en language naturel sur le RGPD afin d'obtenir une réponse immédiate sans avoir à lire les textes juridiques bruts.
- US-G: En tant qu'expert métier, je veux pouvoir signaler une réponse incorrecte afin d'aider l'équipe technique àcorriger les hallucinations du modèle.
- US-H: En tant qu'admin Sécurité, je veux que le système masque automatiquement les numéros de sécurité sociale détectés dans les prompts afin d'empêcher leur stockage en clair dans les bases de données.
- Q3-c:
- Je choisi les user stories US-B et US-D:
US-B:
- Critère 1. scénario nominal: lorsque le chatbot répond à une question sur le "télétravail", la réponse doit se terminer par une section "Sources:" contenant au moins un lien cliquable vers le document intranet pertinent.
- Critère 2. cas d'erreur/manque de source: Si la question de l'utilisateur ne correspond à aucun document de la base de connaissance, le chatbot doit répondre "je ne trouve pas cette information dans la basedocumentaire interne" et ne pas inventer une réponse
- Critère 3. La confidentialité: Si le document source identifié possède un tag de sécurité "Confidentiel - CODIR", le chatbot ne doit pas l'utiliser pour générer la réponse ni afficher le lien si l'utilisateur n'a pas les droits d'accès correspondants.
US-C:
- Critère 1. Scénario nominal: Après avoir cliqué sur le bouton "Effacer l'historique", l'interface utilisateur se vide et une requête en base de données confirme que les logs textuels associés à cet ID de session ont été supprimés physiquement.
- Critère 2. Cas d'erreur: Si le service de base de données est indisponible au moment de la demande, le système doit afficher un message d'erreur explicite "Suppression impossible pour le moment, veuillez réessayer",plutôt que de laisser l'utilisateur crorie que ses données sont effacés.
- Critère 3. Confidentialité/Sensible: La suppression de la conversation doit également faire en sorte à ce que l'on évite que des fragments de données sensibles ne ressortent lors de recherches futures.
- Q4-a:
- Acteur primaire: Employé (Utilisateur authentifié)
- Précondition principale: L'utilisateur est connecté et possède un historique de conversations enregistré dans le système
- Postcondition de succès: Les logs de conversations sont supprimés de l'interface et anonymisés/effacés en base de données.
- Postcondition d'échec: Les données sont conservées intactes et un message d'erreur informe l'utilisateur de l'échec de l'opération
- Q4-b scénario nominal:
1. Acteur: L'employé clique sur le bouton ou tape la commande "Gérer mes données personnelles" dans l'interface du chatbot.
2. Système: Affiche un menu d'options liées aux droits RGPD (Accès, Rectification, Effacement)
3. Acteur: L'employé séléctionne l'option "Effacer l'historique de mes conversations"
4. Système: Demande une confirmation explicite: "Attention, cette action est irréversible. Confirmez-vous la suppression ?"
5. Acteur: L'employé appuie sur "Confirmer"
6. Système: Lance le processus de suppression en arrière-plan et purge les données de la session.
7. Système: Affiche une notification desuccès: "Votre historique avec succès" et réinitialise la fenêtre de chat.
- Q4-c:
- Scénario A: Si, au moment de valider la suppression, la session de l'utilisateur a expiré, le système interrompt le processus, affiche un message "Session expiré" et redirige l'utilisateur vers la page de connexion. Les données ne sont pas effacées.
- Scénario B: Si le système détecte qu'une conversation contient des éléments liés à une enquête de harcèlement en cours, le Système procède à une suppression logique pour l'utilisateur mais archive les logs dans un coffre-fort sécurisé pour le service juridique. Le système informe alors l'utilisateur : "Vos conversations ont été retirées de votre historique visible.
Q5-a:
Voici les classes conceptuelles identifiées pour la gestion des conversations et des droits :
- Utilisateur : (Attributs : ID_Employé, Nom, Email, Rôle).
- Conversation : (Attributs : ID_Session, Date_Début, Statut_Escalade).
- Message : (Attributs : Contenu_Texte, Horodatage, Emetteur, Est_Hallucination).
- DemandeDroit : (Attributs : Type_Droit [Accès/Effacement], Date_Demande, Statut_Traitement).
- CelluleConformité : (Attributs : ID_Service, Nom_Responsable).
- Association clé : Utilisateur (1) ----- (0..*) Conversation (Un utilisateur peut avoir plusieurs conversations, une conversation appartient à un seul utilisateur).
Q5-b:
Ce processus décrit le flux lorsqu'une question dépasse les compétences de l'IA :
- Utilisateur : Pose une question complexe (ex: "Quels sont les impacts de l'AI Act sur nos filiales hors UE ?").
- Chatbot : Analyse la question, détecte un score de confiance faible et un sujet sensible ("AI Act / International").
- Chatbot : Répond à l'utilisateur : "Cette question nécessite une expertise juridique approfondie. Je transmets votre demande à la cellule conformité."
- Système : Crée un ticket d'escalade et notifie la CelluleConformité.
- Juriste RGPD : Reçoit la notification, analyse la question et consulte les textes de loi.
- Juriste RGPD : Rédige une réponse validée juridiquement dans l'interface d'administration.
- Système : Envoie la réponse du juriste dans le fil de discussion du chatbot.
- Utilisateur : Reçoit la notification et lit la réponse qualifiée.

View File

@@ -0,0 +1,97 @@
import java.awt.*;
import javax.swing.*;
public class Vue extends JFrame {
private JButton creer,postit1,postit2,postit3,postit4;
private Controleur controleur;
public Vue() {
super("Boutons");
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setLayout(new GridBagLayout());
this.creer = new JButton("Créer un papillon");
this.postit1 = new JButton("Post-it 1");
this.postit2 = new JButton("Post-it 2");
this.postit3 = new JButton("Post-it 3");
this.postit4 = new JButton("Post-it 4");
this.controleur = new Controleur();
// Contrainte du bouton 1 en haut à gauche
GridBagConstraints contrainte1 = new GridBagConstraints();
contrainte1.gridx = 0;
contrainte1.gridy = 0;
contrainte1.gridwidth = 2;
contrainte1.gridheight = 1;
contrainte1.fill = GridBagConstraints.BOTH;
contrainte1.anchor = GridBagConstraints.CENTER;
contrainte1.weightx = 1.0;
contrainte1.weighty = 1.0;
contrainte1.insets = new Insets(3,3,3,3);
this.add(this.creer, contrainte1);
// Contrainte du bouton 2 en haut à droite
GridBagConstraints contrainte2 = new GridBagConstraints();
contrainte2.gridx = 0;
contrainte2.gridy = 1;
contrainte2.gridwidth = 1;
contrainte2.gridheight = 1;
contrainte2.fill = GridBagConstraints.BOTH;
contrainte2.anchor = GridBagConstraints.CENTER;
contrainte2.weightx = 1.0;
contrainte2.weighty = 1.0;
contrainte2.insets = new Insets(5,5,5,10);
this.add(this.postit1, contrainte2);
// Contrainte du bouton 3 en bas à droite
GridBagConstraints contrainte3 = new GridBagConstraints();
contrainte3.gridx = 1;
contrainte3.gridy = 1;
contrainte3.gridwidth = 1;
contrainte3.gridheight = 1;
contrainte3.fill = GridBagConstraints.BOTH;
contrainte3.anchor = GridBagConstraints.CENTER;
contrainte3.weightx = 1.0;
contrainte3.weighty = 1.0;
contrainte3.insets = new Insets(5,10,5,5);
this.add(this.postit2, contrainte3);
// Contrainte du bouton 4 en bas à gauche
GridBagConstraints contrainte4 = new GridBagConstraints();
contrainte4.gridx = 0;
contrainte4.gridy = 2;
contrainte4.gridwidth = 1;
contrainte4.gridheight = 1;
contrainte4.fill = GridBagConstraints.BOTH;
contrainte4.anchor = GridBagConstraints.CENTER;
contrainte4.weightx = 1.0;
contrainte4.weighty = 1.0;
contrainte4.insets = new Insets(5,5,10,5);
this.add(this.postit3, contrainte4);
// Contraite du bouton 5 au milieu
GridBagConstraints contrainte5 = new GridBagConstraints();
contrainte5.gridx = 1;
contrainte5.gridy = 2;
contrainte5.gridwidth = 1;
contrainte5.gridheight = 1;
contrainte5.fill = GridBagConstraints.BOTH;
contrainte5.anchor = GridBagConstraints.CENTER;
contrainte5.weightx = 0.0;
contrainte5.weighty = 0.0;
contrainte5.insets = new Insets(5,10,5,5);
this.add(this.postit4, contrainte5);
this.addWindowListener(this.controleur);
this.setVisible(true);
}
}

View File

@@ -0,0 +1,31 @@
public class Association<E> {
private E element;
private int frequence;
public Association(E element, int frequence) {
this.element = element;
this.frequence = frequence;
}
public E getElement() {
return element;
}
public void setElement(E elt) {
this.element = elt;
}
public int getFrequence() {
return frequence;
}
public void setFrequence(int f) {
this.frequence = f;
}
@Override
public String toString() {
return "Association [element=" + element + ", frequence=" + frequence + "]";
}
}

View File

@@ -0,0 +1,34 @@
import java.util.*;
public class Frequence {
public static <T> T elementPlusFrequent(T[] tab) {
java.util.Map<T, Integer> compteur = new java.util.HashMap<>();
for(T element : tab) {
compteur.put(element, compteur.getOrDefault(element, 0) + 1); // Ici on compte les occurrences de chaque élément
}
// Maintenant on doit trouver l'element le plus frequent (en respectant l'ordre du tableau)
T resultat = null;
int maxFrequence = 0;
for(T element : tab) {
int frequence = compteur.get(element);
if(frequence > maxFrequence) {
maxFrequence = frequence;
resultat = element;
}
}
return resultat;
}
public static void main(String[] args) {
// On test d'abord avec un type String
String[] mots = {"un", "deux", "trois", "un", "deux", "un"};
System.out.println("Le mot le plus frequent est : " + elementPlusFrequent(mots));
// On test ensuite avec un type Integer
Integer[] nombres = {1, 2, 2, 3, 1, 2};
System.out.println("le nb plus frequent : " + elementPlusFrequent(nombres));
}
}

View File

@@ -0,0 +1,34 @@
import java.util.Map;
import java.util.HashMap;
public class Main {
public static <T> Association<T> elementPlusFrequent(T[] tab) {
java.util.Map<T, Integer> compteur = new java.util.HashMap<>();
for (T elem : tab) {
compteur.put(elem, compteur.getOrDefault(elem, 0) + 1);
}
T resultat = null;
int maxFreq = 0;
for (T elem : tab) {
int freq = compteur.get(elem);
if (freq > maxFreq) {
maxFreq = freq;
resultat = elem;
}
}
return new Association<>(resultat, maxFreq);
}
public static void main(String[] args) {
String[] mots = {"chat", "chien", "chat", "oiseau", "chien", "chat"};
System.out.println(elementPlusFrequent(mots));
Integer[] nombres = {1, 2, 2, 3, 1, 2};
System.out.println(elementPlusFrequent(nombres));
}
}

View File

@@ -0,0 +1,20 @@
import java.util.Arrays;
import java.util.Comparator;
public class Tableaux {
public static void main(String[] args) {
System.out.println("Tous les arguments : " + Arrays.toString(args)); // On affiche tous les arguments
String[] premiers = Arrays.copyOf(args, 5);
System.out.println("Les 5 premiers : " + Arrays.toString(premiers)); // On affiche les 5 premiers arguments
Arrays.sort(args);
System.out.println("Tri alphabétique : " + Arrays.toString(args)); // On affiche les arguments triés alphabétiquement
Arrays.sort(args, Comparator.reverseOrder());
System.out.println("Tri inverse : " + Arrays.toString(args)); // On affiche les arguments triés en ordre inverse
}
}

View File

@@ -0,0 +1,19 @@
public class Fibonacci {
public Fibonacci(int val) {
form(val);
}
public int form(int val) {
if(val == 0) {
return 0;
} else if(val == 1) {
return 1;
} else {
return form(val -1) + form(val -2);
}
}
public static void main(String[] args) {
}
}

Binary file not shown.

View File

@@ -0,0 +1,23 @@
public class Appels {
public Appels(int val) {
int indentation = 0;
fact(val, indentation);
}
public int fact(int nb, int indentation) {
if(nb > 0) {
System.out.println(" ");
return nb*fact(nb-1,indentation++);
} else {
Thread.dumpStack();
return 1;
}
System.out.println(nb+"! = "+fact(nb, indentation));
}
public static void main(String[] args) {
new Appels(Integer.parseInt(args[0]));
}
}

View File

@@ -0,0 +1,5 @@
public class Tableaux {
public Tableaux() {
}
}

View File

@@ -0,0 +1,10 @@
public class Dessin extends JPanel {
public Dessin() {
}
@Override
public void paintComponent(Graphics g) {
}
}

View File

@@ -0,0 +1,23 @@
import java.awt.*;
import javax.swing.*;
public class Fenetre extends JFrame {
public Fenetre() {
super("Luminance");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(new GridBagLayout());
this.setBackgrund(Color.WHITE);
GridBagConstraints contraintes = new GridBagConstraints();
contraintes.gridx = 1;
contraintes.gridy = 1;
this.setVisible(true);
}
}

View File

@@ -0,0 +1,11 @@
import java.util.ArrayList;
public class Luminance {
private ArrayList<Color> couleurs;
private List listeDePolygones;
public Luminance() {
}
}

View File

@@ -0,0 +1,6 @@
public class Main {
public static void main(String[] args) {
Fenetre fenetre = new Fenetre();
fenetre.setVisible(true);
}
}

View File

@@ -0,0 +1,80 @@
### Cours sur la généricité en java
```java
public static Object troisieme(Object[] tab) {
return tab[2];
}
public static void main(String[] args) {
String argument = (String) troisieme(args);
...
}
```
```java
// La même fonction que la précédente
public static <T> T troisieme(T[] tab) {
return tab[2];
}
public static void main(String[] args) {
String argument = troisieme(args);
...
}
```
```java
public class Paire<E> {
private E elementUn;
private E elementDeux;
public Paire(E e1, E e2) {
this.elementUn = e1;
this.elementDeux = e2;
}
public E get(int index) throws IndexOutOfBoundsException {
if (index == 0) {
return this.elementUn;
} else if (index == 1) {
return this.elementDeux;
} else {
throw new IndexOutOfBoundsException("La valeur "+index+" n'est pas acceptable !");
}
}
}
```
```java
public class Main {
public static void main(String[] args) {
Paire<Integer> p;
p = new Paire<Integer>(12, 7);
System.out.println(p.get(1));
}
}
```
```java
//
public static void <T extends JComponent> ajouterComposants(LinkedList<T> liste, Container conteneur) {
conteneur.setLayout(new GridLayout(liste.size(), 1));
for(JComponent composant : liste) {
conteneur.add(composant);
}
}
```
```java
public static void ajouterComposants(LinkedList<? extends JComponent> liste, Container conteneur) {
conteneur.setLayout(new GridLayout(liste.size(), 1));
for(JComponent composant : liste) {
conteneur.add(composant);
}
}
```
```java
public static <T> void remplirPaire(Paire<? super T> destination, T e1, T e2) {
destination.set(0, e1);
destination.set(1, e2);
}
```

Binary file not shown.

View File

@@ -0,0 +1,41 @@
### Principe
- Une méthode récursive est une méthode qui s'appelle elle-même.
Pour entrer une récursion sans fin, on doit prévoir dans la méthode :
- Un cas récursif
- Un cas de base
- Un test pour choisir le cas basé sur les informations entrantes
Il ne peut pas y avoir de compteur car à chaque appel on refait l'initialisation (repart à 0). Si l'on veut un compteur, ça doit être un paramètre.
Typiquement, cela signifie que les arguments d'appel changent à chaque appel. Dans le cas d'un objet, on peut changer ses attributs plutôt que de changer d'objet. Attention à prendre en compte l'objet d'appel.
Ex :
```java
public static int multiply(int a, int b) {
if(a = 0) {
return 0 // cas d'arrêt
} else {
return multiply(a>>1, b<<1) + // a >> 1 : décale à droite (division par 2), b << 1 : décale à gauche (multiplication par 2)
(a&1)?b:0; // Si a est impair (a & 1 teste le bit de poids faible), on ajoute b, sinon on ajoute 0.
}
}
multiply(5,8)
|->multiply(2,16)
| |->multiply(1,32)
| | |-> multiply(0,64)
| | | |->0
|->40 |->32 |-> 32 <-|
```
Dans le cas d'une récursivité simple, on a une "phase ascendante" qui répète le code de la méthode se trouvant avant l'appel récursif, pas une exécution du cas de base, puis une phase descendante qui répète le code placé après l'appel récursif dans le sens inverse.
Ex :
```java
public static int binomial(int n, int k) {
if ((k == 0) || (k == n)) {
return 1;
} else {
return binomial(n-1,k) + binomial(n-1,k-1);
}
}
```

30
DEV.3.2/cours/3.Listes.md Normal file
View File

@@ -0,0 +1,30 @@
### Principe
Une liste est une structure de données **abstraites**.
C'est une **collection** d'éléments que l'on a ordonnés. On peut donc les numéroté et en obtenir un indice/rang, le premier élément est l'indice 0.
Les opérations basiques peuvent être :
* consulter l'élément à un indice donné
* remplacer l'élément à un indice donné
* supprimer l'élément à un indice donné
* insérer un élément à un indice donné
[!info] Il est difficile d'assurer une performance idéale pour toutes ces opérations à la fois.
Mini conclusion : les listes c'est mauvais on sait pas ce que ça donne et génère souvent une perte de performance.
### En java
L'interface [Collection](https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html) représente les collections en général. Elle hérite de l'interface [Iterable](https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html), ce qui la rend compatible avec les boucles énumératives. L'interface [List](https://docs.oracle.com/javase/8/docs/api/java/util/List.html) hérite de Collection et représente une liste.
Il y a aussi [Iterator](https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html) avec ses méthode :
* boolean hasNext : Returns `true` if the iteration has more elements.
* [E](https://docs.oracle.com/javase/8/docs/api/java/util/List.html "type parameter in List") [remove](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#remove-int-)(int index) Removes the element at the specified position in this list (optional operation).
* [add](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#add-int-E-)(int index, [E](https://docs.oracle.com/javase/8/docs/api/java/util/List.html "type parameter in List") element)Inserts the specified element at the specified position in this list (optional operation).
Parmi les classes qui réalisent List, on note [ArrayList](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html) et [LinkedList](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html)
**Codage**
Pour coder une liste avec un tableau, on fait correspondre les indices du tableau avec les indices de la liste.
Une liste n'a pas de limite avec les indices de la liste. Une liste n'a pas de limite de capacité. On peut seulement réaliser une liste **bornée**, ou prévoir un redimensionnement en cas de besoin.
Pour coder une liste avec une liste chaînée, on fait correspondre l'ordre des maillons avec l'ordre de la liste.
Les maillons nécessitent une classe séparée, qui contient typiquement des méthodes récursives. Les objets de cette classe ne doivent pas être exposés aux utilisateurs de la liste !
Quand on déclare une variable ou un attribut qui va désigner une liste, on utilise le type List et pas le type concret de l'objet. Ceci permet de préserver la capacité à changer la réalisation.

View File

@@ -1,6 +1,6 @@
# DEV Repository
Ce dépôt contient tous mes cours, TP, et contrôles machines réalisés dans le cadre de mon BUT Informatique. Les fichiers sont organisés par modules et par thématiques, comme suit :
Ce dépôt contient tous mes cours, TP, contrôles machines, et SAé réalisés dans le cadre de mon BUT Informatique. Les fichiers sont organisés par modules et par thématiques, comme suit :
## Structure du dépôt
@@ -11,6 +11,7 @@ Ce dépôt contient tous mes cours, TP, et contrôles machines réalisés dans l
- **DEV.2.2** : Travaux pratiques supplémentaires pour approfondir les concepts vus en cours.
- **DEV.2.3** : Suite des TP et projets pour renforcer les compétences en développement.
- **DEV.3.1** : Cours et TP avancés, en java alliant base de données en ligne et code.
- **DEV.3.2** : Cours et TP avancés, en java, de la générécité et des révisions avancés tel que, la récursivité, les piles et files, etc...
## Contenu par langage
@@ -21,4 +22,5 @@ Ce dépôt contient tous mes cours, TP, et contrôles machines réalisés dans l
## Auteur
Ce dépôt a été créé par Emmanuel SRIVASTAVA-TIAMZON dans le cadre du BUT Informatique.
Ce dépôt a été créé par Emmanuel SRIVASTAVA-TIAMZON dans le cadre du BUT Informatique.
Certaine SAé ont été faite avec la collaboration de Wael ATIK.

48
SAE11_2024/Makefile Normal file
View File

@@ -0,0 +1,48 @@
### VARIABLES ###
CC = gcc
CFLAGS = -Wall \
-ansi \
-pedantic
LIBS = -lgraph
EXE = exe
OFILES = main.o \
graphique.o \
jeu.o \
utilitaires.o \
### BUT PAR DEFAUT ###
but : ${EXE}
### REGLES ESSENTIELLES ###
${EXE} : ${OFILES}
$(CC) $(CFLAGS) -o ${EXE} ${OFILES} ${LIBS}
main.o : graphique.h jeu.h utilitaires.h
jeu.o : jeu.h utilitaires.h graphique.h
graphique.o : graphique.h
utilitaires.o : utilitaires.h
### REGLES OPTIONNELLES ###
run : but
./${EXE}
clean :
-rm -f ${OFILES} ${EXE}
mrproper : clean but
### BUTS FACTICES ###
.PHONY : but clean mrproper
### FIN ###

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
SAE11_2024/Pionb_50x50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
SAE11_2024/Pionc_50x50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

59
SAE11_2024/README.md Normal file
View File

@@ -0,0 +1,59 @@
# Jeu de Placement et de Blocage (Grille Dynamique)
## **Description du projet**
Ce programme est un jeu stratégique basé sur une grille dynamique où deux joueurs (ou un joueur contre une IA) placent des pions et des croix pour bloquer leur adversaire.
Il intègre une interface graphique interactive, des règles simples, et une logique modulaire pour faciliter l'extension et l'amélioration.
---
## **Fonctionnalités principales**
- **Menu graphique interactif** :
- Sélection de la taille de la grille (3x3 à 9x9).
- Choix entre deux modes de jeu : 1 joueur contre IA ou 2 joueurs.
- Bouton "Confirmer" pour valider les choix et démarrer la partie.
- **Affichage dynamique de la grille** :
- La grille est centrée automatiquement et sadapte à la taille choisie.
- Les cellules sont bien délimitées et interactives.
- **Modes de jeu** :
- **Mode 2 joueurs** : Deux joueurs humains jouent à tour de rôle.
- **Mode 1 joueur** : Le joueur affronte une IA avec des placements stratégiques.
- **Conditions de fin** :
- Un joueur est bloqué : lautre gagne.
- La grille est pleine : le joueur ayant placé le dernier pion gagne.
- **Menu de fin** :
- Affiche le gagnant avec un message coloré.
- Boutons "Quitter" pour fermer le programme et "Rejouer" pour recommencer une partie.
---
## **Structure du projet**
Le code est organisé en plusieurs fichiers pour assurer modularité et lisibilité :
- **`main.c`** : Point dentrée du programme. Initialise les ressources et orchestre les appels aux fonctions principales.
- **`graphique.c`** :
- Gestion de linterface graphique (menus, affichage de la grille, pions et croix).
- **`jeu.c`** :
- Logique du jeu : alternance des tours, placement des pions et croix, gestion des conditions de fin.
- **`utilitaires.c`** :
- Fonctions génériques (vérification des déplacements, détection de blocage, etc.).
---
## **Dépendances**
Le programme utilise la bibliothèque graphique **`graph.h`**. Assurez-vous quelle est installée avant de compiler.
### **Prérequis :**
1. Un environnement Linux ou compatible avec **`graph.h`**.
2. Un compilateur C (comme `gcc`).
3. Assurez vous d'avoir tout les fichiers .c et .h et Makefile et tout image .png dans un seul et même dossier
---
## **Compilation et exécution**
1. **Compiler le programme :**
make run
ou si vous ne souhaitez pas utiliser le Makefile même s'il est la pour simplifier :
gcc main.c graphique.c jeu.c utilitaires.c -o jeu -lgraph ; ./jeu

12835
SAE11_2024/Rapport blokus.pdf Normal file

File diff suppressed because it is too large Load Diff

BIN
SAE11_2024/croixb4x4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
SAE11_2024/croixo4x4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

235
SAE11_2024/graphique.c Normal file
View File

@@ -0,0 +1,235 @@
#include <stdlib.h>
#include <graph.h>
#include "graphique.h"
#include "jeu.h"
/* Afficher un pion */
void AfficherPion(int x, int y, int pion) {
AfficherSprite(pion, x, y);
}
//
/* Afficher une croix */
void AfficherCroix(int x, int y, int croix) {
AfficherSprite(croix, x, y);
}
/* Redessiner une case */
void RedessinerCase(int caseX, int caseY, int largeur_case, int offset_x, int offset_y) {
int x = offset_x + caseX * largeur_case;
int y = offset_y + caseY * largeur_case;
ChoisirCouleurDessin(CouleurParComposante(255, 255, 255));
RemplirRectangle(x, y, largeur_case, largeur_case);
ChoisirCouleurDessin(CouleurParComposante(0, 0, 0));
DessinerRectangle(x, y, largeur_case, largeur_case);
}
void MenuGraphique(int *taille_grille, int *nombre_joueurs) {
int i;
couleur grisClair = CouleurParComposante(255, 255, 255);
couleur noir = CouleurParComposante(0, 0, 0);
couleur orange = CouleurParComposante(250, 143, 2);
couleur cyan = CouleurParComposante(2, 183, 219);
int pion_bleu, pion_orange, croix_bleu, croix_orange; /* Déclarer les variables pour les sprites*/
EffacerEcran(grisClair);
Bouton boutonsGrille[] = {
{150, 70, 70, 50, "3x3", noir}, {250, 70, 70, 50, "4x4", noir},
{350, 70, 70, 50, "5x5", noir}, {450, 70, 70, 50, "6x6", noir},
{550, 70, 70, 50, "7x7", noir}, {650, 70, 70, 50, "8x8", noir},
{750, 70, 70, 50, "9x9", noir}
};
Bouton bouton1J = {440, 240, 50, 50, "IA", cyan};
Bouton bouton2J = {520, 240, 50, 50, "2J", orange};
Bouton confirmer = {430, 400, 120, 50, "Confirmer?", noir};
EcrireTexte(300, 50, "Veuillez choisir la taille de la grille : ", 1);
for (i = 0; i < 7; i++) {
DessinerBouton(boutonsGrille[i]);
}
EcrireTexte(230, 200, "Voulez-vous demarrer une partie a un ou deux joueurs?", 1);
DessinerBouton(bouton1J);
DessinerBouton(bouton2J);
int choix_grille_precedent = -1;
int choix_mode_precedent = -1;
while (1) {
if (SourisCliquee()) {
SourisPosition();
int x = _X, y = _Y;
for (i = 0; i < 7; i++) {
if (EstClique(boutonsGrille[i], x, y)) {
*taille_grille = i + 3;
if (choix_grille_precedent != -1) {
Bouton bouton_precedent = boutonsGrille[choix_grille_precedent];
ChoisirCouleurDessin(grisClair);
RemplirRectangle(bouton_precedent.x, bouton_precedent.y, bouton_precedent.largeur, bouton_precedent.hauteur);
DessinerBouton(bouton_precedent);
}
ChoisirCouleurDessin(noir);
RemplirRectangle(boutonsGrille[i].x, boutonsGrille[i].y, boutonsGrille[i].largeur, boutonsGrille[i].hauteur);
DessinerBouton(boutonsGrille[i]);
choix_grille_precedent = i;
EcrireTexte(360, 330, "Taille de grille selectionnee", 1);
break;
}
}
if (EstClique(bouton1J, x, y)) {
*nombre_joueurs = 1;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(340, 350, 200, 40);
if (choix_mode_precedent == 2) {
ChoisirCouleurDessin(grisClair);
RemplirRectangle(bouton2J.x, bouton2J.y, bouton2J.largeur, bouton2J.hauteur);
DessinerBouton(bouton2J);
}
ChoisirCouleurDessin(cyan);
RemplirRectangle(bouton1J.x, bouton1J.y, bouton1J.largeur, bouton1J.hauteur);
DessinerBouton(bouton1J);
choix_mode_precedent = 1;
EcrireTexte(360, 370, "Mode 1 joueur selectionne", 1);
} else if (EstClique(bouton2J, x, y)) {
*nombre_joueurs = 2;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(340, 350, 200, 40);
if (choix_mode_precedent == 1) {
ChoisirCouleurDessin(grisClair);
RemplirRectangle(bouton1J.x, bouton1J.y, bouton1J.largeur, bouton1J.hauteur);
DessinerBouton(bouton1J);
}
ChoisirCouleurDessin(orange);
RemplirRectangle(bouton2J.x, bouton2J.y, bouton2J.largeur, bouton2J.hauteur);
DessinerBouton(bouton2J);
choix_mode_precedent = 2;
EcrireTexte(360, 370, "Mode 2 joueur selectionne", 1);
}
if (*taille_grille > 0 && *nombre_joueurs > 0) {
DessinerBouton(confirmer);
if (EstClique(confirmer, x, y)) {
return;
}
}
}
}
}
/* Fonction pour réinitialiser la grille */
void ReinitialiserGrille(int grille[][9], int taille_grille) {
int i, j;
for (i = 0; i < taille_grille; i++) {
for (j = 0; j < taille_grille; j++) {
grille[i][j] = 0;
}
}
}
/* Menu de fin */
void MenuFin(int gagnant, int grille[][9], int taille_grille, int pion_bleu, int pion_orange,
int croix_bleu, int croix_orange) {
int x, y;
EffacerEcran(CouleurParComposante(255, 255, 255));
/* Affichage du message de fin */
if (gagnant == 1) {
ChoisirCouleurDessin(CouleurParComposante(2, 183, 219));
EcrireTexte(400, 300, "Le joueur bleu a gagne !", 1);
ChoisirCouleurDessin(CouleurParComposante(250, 143, 2));
EcrireTexte(400, 350, "Le joueur orange a perdu.", 1);
} else if (gagnant == 2) {
ChoisirCouleurDessin(CouleurParComposante(250, 143, 2));
EcrireTexte(400, 300, "Le joueur orange a gagne !", 1);
ChoisirCouleurDessin(CouleurParComposante(2, 183, 219));
EcrireTexte(400, 350, "Le joueur bleu a perdu.", 1);
}
/* Définition des boutons */
Bouton quitter = {430, 380, 120, 40, "Quitter ?"};
Bouton recommencer = {410, 460, 160, 40, "Recommencer ?"};
/* Dessiner les boutons */
DessinerBouton(quitter);
DessinerBouton(recommencer);
while (1) {
if (SourisCliquee()) {
SourisPosition();
x = _X;
y = _Y;
/* Vérifier si le clic est sur le bouton "Quitter" */
if (EstClique(quitter, x, y)) {
FermerGraphique();
return;
}
/* Vérifier si le clic est sur le bouton "Recommencer" */
else if (EstClique(recommencer, x, y)) {
int taille_grille = 0;
int nombre_joueurs = 0;
debutJeu(grille, taille_grille, nombre_joueurs, pion_bleu, pion_orange, croix_bleu, croix_orange);
/* Réinitialiser la grille */
ReinitialiserGrille(grille, taille_grille);
/* Relancer le jeu */
debutJeu(grille, taille_grille,nombre_joueurs, pion_bleu, pion_orange, croix_bleu, croix_orange);
return;
}
}
}
}
/* Dessiner un bouton */
void DessinerBouton(Bouton bouton) {
ChoisirCouleurDessin(bouton.couleurTexte);
DessinerRectangle(bouton.x, bouton.y, bouton.largeur, bouton.hauteur);
EcrireTexte(bouton.x + 10, bouton.y + bouton.hauteur / 2 + 5, bouton.texte, 1);
}
/* Vérifier si un bouton a été cliqué */
int EstClique(Bouton bouton, int x, int y) {
return (x >= bouton.x && x <= bouton.x + bouton.largeur && y >= bouton.y && y <= bouton.y + bouton.hauteur);
}
/* Afficher la grille */
void AfficherGrille(int taille_grille, int largeur_case, int offset_x, int offset_y) {
int i, j;
for (i = 0; i < taille_grille; i++) {
for (j = 0; j < taille_grille; j++) {
int x = offset_x + j * largeur_case;
int y = offset_y + i * largeur_case;
DessinerRectangle(x, y, largeur_case, largeur_case);
}
}
}

23
SAE11_2024/graphique.h Normal file
View File

@@ -0,0 +1,23 @@
#ifndef GRAPHIQUE_H
#define GRAPHIQUE_H
typedef struct {
int x, y;
int largeur, hauteur;
char texte[20];
couleur couleurTexte;
} Bouton;
void AfficherPion(int x, int y, int pion);
void AfficherCroix(int x, int y, int croix);
void RedessinerCase(int caseX, int caseY, int largeur_case, int offset_x, int offset_y);
void MenuGraphique(int *taille_grille, int *nombre_joueurs);
void MenuFin(int gagnant, int grille[][9], int taille_grille, int pion_bleu, int pion_orange,
int croix_bleu, int croix_orange);
void ReinitialiserGrille(int grille[][9], int taille_grille);
void DessinerBouton(Bouton bouton);
int EstClique(Bouton bouton, int x, int y);
void AfficherGrille(int taille_grille, int largeur_case, int offset_x, int offset_y);
#endif /* GRAPHIQUE_H */

365
SAE11_2024/jeu.c Normal file
View File

@@ -0,0 +1,365 @@
#include <stdlib.h>
#include <graph.h>
#include "jeu.h"
#include "utilitaires.h"
#include "graphique.h"
void GestionJeu(int grille[][9], int taille_grille, int pion_bleu, int pion_orange, int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange, int nombre_joueurs) {
int x, y, caseX, caseY, tour = 0, etat = 0; /* 0 = placement du pion, 1 = placement de la croix */
int dernierXBleu = -1, dernierYBleu = -1;
int dernierXOrange = -1, dernierYOrange = -1;
couleur grisClair = CouleurParComposante(255, 255, 255);
couleur noir = CouleurParComposante(0, 0, 0);
couleur bleu = CouleurParComposante(2, 183, 219);
couleur orange = CouleurParComposante(250, 143, 2);
int xTexte = 380, yTexte = 560, largeurTexte = 480, hauteurTexte = 25; /* Position et taille de la zone texte*/
while (1) {
/* Choisir la couleur du texte et afficher le texte approprié*/
if (etat == 0) { /*Placement du pion*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu", 1);
}
} else { /* Placement de la croix*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange de placer la croix", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu de placer la croix", 1);
}
}
/* Gestion des clics de la souris*/
if (SourisCliquee()) {
SourisPosition();
x = _X;
y = _Y;
/* Calcul des indices de la case cliquée*/
caseX = (x - offset_x) / largeur_case;
caseY = (y - offset_y) / largeur_case;
/* Vérification si les coordonnées de la case sont valides*/
if (caseX >= 0 && caseX < taille_grille && caseY >= 0 && caseY < taille_grille) {
if (etat == 0) { /*Placement du pion*/
int dernierX = (tour % 2 == 0) ? dernierXBleu : dernierXOrange;
int dernierY = (tour % 2 == 0) ? dernierYBleu : dernierYOrange;
if (grille[caseY][caseX] == 0 && /* Case vide */
((dernierX == -1 && dernierY == -1) || /* Premier placement */
DeplacementValide(dernierX, dernierY, caseX, caseY))) {
/*Effacer la dernière position du pion*/
if (dernierX != -1 && dernierY != -1) {
grille[dernierY][dernierX] = 0;
RedessinerCase(dernierX, dernierY, largeur_case, offset_x, offset_y);
}
/* Affichage du nouveau pion*/
int pion = (tour % 2 == 0) ? pion_bleu : pion_orange;
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /*Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion);
/*Mise à jour de la grille*/
grille[caseY][caseX] = (tour % 2 == 0) ? 1 : 2;
/* Mise à jour des coordonnées du dernier pion*/
if (tour % 2 == 0) {
dernierXBleu = caseX;
dernierYBleu = caseY;
} else {
dernierXOrange = caseX;
dernierYOrange = caseY;
}
etat = 1; /* Passage à l'état de placement de la croix*/
}
} else if (etat == 1) { /* Placement de la croix*/
if (grille[caseY][caseX] == 0) { /*La case est vide*/
/* Ajout de la croix à la grille*/
grille[caseY][caseX] = (tour % 2 == 0) ? 3 : 4;
/*Affichage de la croix*/
int croix_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2;
int croix = (tour % 2 == 0) ? croix_bleu : croix_orange;
AfficherCroix(croix_x, croix_y, croix);
/*Passage au prochain tour*/
tour++;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /*Zone d'effacement du texte*/
etat = 0;
/*Vérification des conditions de blocage*/
if (tour >= 2) {
if (EstBloque(grille, taille_grille, dernierXBleu, dernierYBleu)) {
MenuFin(2, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
} else if (EstBloque(grille, taille_grille, dernierXOrange, dernierYOrange)) {
MenuFin(1, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
}
}
}
}
}
}
/* Vérification de la fin de la partie*/
if (EstGrillePleine(grille, taille_grille)) {
int gagnant = (tour % 2 == 0) ? 2 : 1;
MenuFin(gagnant, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
}
}
}
void GestionJeuIA(int grille[][9], int taille_grille, int pion_bleu, int pion_orange, int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange) {
int x, y, caseX, caseY, tour = 0, etat = 0; /* 0 = placement du pion, 1 = placement de la croix */
int dernierXBleu = -1, dernierYBleu = -1;
int dernierXOrange = -1, dernierYOrange = -1;
int xTexte = 380, yTexte = 560, largeurTexte = 500, hauteurTexte = 25; /* Position et taille de la zone texte*/
couleur grisClair = CouleurParComposante(255, 255, 255);
couleur noir = CouleurParComposante(0, 0, 0);
couleur bleu = CouleurParComposante(2, 183, 219);
couleur orange = CouleurParComposante(250, 143, 2);
while (1) {
/* Choisir la couleur du texte et afficher le texte approprié*/
if (etat == 0) { /* Placement du pion*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu", 1);
}
} else { /* Placement de la croix*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange de placer la croix", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu de placer la croix", 1);
}
}
if (tour % 2 == 0) {
/* Tour du joueur humain (bleu) */
if (SourisCliquee()) {
SourisPosition();
x = _X;
y = _Y;
/* Calcul des indices de la case cliquée */
caseX = (x - offset_x) / largeur_case;
caseY = (y - offset_y) / largeur_case;
/* Vérification si les coordonnées de la case sont valides */
if (caseX >= 0 && caseX < taille_grille && caseY >= 0 && caseY < taille_grille) {
if (etat == 0 && grille[caseY][caseX] == 0 &&
(dernierXBleu == -1 || DeplacementValide(dernierXBleu, dernierYBleu, caseX, caseY))) {
/* Effacer la dernière position du pion */
if (dernierXBleu != -1 && dernierYBleu != -1) {
grille[dernierYBleu][dernierXBleu] = 0;
RedessinerCase(dernierXBleu, dernierYBleu, largeur_case, offset_x, offset_y);
}
/* Affichage du pion bleu */
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /* Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion_bleu);
/* Mise à jour de la grille */
grille[caseY][caseX] = 1;
dernierXBleu = caseX;
dernierYBleu = caseY;
etat = 1; /* Passage à l'état de placement de la croix */
} else if (etat == 1 && grille[caseY][caseX] == 0) {
/* Placement de la croix */
int croix_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2;
AfficherCroix(croix_x, croix_y, croix_bleu);
grille[caseY][caseX] = 3;
tour++;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /*Zone d'effacement du texte*/
etat = 0;
}
}
}
} else {
/* Tour de l'IA (orange) */
int pionX, pionY, croixX, croixY;
/* Placer le pion de l'IA dans une zone valide */
do {
pionX = rand() % taille_grille;
pionY = rand() % taille_grille;
/* Vérifier si la case est vide et si le déplacement est valide par rapport au dernier pion */
} while (grille[pionY][pionX] != 0 ||
(dernierXOrange != -1 && dernierYOrange != -1 && !DeplacementValide(dernierXOrange, dernierYOrange, pionX, pionY)));
if (dernierXOrange != -1 && dernierYOrange != -1) {
/* Effacer la dernière position du pion de l'IA */
grille[dernierYOrange][dernierXOrange] = 0;
RedessinerCase(dernierXOrange, dernierYOrange, largeur_case, offset_x, offset_y);
}
/* Affichage du pion orange */
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /* Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + pionX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + pionY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion_orange);
/* Mise à jour de la grille */
grille[pionY][pionX] = 2;
dernierXOrange = pionX;
dernierYOrange = pionY;
/* Attente avant de placer la croix de l'IA */
Delai(500);
/* Placer la croix de l'IA */
do {
croixX = rand() % taille_grille;
croixY = rand() % taille_grille;
} while (grille[croixY][croixX] != 0 || (croixX == pionX && croixY == pionY)); /* Éviter de placer la croix sur le pion */
/* Affichage de la croix orange */
int croix_x = offset_x + croixX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + croixY * largeur_case + (largeur_case - 50) / 2;
AfficherCroix(croix_x, croix_y, croix_orange);
/* Mise à jour de la grille */
grille[croixY][croixX] = 4;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /* Zone d'effacement du texte*/
tour++;
}
/* Vérification des conditions de fin de jeu après chaque tour */
if (tour >= 2) {
if (EstBloque(grille, taille_grille, dernierXBleu, dernierYBleu)) {
MenuFin(2, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu, l'IA a gagné */
return;
} else if (EstBloque(grille, taille_grille, dernierXOrange, dernierYOrange)) {
MenuFin(1, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu, le joueur humain a gagné */
return;
}
}
/* Vérification de la fin de la partie si la grille est pleine */
if (EstGrillePleine(grille, taille_grille)) {
int gagnant = (tour % 2 == 0) ? 2 : 1; /* L'IA ou le joueur humain a gagné */
MenuFin(gagnant, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu */
return; /* Fin du jeu */
}
}
}
void debutJeu(int grille[][9], int taille_grille, int nombre_joueurs, int pion_bleu, int pion_orange, int croix_bleu, int croix_orange) {
couleur grisClair = CouleurParComposante(255, 255, 255);
/* Afficher le menu graphique pour la sélection */
MenuGraphique(&taille_grille, &nombre_joueurs);
/* Si les valeurs sont correctement définies, démarrer la partie */
if (taille_grille > 0 && nombre_joueurs > 0) {
int largeur_case = 500 / taille_grille; /* Calcul de la largeur d'une case */
int offset_x = (1000 - taille_grille * largeur_case) / 2;
int offset_y = (600 - taille_grille * largeur_case) / 2;
if (taille_grille <= 4) {
pion_bleu = ChargerSprite("Pionb_100x100.png");
pion_orange = ChargerSprite("Pionc_100x100.png");
} else {
pion_bleu = ChargerSprite("Pionb_50x50.png");
pion_orange = ChargerSprite("Pionc_50x50.png");
}
EffacerEcran(CouleurParComposante(255,255,255));
AfficherGrille(taille_grille, largeur_case, offset_x, offset_y);
ReinitialiserGrille(grille, taille_grille);
/* Lancer la gestion du jeu */
if (nombre_joueurs == 1) {
GestionJeuIA(grille, taille_grille, pion_bleu, pion_orange, largeur_case, offset_x, offset_y, croix_bleu, croix_orange);
LibererSprite(pion_bleu);
LibererSprite(pion_orange);
LibererSprite(croix_bleu);
LibererSprite(croix_orange);
} else {
GestionJeu(grille, taille_grille, pion_bleu, pion_orange, largeur_case, offset_x, offset_y, croix_bleu, croix_orange, nombre_joueurs);
LibererSprite(pion_bleu);
LibererSprite(pion_orange);
LibererSprite(croix_bleu);
LibererSprite(croix_orange);
}
}
}

13
SAE11_2024/jeu.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef JEU_H
#define JEU_H
/* Déclarations des fonctions */
void GestionJeu(int grille[][9], int taille_grille, int pion_bleu, int pion_orange,
int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange, int nombre_joueurs);
void GestionJeuIA(int grille[][9], int taille_grille, int pion_bleu, int pion_orange,
int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange);
void debutJeu(int grille[][9], int taille_grille, int nombre_joueurs, int pion_bleu, int pion_orange,
int croix_bleu, int croix_orange);
#endif /* JEU_H */

35
SAE11_2024/main.c Normal file
View File

@@ -0,0 +1,35 @@
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <graph.h>
#include "graphique.h"
#include "jeu.h"
#include "utilitaires.h"
int main() {
InitialiserGraphique();
CreerFenetre(10, 10, 1000, 600);
couleur grisClair = CouleurParComposante(255, 255, 255);
EffacerEcran(grisClair);
int pion_bleu = ChargerSprite("Pionb_50x50.png");
int pion_orange = ChargerSprite("Pionc_50x50.png");
int croix_bleu = ChargerSprite("croixb4x4.png");
int croix_orange = ChargerSprite("croixo4x4.png");
int taille_grille = 0, nombre_joueurs = 0;
int grille[9][9] = {0};
/* Démarrage du jeu */
debutJeu(grille,taille_grille,nombre_joueurs,pion_bleu,pion_orange,croix_bleu,croix_orange);
/* Libérer les ressources avant de fermer */
LibererSprite(pion_bleu);
LibererSprite(pion_orange);
LibererSprite(croix_bleu);
LibererSprite(croix_orange);
Touche();
FermerGraphique();
return EXIT_SUCCESS;
}

79
SAE11_2024/utilitaires.c Normal file
View File

@@ -0,0 +1,79 @@
#include <stdlib.h>
#include <graph.h>
#include <time.h>
#include "utilitaires.h"
#include "jeu.h"
#include "graphique.h"
void Delai(int duree_ms) {
/* La duree est en millisecondes. Le principe est d'effectuer une boucle vide. */
long fin = clock() + duree_ms * CLOCKS_PER_SEC / 1000; /* Convertir la duree en unites de clock() */
while (clock() < fin) {
/* Rien à faire ici, juste attendre */
}
}
int EstBloque(int grille[][9], int taille_grille, int caseX, int caseY) {
int i;
int directions[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
for (i = 0; i < 8; i++) {
int dirX = caseX + directions[i][0];
int dirY = caseY + directions[i][1];
if (dirX >= 0 && dirX < taille_grille && dirY >= 0 && dirY < taille_grille) {
if (grille[dirY][dirX] == 0) {
return 0;
}
}
}
return 1;
}
int EstGrillePleine(int grille[][9], int taille_grille) {
int i,j;
for ( i = 0; i < taille_grille; i++) {
for (j = 0; j < taille_grille; j++) {
if (grille[i][j] == 0) {
/* Si une case est vide, la grille n'est pas pleine */
return 0;
}
}
}
return 1; /* La grille est pleine */
}
/* Fonction pour verifier si le deplacement est valide (pas plus de 1 case) */
int DeplacementValide(int caseXActuelle, int caseYActuelle, int caseXCible, int caseYCible) {
return (abs(caseXActuelle - caseXCible) <= 1) && (abs(caseYActuelle - caseYCible) <= 1);
}

8
SAE11_2024/utilitaires.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef UTILITAIRES_H
#define UTILITAIRES_H
void Delai(int duree_ms);
int EstBloque(int grille[][9], int taille_grille, int caseX, int caseY);
int EstGrillePleine(int grille[][9], int taille_grille);
int DeplacementValide(int caseXActuelle, int caseYActuelle, int caseXCible, int caseYCible);
#endif /*UTILITAIRES_H*/

View File

@@ -0,0 +1,25 @@
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(1) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(2) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(3) The contribution was provided directly to me by some other
person who certified (1), (2) or (3) and I have not modified
it.
(4) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.

View File

@@ -0,0 +1,20 @@
# Application WEB SAE S2.02 : Application de critique de séries.
## Description du projet
Le projet utilise une base de données de données de séries (créée par Jérôme Cutrona). Il consiste à écrire une application web qui permet :
- la consultation/recherche d'informations contenues dans la bd (series, saisons, épisodes, critiques),
- la possibilité de laisser des critiques/notes pour une série.
---
## Auteurs
Ce projet a été réalisé dans le cadre d'une situation d'apprentissage et d'évaluation au sein de la formation de BUT informatique à Fontainebleau avec comme auteurs :
Wael ATIK et Emmanuel TIAMZON.
---
## Remarque
Ce projet nest pas destiné à un usage commercial. Il a été créé dans un but dapprentissage uniquement.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
<IfModule authz_core_module>
Require all denied
</IfModule>
<IfModule !authz_core_module>
Deny from all
</IfModule>

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View File

@@ -0,0 +1,137 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| AUTO-LOADER
| -------------------------------------------------------------------
| This file specifies which systems should be loaded by default.
|
| In order to keep the framework as light-weight as possible only the
| absolute minimal resources are loaded by default. For example,
| the database is not connected to automatically since no assumption
| is made regarding whether you intend to use it. This file lets
| you globally define which systems you would like loaded with every
| request.
|
| -------------------------------------------------------------------
| Instructions
| -------------------------------------------------------------------
|
| These are the things you can load automatically:
|
| 1. Packages
| 2. Libraries
| 3. Drivers
| 4. Helper files
| 5. Custom config files
| 6. Language files
| 7. Models
|
*/
/*
| -------------------------------------------------------------------
| Auto-load Packages
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
*/
$autoload['packages'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array('database', 'session');
/*
| -------------------------------------------------------------------
| Auto-load Drivers
| -------------------------------------------------------------------
| These classes are located in system/libraries/ or in your
| application/libraries/ directory, but are also placed inside their
| own subdirectory and they extend the CI_Driver_Library class. They
| offer multiple interchangeable driver options.
|
| Prototype:
|
| $autoload['drivers'] = array('cache');
|
| You can also supply an alternative property name to be assigned in
| the controller:
|
| $autoload['drivers'] = array('cache' => 'cch');
|
*/
$autoload['drivers'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('url', 'html');
/*
| -------------------------------------------------------------------
| Auto-load Config files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['config'] = array('config1', 'config2');
|
| NOTE: This item is intended for use ONLY if you have created custom
| config files. Otherwise, leave it blank.
|
*/
$autoload['config'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Language files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['language'] = array('lang1', 'lang2');
|
| NOTE: Do not include the "_lang" part of your file. For example
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array();

View File

@@ -0,0 +1,475 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
| http://example.com/
|
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try to guess the protocol and
| path to your installation, but due to security concerns the hostname will
| be set to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
$config['base_url'] = '/~srivasta/SAE2.02_Application_WEB/';
/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';
/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string. The default setting of 'REQUEST_URI' works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'REQUEST_URI' Uses $_SERVER['REQUEST_URI']
| 'QUERY_STRING' Uses $_SERVER['QUERY_STRING']
| 'PATH_INFO' Uses $_SERVER['PATH_INFO']
|
| WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
*/
$config['uri_protocol'] = 'REQUEST_URI';
/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| https://codeigniter.com/userguide3/general/urls.html
|
| Note: This option is ignored for CLI requests.
*/
$config['url_suffix'] = '';
/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
$config['language'] = 'english';
/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
| See https://secure.php.net/htmlspecialchars for a list of supported charsets.
|
*/
$config['charset'] = 'UTF-8';
/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the 'hooks' feature you must enable it by
| setting this variable to TRUE (boolean). See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;
/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries. For more information please see the user guide:
|
| https://codeigniter.com/userguide3/general/core_classes.html
| https://codeigniter.com/userguide3/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';
/*
|--------------------------------------------------------------------------
| Composer auto-loading
|--------------------------------------------------------------------------
|
| Enabling this setting will tell CodeIgniter to look for a Composer
| package auto-loader script in application/vendor/autoload.php.
|
| $config['composer_autoload'] = TRUE;
|
| Or if you have your vendor/ directory located somewhere else, you
| can opt to set a specific path as well:
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| For more information about Composer, please visit https://getcomposer.org/
|
| Note: This will NOT disable or override the CodeIgniter-specific
| autoloading (application/config/autoload.php)
*/
$config['composer_autoload'] = FALSE;
/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| The configured value is actually a regular expression character group
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
| Note: This option is ignored for CLI requests.
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string 'words' that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';
/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| You can also pass an array with threshold levels to show individual error types
|
| array(2) = Debug Messages, without Error Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 0;
/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/logs/ directory. Use a full server path.
|
*/
$config['log_path'] = '';
/*
|--------------------------------------------------------------------------
| Error Logging FILENAME
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| 'log-'.date('Y-m-d').'.php'. No DIRECTORY_SEPARATOR(s), just the filename.
|
*/
$config['log_filename'] = '';
/*
|--------------------------------------------------------------------------
| Log File Permissions
|--------------------------------------------------------------------------
|
| The file system permissions to be applied on newly created log files.
|
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
| integer notation (i.e. 0700, 0644, etc.)
*/
$config['log_file_permissions'] = 0644;
/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';
/*
|--------------------------------------------------------------------------
| Error Views Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/views/errors/ directory. Use a full server path.
|
*/
$config['error_views_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/cache/ directory. Use a full server path.
|
*/
$config['cache_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Include Query String
|--------------------------------------------------------------------------
|
| Whether to take the URL query string into consideration when generating
| output cache files. Valid options are:
|
| FALSE = Disabled
| TRUE = Enabled, take all query parameters into account.
| Please be aware that this may result in numerous cache
| files generated for the same page over and over again.
| array('q') = Enabled, but only take into account the specified list
| of query parameters.
|
*/
$config['cache_query_string'] = FALSE;
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class, you must set an encryption key.
| See the user guide for more info.
|
| https://codeigniter.com/userguide3/libraries/encryption.html
|
*/
$config['encryption_key'] = '';
/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_driver'
|
| The storage driver to use: files, database, redis, memcached
|
| 'sess_cookie_name'
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
| 'sess_samesite'
|
| Session cookie SameSite attribute: Lax (default), Strict or None
|
| 'sess_expiration'
|
| The number of SECONDS you want the session to last.
| Setting to 0 (zero) means expire when the browser is closed.
|
| 'sess_save_path'
|
| The location to save sessions to, driver dependent.
|
| For the 'files' driver, it's a path to a writable directory.
| WARNING: Only absolute paths are supported!
|
| For the 'database' driver, it's a table name.
| Please read up the manual for the format with other session drivers.
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
| 'sess_match_ip'
|
| Whether to match the user's IP address when reading the session data.
|
| WARNING: If you're using the database driver, don't forget to update
| your session table's PRIMARY KEY when changing this setting.
|
| 'sess_time_to_update'
|
| How many seconds between CI regenerating the session ID.
|
| 'sess_regenerate_destroy'
|
| Whether to destroy session data associated with the old session ID
| when auto-regenerating the session ID. When set to FALSE, the data
| will be later deleted by the garbage collector.
|
| Other session cookie settings are shared with the rest of the application,
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
*/
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_samesite'] = 'Lax';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = sys_get_temp_dir();
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path' = Typically will be a forward slash
| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists.
| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)
| 'cookie_samesite' = Cookie's samesite attribute (Lax, Strict or None)
|
| Note: These settings (with the exception of 'cookie_prefix' and
| 'cookie_httponly') will also affect sessions.
|
*/
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['cookie_samesite'] = 'Lax';
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads. When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| Only used if zlib.output_compression is turned off in your php.ini.
| Please do not use it together with httpd-level output compression.
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts. For
| compression to work, nothing can be sent before the output buffer is called
| by the output class. Do not 'echo' any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;
/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are 'local' or any PHP supported timezone. This preference tells
| the system whether to use your server's local time as the master 'now'
| reference, or convert it to the configured one timezone. See the 'date
| helper' page of the user guide for information regarding date handling.
|
*/
$config['time_reference'] = 'local';
/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy
| IP addresses from which CodeIgniter should trust headers such as
| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
| the visitor's IP address.
|
| You can use both an array or a comma-separated list of proxy addresses,
| as well as specifying whole subnets. Here are a few examples:
|
| Comma-separated: '10.0.1.200,192.168.5.0/24'
| Array: array('10.0.1.200', '192.168.5.0/24')
*/
$config['proxy_ips'] = '';

View File

@@ -0,0 +1,85 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Display Debug backtrace
|--------------------------------------------------------------------------
|
| If set to TRUE, a backtrace will be displayed along with php errors. If
| error_reporting is disabled, the backtrace will not display, regardless
| of this setting
|
*/
defined('SHOW_DEBUG_BACKTRACE') OR define('SHOW_DEBUG_BACKTRACE', TRUE);
/*
|--------------------------------------------------------------------------
| File and Directory Modes
|--------------------------------------------------------------------------
|
| These prefs are used when checking and setting modes when working
| with the file system. The defaults are fine on servers with proper
| security, but you may wish (or even need) to change the values in
| certain environments (Apache running a separate process for each
| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
| always be used to set the mode correctly.
|
*/
defined('FILE_READ_MODE') OR define('FILE_READ_MODE', 0644);
defined('FILE_WRITE_MODE') OR define('FILE_WRITE_MODE', 0666);
defined('DIR_READ_MODE') OR define('DIR_READ_MODE', 0755);
defined('DIR_WRITE_MODE') OR define('DIR_WRITE_MODE', 0755);
/*
|--------------------------------------------------------------------------
| File Stream Modes
|--------------------------------------------------------------------------
|
| These modes are used when working with fopen()/popen()
|
*/
defined('FOPEN_READ') OR define('FOPEN_READ', 'rb');
defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b');
defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab');
defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b');
defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb');
defined('FOPEN_READ_WRITE_CREATE_STRICT') OR define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
/*
|--------------------------------------------------------------------------
| Exit Status Codes
|--------------------------------------------------------------------------
|
| Used to indicate the conditions under which the script is exit()ing.
| While there is no universal standard for error codes, there are some
| broad conventions. Three such conventions are mentioned below, for
| those who wish to make use of them. The CodeIgniter defaults were
| chosen for the least overlap with these conventions, while still
| leaving room for others to be defined in future versions and user
| applications.
|
| The three main conventions used for determining exit status codes
| are as follows:
|
| Standard C/C++ Library (stdlibc):
| https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
| (This link also contains other GNU-specific conventions)
| BSD sysexits.h:
| https://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
| Bash scripting:
| http://tldp.org/LDP/abs/html/exitcodes.html
|
*/
defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors
defined('EXIT_ERROR') OR define('EXIT_ERROR', 1); // generic error
defined('EXIT_CONFIG') OR define('EXIT_CONFIG', 3); // configuration error
defined('EXIT_UNKNOWN_FILE') OR define('EXIT_UNKNOWN_FILE', 4); // file not found
defined('EXIT_UNKNOWN_CLASS') OR define('EXIT_UNKNOWN_CLASS', 5); // unknown class
defined('EXIT_UNKNOWN_METHOD') OR define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
defined('EXIT_USER_INPUT') OR define('EXIT_USER_INPUT', 7); // invalid user input
defined('EXIT_DATABASE') OR define('EXIT_DATABASE', 8); // database error
defined('EXIT__AUTO_MIN') OR define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
defined('EXIT__AUTO_MAX') OR define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code

View File

@@ -0,0 +1,91 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
| ['dsn'] The full DSN string describe a connection to the database.
| ['hostname'] The hostname of your database server.
| ['username'] The username used to connect to the database
| ['password'] The password used to connect to the database
| ['database'] The name of the database you want to connect to
| ['dbdriver'] The database driver. e.g.: mysqli.
| Currently supported:
| cubrid, ibase, mssql, mysql, mysqli, oci8,
| odbc, pdo, postgre, sqlite3, sqlsrv
| ['dbprefix'] You can add an optional prefix, which will be added
| to the table name when using the Query Builder class
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
| ['cachedir'] The path to the folder where cache files should be stored
| ['char_set'] The character set used in communicating with the database
| ['dbcollat'] The character collation used in communicating with the database
| NOTE: For MySQL and MySQLi databases, this setting is only used
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
| (and in table creation queries made with DB Forge).
| There is an incompatibility in PHP with mysql_real_escape_string() which
| can make your site vulnerable to SQL injection if you are using a
| multi-byte character set and are running versions lower than these.
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
| ['encrypt'] Whether or not to use an encrypted connection.
|
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
| 'ssl_key' - Path to the private key file
| 'ssl_cert' - Path to the public key certificate file
| 'ssl_ca' - Path to the certificate authority file
| 'ssl_capath' - Path to a directory containing trusted CA certificates in PEM format
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not
|
| ['compress'] Whether or not to use client compression (MySQL only)
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
| - good for ensuring strict SQL while developing
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
| NOTE: Disabling this will also effectively disable both
| $this->db->last_query() and profiling of DB queries.
| When you run a query, with this setting set to TRUE (default),
| CodeIgniter will store the SQL statement for debugging purposes.
| However, this may cause high memory usage, especially if you run
| a lot of SQL queries ... disable this to avoid that problem.
|
| The $active_group variable lets you choose which connection group to
| make active. By default there is only one group (the 'default' group).
*/
$active_group = 'default';
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'srivasta',
'password' => 'Tiamzon2006',
'database' => 'srivasta',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);

View File

@@ -0,0 +1,24 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$_doctypes = array(
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'html5' => '<!DOCTYPE html>',
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">',
'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">',
'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',
'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">'
);

View File

@@ -0,0 +1,114 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| Foreign Characters
| -------------------------------------------------------------------
| This file contains an array of foreign characters for transliteration
| conversion used by the Text helper
|
*/
$foreign_characters = array(
'/ä|æ|ǽ/' => 'ae',
'/ö|œ/' => 'oe',
'/ü/' => 'ue',
'/Ä/' => 'Ae',
'/Ü/' => 'Ue',
'/Ö/' => 'Oe',
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
'/Б/' => 'B',
'/б/' => 'b',
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
'/ç|ć|ĉ|ċ|č/' => 'c',
'/Д|Δ/' => 'D',
'/д|δ/' => 'd',
'/Ð|Ď|Đ/' => 'Dj',
'/ð|ď|đ/' => 'dj',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e',
'/Ф/' => 'F',
'/ф/' => 'f',
'/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G',
'/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g',
'/Ĥ|Ħ/' => 'H',
'/ĥ|ħ/' => 'h',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i',
'/Ĵ/' => 'J',
'/ĵ/' => 'j',
'/Θ/' => 'TH',
'/θ/' => 'th',
'/Ķ|Κ|К/' => 'K',
'/ķ|κ|к/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
'/М/' => 'M',
'/м/' => 'm',
'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
'/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
'/П/' => 'P',
'/п/' => 'p',
'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
'/ŕ|ŗ|ř|ρ|р/' => 'r',
'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
'/Ț|Ţ|Ť|Ŧ|Τ|Т/' => 'T',
'/ț|ţ|ť|ŧ|τ|т/' => 't',
'/Þ|þ/' => 'th',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
'/Ƴ|Ɏ|Ỵ|Ẏ|Ӳ|Ӯ|Ў|Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y',
'/ẙ|ʏ|ƴ|ɏ|ỵ|ẏ|ӳ|ӯ|ў|ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y',
'/В/' => 'V',
'/в/' => 'v',
'/Ŵ/' => 'W',
'/ŵ/' => 'w',
'/Φ/' => 'F',
'/φ/' => 'f',
'/Χ/' => 'CH',
'/χ/' => 'ch',
'/Ź|Ż|Ž|Ζ|З/' => 'Z',
'/ź|ż|ž|ζ|з/' => 'z',
'/Æ|Ǽ/' => 'AE',
'/ß/' => 'ss',
'/IJ/' => 'IJ',
'/ij/' => 'ij',
'/Œ/' => 'OE',
'/ƒ/' => 'f',
'/Ξ/' => 'KS',
'/ξ/' => 'ks',
'/Π/' => 'P',
'/π/' => 'p',
'/Β/' => 'V',
'/β/' => 'v',
'/Μ/' => 'M',
'/μ/' => 'm',
'/Ψ/' => 'PS',
'/ψ/' => 'ps',
'/Ё/' => 'Yo',
'/ё/' => 'yo',
'/Є/' => 'Ye',
'/є/' => 'ye',
'/Ї/' => 'Yi',
'/Ж/' => 'Zh',
'/ж/' => 'zh',
'/Х/' => 'Kh',
'/х/' => 'kh',
'/Ц/' => 'Ts',
'/ц/' => 'ts',
'/Ч/' => 'Ch',
'/ч/' => 'ch',
'/Ш/' => 'Sh',
'/ш/' => 'sh',
'/Щ/' => 'Shch',
'/щ/' => 'shch',
'/Ъ|ъ|Ь|ь/' => '',
'/Ю/' => 'Yu',
'/ю/' => 'yu',
'/Я/' => 'Ya',
'/я/' => 'ya'
);

View File

@@ -0,0 +1,13 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files. Please see the user guide for info:
|
| https://codeigniter.com/userguide3/general/hooks.html
|
*/

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More