Fonaments de gestió de fitxers, estructures i gestió dinàmica de memòria

De binefa.com
Salta a la navegació Salta a la cerca

Cadenes de caràcters

Gestió de cadenes a Python

"""
gestioCadenes.py
"""
szA = "Una frase amb paraules"
print ("szA: \"%s\" té %d caràcters"%(szA,len(szA)))
szB = szA[:3] # Retorna els tres primer caràcters
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))
szB = szA[3:] # Retorna a partir del tercer caràcter
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))
szB = szA[4:9] # Retorna a partir del quart caràcter els cinc caràcters següents
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))
szB = szA[:-3] # Retorna tots els caràcters excepte els tres últims
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))
szB = szA[-8:] # Retorna els darrers 8 caràcters
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))

Comptar caràcters a Python

"""
compta.py
"""
szA = "Una frase amb paraules"
print ("szA: \"%s\" té %d caràcters"%(szA,len(szA)))

Comptar caràcters a C

/*
compta.c
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[]="Una frase amb paraules";
   
   printf("szA: \"%s\" té %d caràcters\n",szA,strlen(szA));

   return 0;
}

Copiar cadenes a Python

"""
copia01.py
"""
szA = "Una frase amb paraules"
print ("szA: \"%s\" té %d caràcters"%(szA,len(szA)))
szB = szA # A Python es poden copiar cadenes amb un =. Cosa que no és possible en C
print ("szB: \"%s\" té %d caràcters"%(szB,len(szB)))

Copiar cadenes a C

/*
copia01.c
Còpia de cadenes
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[]="Una frase amb paraules",szB[99];
   
   printf("szA: \"%s\" té %d caràcters\n",szA,strlen(szA));
   strcpy(szB,szA);// Això no ho puc fer en C: szB = szA;
   printf("szB: \"%s\" té %d caràcters\n",szB,strlen(szB));

   return 0;
}
/*
copia02.c
Còpia d'uns quants caràcters
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[]="Una frase amb paraules",szB[99];
   
   printf("szA: \"%s\" té %d caràcters\n",szA,strlen(szA));
   // strcpy(szB,szA);// szB = szA;
   printf("szB: \"%s\" te %d caràcters\n",szB,strlen(strncpy(szB,szA,5)));

   return 0;
}
/*
copia03.c
Còpia a partir de certa posició
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[]="Una frase amb paraules",szB[99];
   
   printf("szA: \"%s\" té %d caràcters\n",szA,strlen(szA));
   strcpy(szB,&szA[0]);// strcpy(szB,szA);
   printf("szB: \"%s\" te %d caràcters\n",&szB[14],strlen(&szB[14]));
   strcpy(szB,&szA[4]);
   printf("szB: \"%s\" te %d caràcters\n",szB,strlen(szB));

   return 0;
}

Concatenació de cadenes a Python

"""
concatenacio.py
"""
szA = "Una frase amb paraules"
print ("szA: \"%s\" té %d caràcters"%(szA,len(szA)))
szB = " i aquí continua"
szA = szA + szB # El mateix que szA += szB . El signe + concatena en Python
print ("szA: \"%s\" té %d caràcters"%(szA,len(szA)))

Concatenació de cadenes a C

/*
concatenacio.c
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[99]="Una frase amb paraules",szB[] = " i aqui continua";
   
   printf("szA: \"%s\" té %d caràcters\n",szA,(int)strlen(szA));
   // strcat(szA,szB); // Concatena szB després de szA
   printf("szA: \"%s\" té %d caràcters\n",szA,(int)strlen(strcat(szA,szB)));
   
   return 0;
}

Comparació de cadenes a C

/*
comparacioCadenes.c
*/
#include <stdio.h>
#include <string.h>

int main(){
   char szA[99]="frase",szB[] = "frase",szC[] = "Una altra frase";
   
   if (!strcmp(szA,szB)){ // si strcmp() retorna 0 són cadenes iguals
       printf("\"%s\" és igual a \"%s\"\n",szA,szB);
   }else{
       printf("\"%s\" no és igual a \"%s\"\n",szA,szB);
   }
   strcpy(szA,szC);
   if (!strcmp(szA,szB)){
       printf("\"%s\" és igual a \"%s\"\n",szA,szB);
   }else{
       printf("\"%s\" no és igual a \"%s\"\n",szA,szB);
   }
   
   return 0;
}

Mètodes de cadenes a Python

Mètodes de cadenes a Python

Pas d'arguments pel terminal

Pas d'arguments pel terminal a C

// argc01.c
#include <stdio.h>

int main(int argc,char*argv[]){
    
  if (argc == 2){
      printf("L'argument es: \"%s\"\n",argv[1]);
  }else{
      printf("No hi ha un argument \n");
  }
  
  return 0;
}

Pas d'arguments pel terminal a Python

# arg01.py
import sys

if len(sys.argv) == 2:
   print("L'argument es: \"%s\""%(sys.argv[1]))
   sys.exit(0) # Equivalent a return 0 en C
else:
   print("No hi ha un argument")
   sys.exit(1) # Equivalent a return 1 en C

Fitxers

Saber si un arxiu existeix a C

// fitxerExisteix.c
#include <stdio.h>
#include <string.h>
#define N 99

int main(int argc,char*argv[]){
   FILE *f;
   char szA[N];

   if (argc == 2){
       strcpy(szA,argv[1]);
   }else{
     printf("Nom del fitxer: ");
     scanf("%s", szA);
   }
   if(f = fopen(szA,"r")){
       printf("%s existeix \n", szA);
       fclose(f);
   }else{
       printf("%s no existeix \n", szA);
   }
   
   return 0;
}

Saber si un arxiu existeix a Python

Python File Open a w3schools.com

# fitxerExisteix.py
import sys

nomFitxer = ""
if len(sys.argv) == 2:
   nomFitxer = sys.argv[1]
else:
   nomFitxer = input("Nom del fitxer: ")
try:
   f = open(nomFitxer)
   print("L'arxiu %s existeix"%nomFitxer)
   f.close()
except:
   print("L'arxiu %s no existeix"%nomFitxer)

Lectura i escriptura d'arxius a C

putc() i getc()

// m8p01.c - Creació, escriptura i lectura d'un arxiu -
// http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m8/d97m8p1.htm
#include <stdio.h>
#include <stdlib.h>

int main(){
   FILE *f;
   char car;

  //procés d'escriptura
   system("clear");
   if((f=fopen("arxiu.txt","w"))==NULL){
       printf("Error al intentar obrir l'arxiu\n");
       return;
   }
   printf("Introduïu un text (Premeu return per acabar): ");
   while ((car=getchar())!='\n') putc(car,f);
   fclose(f);

  //procés de lectura
   printf("Lectura de l'arxiu\n");
   if((f=fopen("arxiu.txt","r"))==NULL){
       printf("Error a l'intentar obrir l'arxiu\n");
       return 1;
   }
   while((car=getc(f))!=EOF) putchar(car);
   putchar('\n');
   fclose(f);

   return 0;
}

fread()

// fitxerLlegintTotAlhora.c
#include <stdio.h>
#include <string.h>
#define N 99

int main(int argc, char* argv[]){
   FILE *f;
   char szFitxer[N], ch, szContingut[999];

   if (argc == 2){
       strcpy(szFitxer, argv[1]);
   } else{
       printf("Nom fitxer: ");
       scanf("%s", szFitxer);
   }
   f = fopen(szFitxer, "r");
   if(f){ //si f es NULL (0) vol dir que el arxiu no s'ha pogut obrir
       printf("L'arxiu %s existeix\n", szFitxer);
       printf("El contingut de l'arxiu és: \n");
       fread(szContingut, 1, 999, f);
       printf("%s", szContingut);
       fclose(f);
   } else{
       printf("L'arxiu %s no existeix\n", szFitxer);
   }

   return 0;
}

fputs() i fgets()

// m8p02.cc - Lectura i escriptura amb fgets() i fputs() -
// http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m8/d97m8p2.htm
#include <stdio.h>
#include <string.h>

int main(){
   FILE *apuntador;
   char cadena[80];

   if (( apuntador = fopen("fitxers.txt","w"))==NULL){
       puts("\nNo puc crear l'arxiu fitxers.txt");
       return 1;
   }else{
       printf("Introduïu text de vàries línies.\n");
       printf("Una línia en blanc per acabar.\n");
       while (strlen(fgets(cadena,80,stdin))!=1){ // stdin és l'arxiu de l'entrada (teclat al terminal)
          fputs(cadena,apuntador);
          // fputs("\n",apuntador);
       }
       fclose(apuntador);
   }

// lectura 
   if (( apuntador = fopen("fitxers.txt","r"))==NULL){
       puts("\nNo puc llegir l'arxiu: fitxers.txt");
       return 1;
   }else{
       while (fgets(cadena,80,apuntador) != NULL) // Lectura línia a línia
          printf("%s",cadena);
       fclose(apuntador);
   }

   return 0;
}

fprintf() i fscanf()

// m8p03.c - Lectura i escriptura amb fprintf() i fscanf() -
// http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m8/d97m8p3.htm
#include <stdio.h>

int main(){
   FILE *f;
   int codi;
   char nom[20];
   char cognom[20];
   float nota;

   f = fopen("prova.txt","w");
   printf("\n Introduïu les dades.");
   printf("\n Escriviu 0 al codi per finalitzar\n");
   if (f!=NULL){
       do{
           printf("\nIntroduïu el codi: ");
           scanf(" %d",&codi); if(codi==0) break;
           printf("Introduïu el nom: ");
           scanf(" %s",nom);
           printf("Introduïu el cognom: ");
           scanf(" %s", cognom);
           printf("Introduïu la nota: ");
           scanf(" %f",&nota);
           fprintf(f, "%d %s %s %f\n",codi, nom, cognom, nota);
        }while (1);
        fclose(f);
   }

   /* lectura */
   printf("\n\n************** Lectura ************* \n\n");
   if ( (f = fopen("prova.txt","r")) != NULL ){
       while (fscanf(f, "%d %s %s %f",&codi, nom,cognom, &nota) != EOF){
           printf("%d %s %s %f\n",codi, nom, cognom, nota);
       }
       fclose(f);
   }

   return 0;
}

Lectura i escriptura d'arxius a Python

Python File Open a w3schools.com

Python File Write a w3schools.com

Python Delete File a w3schools.com

Llegir arxius línia a línia

# fitxerLlegintLiniaPerlinia.py
import sys

if len(sys.argv) == 2:
  nomFitxer = sys.argv[1]
else:
  nomFitxer = input("Nom arxiu: ")
try:
  f = open(nomFitxer)
  print("%s existeix"%nomFitxer)
  print("El contingut de l'arxiu és: ")
  nL = 1
  while True:
      szLinia = f.readline()
      if szLinia == "":
          break
      print("%d) %s"%(nL, szLinia),end = "")
      nL += 1
  f.close()
except:
  print("%s no existeix"%nomFitxer)

Afegint contingut a un arxiu

f = open("demofile2.txt", "a")
f.write("Afegint contingut!\n")
f.close()

# obrint i llegint l'arxiu després d'afegir contingut
f = open("demofile2.txt", "r")
print(f.read())

Sobreescrivint contingut a un arxiu

f = open("demofile3.txt", "w")
f.write("Ups! He esborrat el contingut!")
f.close()

# obrint i llegint l'arxiu després de sobreescriure'l
f = open("demofile3.txt", "r")
print(f.read())

Estructures a C

/*
st03.c
*/
#include <stdio.h>

struct treballador{
   char nom[50];
   char cognom1[30];
   char cognom2[30];
   int edat;
};

void vPresentaTreballador(struct treballador stT, const char *szQui){
   printf("%s: %s %s %s te %d anys\n",szQui,stT.nom,stT.cognom1,stT.cognom2,stT.edat);
}

void vAugmentaUnAny(struct treballador *pStT){
   (*pStT).edat += 1;
}

void vAugmentaUnAny2(struct treballador *pStT){
   //(*pStT).edat += 1;
   pStT->edat += 1;
}

int main(){
   struct treballador *pT,enginyer, administratiu = {"Eric","Alvarez","Cuerva",18}, auxiliar;
   
   vPresentaTreballador(administratiu,"Administratiu");
   pT = &administratiu;
   vPresentaTreballador(*pT,"Apuntador a administratiu");
   vAugmentaUnAny(pT); //Pas per referència de l'estructura
   vPresentaTreballador(*pT,"1) Apuntador a administratiu amb un any incrementat");
   vAugmentaUnAny2(pT); //Pas per referència de l'estructura
   vPresentaTreballador(*pT,"2) Apuntador a administratiu amb un any incrementat");
   
   return 0;
}

Diccionaris a Python

Diccionaris al w3schools

"""
diccionari.py
"""
alumne = {
 "nom": "Eric",
 "cognom1": "Alvarez",
 "cognom2": "Cuerva",
 "edat": 18
}

print(alumne)
alumne["edat"] += 1 
print(alumne)

Unions a C

Comparativa entre estructures i unions al d97

/*
unions.c
http://www.xtec.cat/formaciotic/ateneu_historic/materials/td97/d97m7/d97m7p7.htm
*/
#include <stdio.h>

struct notes {
   int mat, fis, inf,qui, fil ;
};

union alumne {
   struct notes N;
   int nota[5];
};

int main(){
   int ct;
   union alumne joan;

   joan.N.mat=10;
   joan.N.fis=9;
   joan.N.inf=7;
   joan.N.qui=9;
   joan.N.fil=10;

   printf("\nmat\tfis\tinf\tqui\tfil\n");
   for(ct=0;ct<5;ct++){
       printf("%d\t",joan.nota[ct]);
   }

   return 0;
}

Enumeració a C

/*
enum01.c
*/
#include <stdio.h>

enum dia {dilluns, dimarts, dimecres = 7, dijous, divendres, dissabte, diumenge}; 

int main(){
   enum dia avui;
   
   avui = divendres;
   if (avui == divendres){
       printf("És divendres\n");
   }else{
       printf("No és divendres\n");
   }
   printf("avui:  %d\n",(int)avui);
   avui = diumenge;
   if (avui == divendres){
       printf("És divendres\n");
   }else{
       printf("No és divendres\n");
   }

   return 0;
}

Introducció a les classes a Python

Classes de Python al w3schools

Creació d'una classe

# classe00.py
class LaMevaClasse:
 x = 5

print(LaMevaClasse)

Creació d'un objecte

# classe01.py
class LaMevaClasse:
 x = 5

p1 = LaMevaClasse()
print(p1.x)

Mètode __init__()

# classe02.py
class Person:
 def __init__(self, name, age):
   self.name = name
   self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

Mètode __str__()

# classe03.py
class Person:
 def __init__(self, name, age):
   self.name = name
   self.age = age

 def __str__(self):
   return "%s(%s)"%(self.name,self.age)    

p1 = Person("John", 36)

print(p1)

Mètodes personalitzats

# classe04.py
class Person:
 def __init__(self, name, age):
   self.name = name
   self.age = age

 def myfunc(self):
   print("Hello my name is " + self.name)

p1 = Person("John", 36)
p1.myfunc()

Assignació dinàmica de memòria a C

a = (double*)calloc(n*n, sizeof(double));
a = (double*)malloc(n*n*sizeof(double));
free(a);
a = new double[n*n];
delete(a);
a = (int*)malloc(sizeof(int));
a = (int*)realloc(a,(n+2)*sizeof(int));