Introduccion A C

  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Introduccion A C as PDF for free.

More details

  • Words: 4,499
  • Pages: 40
Introducción al Lenguaje C (ANSI) Un poco de Historia  Fue inventado por Dennis Ritchie en un DEC-PDP-11 en los Laboratorios BELL, basándose en el lenguaje B, creado por Ken Thompson.  En 1983 el Instituto de Estándares Americanos estableció un estándar que definiera al lenguaje C, conocido como ANSI C.  Los principales compiladores de C llevan implementado el estándar ANSI C. Características del Lenguaje C  Se cataloga como un lenguaje de nivel medio, puesto que combina elementos de lenguajes de alto nivel (Fortran, Pascal, Basic, etc.) con la funcionalidad del lenguaje ensamblador.  Permite el manejo de bits, bytes y direcciones de memoria.  Posee sólo 32 palabras clave, definidas por el comité ANSI. 32 Palabras Reservadas char

void

default

return

int

if

break

auto

float

else

continue

extern

double

do

goto

register

long

while

struct

const

short

for

union

static

signed

switch

enum

volatile

unsigned

case

typedef

sizeof

Autor: ycarruido

1

20/08/yyyy

Elementos de un Programa en C ANSI       

Comentarios. Identificadores. Constantes. Variables. Operadores. Sentencias o instrucciones. Macros del pre-procesador. Comentarios

Comentarios multi-línea Comienzan con /* y terminan con */ No puede anidarse un comentario dentro de otro. Comentarios de una sola línea (C++, Java, Delphi). Comienzan al principio de la línea con // Ejemplo: //Esto es un comentario /* Esto también es un comentario */ Identificadores Se utilizan para nombrar variables, funciones, etiquetas y elementos definidos por el usuario. Los primeros seis caracteres deben ser significativos (distinguirse de otro similar) y máximo puede tener hasta 31 caracteres. El primer carácter debe de ser una letra o subguión. Posteriormente subrayado.

pueden

ser

letras,

números,

signos

Existe diferencia entre mayúsculas y minúsculas. No pueden emplearse palabras reservadas identificadores.

de

como

No pueden emplearse nombres de funciones que ya existan en el programa o en la librería de funciones de C. No puede llamarse main

Autor: ycarruido

2

20/08/yyyy

Convenciones Empezar los nombres de funciones y de variables con una letra minúscula. Las constantes escritas con #define van con mayúsculas como #define PI 3.1416 Las palabras intermedias comienzan con mayúsculas. sumaMatrices Utilizar el subguión para separar palabras intermedias. suma_Matrices Emplear nombres cortos para optimizar. (i, j, k, cont) Constantes Constantes de carácter. Ej. ‘a’, ‘0’, ‘\0x5’, ‘\0’, ‘\n’, ‘\t’, ‘$’, ’\\’, NULL Constantes enteras. Ej. 5, +5, -5, \05, \0x5, 5L, 5U, 5lu, etc. Constantes reales. Ej. 0.5f, 0.5, 5e-01f, 5.0e-01, (float)5, etc. Constantes de texto (Cadenas o “Strings”) “Esto es una cadena…” #define Se utiliza para asignar un identificador a una constante. #define PI 3.1416 #define NCOLS 20 El pre-procesador de C, sustituye la ocurrencia de PI por el valor 3.1416 en todo el programa antes de efectuar la compilación, del mismo modo se sustituye NCOLS por 2.

Variables Una variable es una localidad de memoria cuyo valor puede ser cambiado durante la ejecución del programa. Todas las variables deben de ser declaradas para se utilizadas. espacio(s) ;

Autor: ycarruido

3

20/08/yyyy

Ejemplo: int a; float area, radio, volumen; const Es un modificador de acceso que me permite asignar a una variable un valor constante, es decir que una vez asignado a dicha variable su valor no podrá ser modificado durante el programa. const esp = valor; Ejemplo: const int a=10; const char pais[]=“MÉXICO”; const char *nombre=“VLADIMIR”;

Operadores Son palabras o símbolos que implican una acción sobre ciertas variables. Pueden ser unarios (1 variable), binarios (2 variables) o ternarios (3 variables).      

Operadores Operadores Operadores Operadores Operadores Operadores

Operador + -

Aritméticos Relacionales Lógicos de Asignación de Dirección de Bits Operadores Aritméticos Nombre Descripción Suma 5+2 → 7 Resta 5-2 → 3

* / % (tipo de dato)

Autor: ycarruido

Multiplicación División Módulo “Cast” forzado

4

5*2 → 10 5/2 → 2 5%2 → 1 (double)5 → 5.0

20/08/yyyy

Operador

Operadores Relacionales Nombre Descripción

==

Igual a

if (a==‘s’)

!=

Diferente de

if (a!=null)

>

Mayor que

if (a>0.5)

<

Menor que

if (a<2l)

>=

Mayor o igual que

if (a>=2f)

<=

Menor o igual que

if (a<=3)

Operador

Operadores Lógicos Nombre Descripción

&&

Y (AND)

if ((a>3) && (a<9))

||

O (OR)

if ((a==2) || (a==3))

!

NEGADO (NOT)

if (!(a==3)) es igual a if (a!=3)

 Importante: FALSO es igual a cero. VERDADERO es diferente de cero

Autor: ycarruido

5

20/08/yyyy

Operadores de Asignación Operador

Abreviado

No Abreviado

=

a=2;

a=2;

++

n++;

n=n+1;

--

n--;

n=n-1;

+=

n+=2;

n=n+2;

-=

n-=2;

n=n-2;

*=

n*=2;

n=n*2;

/=

n/=2;

n=n/2;

%=

n%=2;

n=n%2;

Operador

Operadores de Bits Nombre Descripción

<<

Corrimiento a la izquierda

b=a>>2;

>>

Corrimiento a la derecha

b=a<<3;

&

c=a&128;

|

Y (AND) entre bits O (OR) entre bits

~

Complemento A1

c=~a;

^

O exclusivo (XOR)

c=^a;

Autor: ycarruido

6

c=a|0x0a;

20/08/yyyy

Operadores de Asignación para bits Operador

Abreviado

No Abreviado

<<=

n<<=2;

n=n<<2;

>>=

n>>=2;

n=n>>2;

&=

n&=0x0a;

n=n&0x0a;

|=

n|=7;

n=n|7;

^=

n^=0x03;

n=^0x03;

=

n=0x7f;

n=0x7f;

Operador *

&

Operadores De Dirección Nombre Descripción Operador Me da el valor que indirecció está almacenado en una n dirección de memoria. También sirve para declarar una variable apuntador. Operador dirección

Me da la dirección de memoria de una variable.

Variables Apuntador Sirven para almacenar una dirección de memoria. Utilizan el operador & para obtener la dirección. Se deben inicializar con NULL (equivale a cero). Se declaran como: <*> espacio(s) ; Ejemplo: int *a=NULL; int b=2,c=1; a=&b; /*Guarda la direc. de b en a */ c=*a; /*c vale 2 */

Precedencia de Operadores Autor: ycarruido

7

20/08/yyyy

( ) [ ] -> ! ~ + - ++ -- & sizeof * / % + << >> < <= > >= == != & ^ | && || ?:

Alta prioridad Unarios

*

Aritméticos Corrimiento de bits Relacionales Bits / Lógicos / Condicional Asignación

= *= /= %= += -= &= ^= |= <<= >>= ,

Evaluación

Sentencias (Instrucciones) Una sentencia es una instrucción o expresión en C que tiene una consecuencia. Pueden ser asignaciones, operaciones, llamadas a funciones. Todas las sentencias terminan con el signo de punto y coma ; Pueden ser simples o compuestas. Las compuestas van entre llaves: { sentencia1; sentencia2; : sentencian; } Sentencias de Selección. if – else, switch – case, ?: Sentencias de Repetición. do – while, while, for Sentencias de Salto. return, break, continue

Estructura de un programa en C Autor: ycarruido

8

20/08/yyyy

I. Directivas del pre-procesador #include y #define II. Declaración de Prototipos (Declaración de funciones) III. Declaración de variables globales IV. Funciones definidas por el usuario V. Función Principal main( )

Ejemplos de un Programa en C #include <stdio.h>

// Librería: printf, getchar

main() // Función Principal { printf("Hola mundo!"); // Imprime en pantalla getchar(); // Pausa: espera tecla ENTER return 0; // Termina con éxito } ----------------------------------------------------------#include <stdio.h> #include <math.h> #define VALOR 5.7 double modulo3D( double x, double y, double z ); double mod3; /* Variable global */ double modulo3D( double x, double y, double z ){ return(sqrt(x*x+y*y+z*z); } int main( void ){ int x, y, z; x=y=z=VALOR; mod3=modulo3D(x,y,z); printf(“\nEl módulo es: %lf”,mod3); return(0); } Autor: ycarruido

9

20/08/yyyy

----------------------------------------------------------#include <stdio.h> #define FACTOR 2 int doble(int valor); int main() { int indice = 2; printf(“El doble de %d es %d\n”, indice, doble(indice)); return 0; } int doble(int valor) { return (valor * FACTOR); }

Sentencia if-else if (expresión) sentencia; else sentencia;

Nota: una expresión en C es todo aquello que regresa un valor. Como por ejemplo una condición lógica, operaciones aritméticas, llamadas a funciones, una variable, una constante (númérica, carácter, etc.). if (expresión) { sentencia1; sentencia2; } else { sentencia1; sentencia2; }

Sentencia switch-case

Autor: ycarruido

10

20/08/yyyy

switch(expresión) { case 1: sentencias; break; case 2: sentencias; break; : case n: sentencias; break; default: sentencias_default; break; }

Arreglos Unidimensionales Los arreglos unidimensionales son secuencias de valores del mismo tipo que se almacenan en localidades contiguas de memoria, según el orden del índice. esp [tamaño]; Ejemplo: int valores[10]; float datos[5]={1.3,2.8,4.89,0.0,5.7}; char pais[]=“MÉXICO”; char *nombre=“VLADIMIR”; Un arreglo se identifica por su nombre, pero para el compilador este equivale a la dirección del primer elemento del arreglo, es decir: Ejemplo: int num[50]; Para el compilador: num es igual a &num[0] /* La dirección del elemento 0 */ Los índices son necesarios para desplazarse a través del arreglo. El primer elemento tiene el índice cero y el último el índice (tamaño-1). Se deben utilizar variables enteras y para agilizar el acceso a memoria se pueden declarar con el modificador register. Ejemplo: int register i, j, k; Autor: ycarruido

11

20/08/yyyy

Para guardar o leer los elemento en un arreglo es muy frecuente utilizar la sentencia for. Ejemplo: int register i; int num[50]; /* Asigno al arreglo valores del 0 al 500 */ for (i=0; i<50; i++) num[i]= i*10;

Para introducir los elemento en un arreglo con la función scanf se recomienda utilizar una variable auxiliar dentro de un ciclo for. Ejemplo: int register i; double datos[100]; double temp; for (i=0; i<100; i++) { scanf(“%lf”,&temp); fflush(stdin); /* stdin=entrada estándar */ num[i]= temp; }

Un arreglo puede tener N dimensiones, dependiendo de las limitaciones de la memoria y su declaración es la siguiente: esp [dim1] [dim2]…[dimN];  Ejemplo: double cubo[3][3][3]; Arreglos de Caracteres Una cadena o “String” se manipula en lenguaje C, mediante arreglos de caracteres. Los arreglos de caracteres terminan con el carácter nulo ‘\0’ que en realidad es el valor cero.

Autor: ycarruido

12

20/08/yyyy

La única diferencia con los arreglos numéricos es que se requiere un carácter adicional para indicar cuando el final del arreglo. Ejemplo: char nombre[31]; /* Uso sólo 30 */ LA FUNCIÓN printf Sintaxis: printf ("formato", var1, var2, ..., varN) "formato": serie de caracteres. Secuencias especiales: • • • • • • • • •

%d: escribir un entero; %o: escribir en octal; %x: escribir en hexadecimal; %u: escribir en entero sin signo; %ld, %lo, %lx: lo mismo solo que para un long; %hd, %ho, %hx: lo mismo solo que para un short; %c: hace referencia a un caracter; %f, %lf: escribir un flotante o doble; %%: escribir caracter '%'; LA FUNCIÓN scanf

Sintaxis: scanf("formato", &var1, &var2, ..., &varN) "formato": debe contener una las secuencias siguientes: • • • • •

%d, %o, %x: se refiere a un decimal, octal o hexadecimal; %ld, %lo, %lx: lo mismo solo que para un long; %hd, %ho, %hx: lo mismo solo que para un short; %c: hace referencia a un caracter; %f, %lf: referencia a un float o double

Autor: ycarruido

13

20/08/yyyy

Ejercicios Programa que convierte de metros a pies y pulgadas. #include stdio.h main(){ float metros,resul,pulg; int resul2,pulg2; clrscr(); printf("\nValor en metros: "); scanf("%f",&metros); resul=metros*(1/.3048); resul2=resul; pulg=resul-resul2; pulg=pulg*12; pulg2=pulg; printf("El resultado es: %d pies %d pulgadas",resul2,pulg2); getch(); } Programa que realiza las cuatro operaciones aritméticas fundamentales #include stdio.h #include conio.h void main(){ int prim,seg,resul; char oper; clrscr(); printf("\nPrimer numero: "); scanf("%d",&prim); printf("\nOperacion a realizar (+,-,*,/): "); oper=getche(); printf("\nSegundo numero: "); scanf("%d",&seg); if(oper=='+') resul=prim+seg; if(oper=='-') resul=prim-seg; if(oper=='*') resul=prim*seg; if(oper=='/') Autor: ycarruido

14

20/08/yyyy

resul=prim/seg; printf("\nEl resultado de la operacion %d %c %d es %d",prim,oper,seg,resul); getch(); } Programa que lee los tres lados de un triángulo y detecta el tipo. #include stdio.h main(){ float uno,dos,tres; clrscr(); printf("\nValor del primer lado: "); scanf("%f",&uno); printf("\nValor del segundo lado: "); scanf("%f",&dos); printf("\nValor del tercer lado: "); scanf("%f",&tres); if((uno==dos) && (dos==tres) && (uno==tres)) printf("\nEl triangulo es equilatero"); else if((uno!=dos) && (dos!=tres) && (uno!=tres)) printf("\nEl triangulo es escaleno"); else printf("\nEl triangulo es isoceles"); getch(); }

Autor: ycarruido

15

20/08/yyyy

Programa que lee las edades de un grupo de alumnos y encuentra el promedio. #include stdio.h main(){ int alumnos,edad,counter=1; float promedio,sumaedad=0; clrscr(); printf("\nNumero de alumnos: "); scanf("%d",&alumnos); while(1){ printf("\nEdad alumno %d: ",counter); scanf("%d",&edad); sumaedad=sumaedad+edad; if(counter==alumnos){ break; } counter++; } promedio=sumaedad/counter; printf("\nLa edad promedio de %d alumno(s) es %.1f años",counter,promedio); getch(); }

Autor: ycarruido

16

20/08/yyyy

Función que lee calificaciones (0-10) de alumnos y cuente el número de alumnos reprobados, (calif<7) de un conjunto de notas. La función recibe como parámetro el número de notas a leer y deberá regresar el número de alumnos reprobados. Crear un programa que llame a la función anterior y que despliegue el número de alumnos reprobados. #include stdio.h int numreprob(int not); void main(void){ int notas,reprobados; clrscr(); printf("\nNumero de notas a leer: "); scanf("%d",& notas); reprobados=numreprob(notas); printf("\nExiste un total de %d alumnos reprobados",reprobados); getch(); } int numreprob(int not){ int c=1,calif,rep=0; while(c<=not){ printf("\nCalificacion de la nota %d: ",c); scanf("%d",&calif); if(calif<7){ rep++;} c++; } return(rep); }

Autor: ycarruido

17

20/08/yyyy

Función que lee las matrículas (números enteros) y las calificaciones (tipo char) de los alumnos de un grupo y las almacene en dos arreglos unidimensionales. La función deberá leer los datos hasta que se de una matrícula cero la cual indica el fin de captura. La función regresa el número de alumnos por el mecanismo de return. Después debe de imprimir el contenido de los arreglos. #include stdio.h void despliega(int *mats,char *califs,int numcap); int leedato(int *mats,char *califs,int maximo); void main(void){ int max=30,matr[29],numalumn; char calif[29]; clrscr(); numalumn=leedato(matr,calif,max); printf("\nEl numero de alumnos capturados es %d",numalumn); despliega(matr,calif,numalumn); } int leedato(int *mats,char *califs,int maximo){ int n=0; printf("\n ***"); printf("\n ***");

*** Introduce la matricula y su calificacion. *** Para terminar dale un cero a la matricula.

while(1){ if(n>=maximo){ printf("\nEl arreglo se encuentra lleno"); getch(); break; } printf("\n\nMatricula del alumno %d: ",n+1); scanf("%d",mats); if(*mats==0){ break; } printf("\nCalificacion del alumno %d: ",n+1); scanf("%d",califs); mats++; califs++; Autor: ycarruido

18

20/08/yyyy

n++; } return n; } void despliega(int *mats,char *califs,int numcap){ int i=1; while(1){ if(i>numcap){ break; } printf("\nLa calificacion del alumno %d es %d",*mats,*califs); i++; mats++; califs++; } getch(); } Programa que despliega una tabla de conversión de ºC a ºF y viceversa. El programa debe tener una función que pregunte el tipo de conversión deseada. El usuario tecleará "c" o "C" si la conversión va a ser de ºC a ºF y "f" o "F" si la conversión es de ºF a ºC, regresando el caracter leído por medio de return. Otra función preguntará el rango de valores de la tabla y el incremento, recibiendo como parámetros las direcciones de las variables donde se almacenarán esos datos. Otras dos funciones serán para desplegar cada tipo de tabla de conversión. #include stdio.h #include ctype.h void void void char

despliegaFC(int *ran1,int *ran2,int *inc); despliegaCF(int *ran1,int *ran2,int *inc); leeDatos(int *ran1,int *ran2,int *inc); tipoConv(void);

void main(void){ int rango1,rango2,incremento; char tipo; clrscr(); tipo=tipoConv(); leeDatos(&rango1,&rango2,&incremento);

Autor: ycarruido

19

20/08/yyyy

if(tipo=='C'){ despliegaCF(&rango1,&rango2,&incremento); } else{ despliegaFC(&rango1,&rango2,&incremento); } } char tipoConv(void){ char caract; printf(" TABLA DE CONVERSION DE GRADOS CENTIGRADOS A GRADOS FARENHEIT"); printf("\n Y DE GRADOS FARENHEIT A GRADOS CENTIGRADOS"); printf("\n\nPara convertir de Centigrados a Farenheit oprime 'C'"); printf("\npara convertir de Farenheit a Centigrados oprime 'F'"); printf("\n\nTipo de Conversion (C o F): "); caract=toupper(getch()); return caract; } void leeDatos(int *ran1,int *ran2,int *inc){ printf("\n\nValor inicial de la tabla: "); scanf("%d",ran1); printf("\nValor final de la tabla: "); scanf("%d",ran2); printf("\n\nIncremento de los valores de la tabla: "); scanf("%d",inc); } void despliegaCF(int *ran1,int *ran2,int *inc){ int suma=*ran1,incremento=*inc,rango2=*ran2; float conversion; while(suma<=rango2){ conversion=(((suma)*9)/5)+32; printf("\n%d §C ----------------------------§F",suma,conversion);

%.1f

suma=suma+incremento; } getch(); } Autor: ycarruido

20

20/08/yyyy

void despliegaFC(int *ran1,int *ran2,int *inc){ int suma=*ran1,incremento=*inc,rango2=*ran2; int conversion; while(suma<=rango2){ conversion=((suma-32)*5)/9; printf("\n%d §F ----------------------------§C",suma,conversion);

%d

suma=suma+incremento; } getch(); } Ejemplos de cadenas. Función que realiza la misma operación que la función atoi, que convierte una cadena en un entero. La función regresa el entero representado por la cadena s si se pudo convertir, en caso contrario regresa 0. Si la función encuentra caracteres espacio o tabulación, los salta. Si al empezar la secuencia de dígitos, ésta se interrumpe, el programa termina. #include stdio.h #include ctype.h int myatoi(char *s); void main(void){ int n; char cad[50]; clrscr(); printf("Introduce la cadena: "); gets(cad); n=myatoi(cad); printf("\nEl entero extraido de la cadena fue %d",n); getch(); } int myatoi(char *s){ int signo=1,num=0; while(1){ if(*s==' ' || *s=='\t'){ s++; } else break; Autor: ycarruido

21

20/08/yyyy

} if(*s=='+'){ s++; } else if(*s=='-'){ signo=-1; s++; } while(1){ if(*s=='\0' || !isdigit(*s)){ break; } num=10*num+(*s-'0'); s++; } return signo*num; } Ejemplos de cadenas. Función que realiza la misma operación que la función strlen. Calcula la longitud de la cadena S. Regresa el número de caracteres en S sin contar el caracter de fin de cadena. #include stdio.h #include ctype.h int mystrlen(char *s); void main(void){ int n; char cad[50]; clrscr(); printf("Introduce la cadena: "); gets(cad); n=mystrlen(cad); printf("\nEl numero de caracteres de la cadena s fue %d",n); getch(); } int mystrlen(char *s){ int c=0; while(1){ if(*s=='\0'){ break; } c++; Autor: ycarruido

22

20/08/yyyy

s++; } return c; } Función que lee una serie de números de la línea de comandos y ejecuta la instrucción proporcionada después del último número de la serie. Si la instrucción es GUARDA, los números son guardados en un arreglo de tipo entero. Si la instrucción es LISTA, los numeros son desplegados como cadenas. #include #include #include #include

stdio.h ctype.h string.h stdlib.h

void main(int np, char *ps[]){ int arreglo[100],j,i; clrscr(); if(strcmp(ps[np-1],"GUARDA")==0){ for(i=0,j=1;j<(np-1);i++,j++){ arreglo[i]=atoi(ps[j]); printf("\n%d",arreglo[i]); } } if(strcmp(ps[np-1],"LISTA")==0){ for(i=1;i<(np-1);i++){ puts(ps[i]); } } } Programa que recibe en la línea de comando un número flotante, un caracter que represente una de las cuatro operaciones fundamentales y un segundo número. El programa deberá desplegar el resultado de la operación deseada. #include stdio.h #include stdlib.h #include string.h void main(int narg,char *sarg[]){ float op1,op2,resul; int i=1; clrscr(); Autor: ycarruido

23

20/08/yyyy

printf("PROGRAMA QUE CALCULA UNA OPERACION ARITMETICA SIMPLE ENTRE DOS OPERANDOS"); printf("\n\nLa sintaxis es: Calcula operando operador operando"); printf("\n"); while(i<=narg){ printf("%s",sarg[i]); i++; } op1=atof(sarg[1]); op2=atof(sarg[3]); if(strcmp(sarg[2],"+")==0) resul=op1+op2; else if(sarg[2][0]=='-') resul=op1-op2; else if(strcmp(sarg[2],"*")==0) resul=op1*op2; else if(sarg[2][0]=='/') resul=op1/op2; else{ printf("\nOperador invalido: '%s'",sarg[2]); return; } printf("\n\nEl resultado es %.1f",resul); getch(); } Editor de textos con arreglo de cadenas. #include string.h #include stdio.h #include ctype.h void void void void void

inserta(char t[][50],int *ll,int act,int max); modif_actual(int *act,int ll); reemplaza_linea(char t[][50],int ll,int *act); lista(char t[][50],int *ll); agrega_linea(char t[][50],int *ll,int max,int *act);

void main(void){ char txt[30][50],opcion; int llenas=0,max=30,actual; while(1){ Autor: ycarruido

24

20/08/yyyy

clrscr(); printf(" printf("\n OPCION DESEADA"); printf("\n\nAgregar Opcion: ");

EDITOR DE TEXTO"); SELECCIONA LA PRIMERA LETRA DE LA Salir

Lista

Reemplaza

Inserta

opcion=toupper(getch()); if(opcion=='S') break; if(opcion=='A') agrega_linea(txt,&llenas,max,&actual); if(opcion=='L') lista(txt,&llenas); if(opcion=='R') reemplaza_linea(txt,llenas,&actual); if(opcion=='I') inserta(txt,&llenas,actual,max); } } /********************************************************** ****************/ void agrega_linea(char t[][50],int *ll,int max,int *act){ if(*ll==max){ printf("\n\nMemoria insuficiente..."); return; } printf("\n\n>"); fflush(stdin); gets(t[*ll]); *ll=*ll+1; *act=*ll; } /********************************************************** ****************/ void lista(char t[][50],int *ll){ int i=0; printf("\n\n"); while(i<*ll){ puts(t[i]); i++; } getch(); }

Autor: ycarruido

25

20/08/yyyy

/********************************************************** ****************/ void modif_actual(int *act,int ll){ int v; printf("\n\nIndica el numero de la linea a posicionar: "); scanf("%d",&v); if(v<=ll && v!=0){ *act=v; } else{ *act=-1; } } /********************************************************** ****************/ void reemplaza_linea(char t[][50],int ll,int *act){ if(ll==0){ printf("\n\nNo existe informacion a reemplazar"); getch(); return; } modif_actual(act,ll); if(*act==-1){ printf("\n\nLa linea seleccionada no existe..."); getch(); } else{ printf("\n\nIntroduce la nueva linea: "); fflush(stdin); gets(t[*act-1]); } } /********************************************************** ***************/ void inserta(char t[][50],int *ll,int act,int max){ int j; if(*ll==max){ printf("\n\nMemoria insuficiente..."); getch(); return; } Autor: ycarruido

26

20/08/yyyy

modif_actual(&act,*ll); if(act==-1){ printf("\n\nLa linea seleccionada no existe..."); getch(); } else{ j=*ll-1; while(j>=act-1){ strcpy(t[j+1],t[j]); j--; } printf("\n\nInserta la nueva linea: "); fflush(stdin); gets(t[act-1]); (*ll)++; } } Directorio telefónico con manejo de archivos. #include #include #include #include #include

stdio.h conio.h ctype.h string.h stdlib.h

struct DIREC{ char nombre[35]; char tele[20]; } ; FILE void void long void void

*pack(FILE *a); ordena(FILE *a); consulta2(FILE *a); busca_Clave2(FILE *a,char buscado[]); lee(FILE *a); imprime(FILE *a);

void main(){ char opcion; FILE *archivo; archivo=fopen("TELE.DAT","rb+"); /* usar opción "wb+" para crear el archivo .DAT y después cambiar a "rb+" */ while(1){ clrscr(); Autor: ycarruido

27

20/08/yyyy

textattr(6+5*5); clrscr(); textcolor(YELLOW); cprintf(" TELEFONICO"); printf("\n\n"); cprintf(" N"); printf("uevo"); textcolor(YELLOW); cprintf(" L"); printf("ista"); textcolor(YELLOW); cprintf(" B"); printf("aja"); textcolor(YELLOW); cprintf(" C"); printf("onsulta"); textcolor(YELLOW); cprintf(" O"); printf("rdena"); textcolor(YELLOW); cprintf(" S"); printf("alir");

DIRECTORIO

gotoxy(1,25); printf(" *** PRESIONE LA LETRA RESALTADA PARA ESCOGER LA OPCION ***"); gotoxy(1,4); opcion=toupper(getch()); if(opcion=='S') break; switch(opcion){ case 'N':{ lee(archivo); break; } case 'L':{ imprime(archivo); break; } case 'B':{ pack(archivo); break; } case 'C':{ consulta2(archivo); break; } case 'O':{ ordena(archivo); Autor: ycarruido

28

20/08/yyyy

break; } } } clrscr(); fclose(archivo); normvideo(); clrscr(); } /********************************************************** ***********/ void imprime(FILE *a){ int r,y=0,c=1; struct DIREC reactivo; clrscr(); textcolor(YELLOW); cprintf("NOMBRE TELEFONO"); normvideo(); rewind(a); while(1){ r=fread(&reactivo,sizeof(struct DIREC),1,a); if(r==0) break; if((c%2)!=0){ textattr(6+5*5); /* textcolor(LIGHTGRAY);*/ printf("\n"); cprintf("%d.- %-30s %16s",c,reactivo.nombre,reactivo.tele); normvideo(); } else{ textattr(6+5*4); /* textcolor(WHITE);*/ printf("\n"); cprintf("%d.- %-30s %16s",c,reactivo.nombre,reactivo.tele); normvideo(); } if(y==23){ getch(); y=0; } y++; c++; } Autor: ycarruido

29

20/08/yyyy

getch(); } /********************************************************** ***********/ void lee(FILE *a){ struct DIREC reactivo; printf("\n\n"); fflush(stdin); printf("Nombre : ");strupr(gets(reactivo.nombre)); if(strlen(reactivo.nombre)<30){ if(busca_Clave2(a,reactivo.nombre)==0){ printf("Tel‚fono : ");gets(reactivo.tele); fseek(a,0,SEEK_END); fwrite(&reactivo,sizeof(struct DIREC),1,a); } else{ printf("\n\nYa existen esos datos!!!"); getch(); } } else{ printf("\n\nM ximo 25 letras por nombre..."); printf("\n\nEl programa puede da¤arse si repite este error!!!"); getch(); } } /********************************************************** ***********/ long busca_Clave2(FILE *a,char buscado[]){ long p; struct DIREC r; rewind(a); while(1){ if(fread(&r,sizeof(struct DIREC),1,a)==0) break; if(strcmp(r.nombre,buscado)==0){ p=ftell(a)/sizeof(struct DIREC); return(p); } } return 0; } Autor: ycarruido

30

20/08/yyyy

/********************************************************** ***********/ void consulta2(FILE *a){ char nombre[30]; long p; struct DIREC r; printf("\n\nDame el nombre a buscar: "); strupr(gets(nombre)); p=busca_Clave2(a,nombre); if(p!=0){ fseek(a,(p-1)*sizeof(struct DIREC),SEEK_SET); fread(&r,sizeof(struct DIREC),1,a); printf("\n\n\n"); textcolor(LIGHTGRAY); cprintf("NOMBRE TELEFONO"); normvideo(); printf("\n%-20s %30s",r.nombre,r.tele); getch(); } else{ printf("\n\nLa informaci¢n solicitada no existe ..."); getch(); } } /********************************************************** ***********/ void ordena(FILE *a){ int i=0,j=0,s,t; struct DIREC r; struct DIREC temp[100]; struct DIREC temporal; while(1){ fseek(a,i*sizeof(struct DIREC),SEEK_SET); if(fread(&r,sizeof(struct DIREC),1,a)==0) break; temp[j]=r; i++; j++; } for(s=0;s0){ temporal=temp[s]; Autor: ycarruido

31

20/08/yyyy

temp[s]=temp[t]; temp[t]=temporal; } s=0; i=0; while(1){ if(s>=j) break; r=temp[s]; fseek(a,i*sizeof(struct DIREC),SEEK_SET); fwrite(&r,sizeof(struct DIREC),1,a); s++; i++; } printf("\n\nSus archivos han sido ordenados alfab‚ticamente..."); getch(); } /********************************************************** ***********/ FILE *pack(FILE *a){ int i=0; long p; char clave[30]; struct DIREC r; FILE *t; t=fopen("TMP.DAT","wb"); printf("\n\nDame el nombre a dar de baja: "); strupr(gets(clave)); p=busca_Clave2(a,clave); if(p!=0){ while(1){ fseek(a,i*sizeof(struct DIREC),SEEK_SET); if(fread(&r,sizeof(struct DIREC),1,a)==0) break; if(strcmp(r.nombre,clave)!=0){ fseek(a,i*sizeof(struct DIREC),SEEK_SET); fwrite(&r,sizeof(struct DIREC),1,t); } i++; } fclose(t); fclose(a); Autor: ycarruido

32

20/08/yyyy

remove("TELE.DAT"); rename("TMP.DAT","TELE.DAT"); t=fopen("TELE.DAT","rb+"); printf("\n\nLa informaci¢n solicitada ha sido dada de baja..."); getch(); return(t); } else{ printf("\n\nNo existe el nombre..."); getch(); } return 0; } Basicos Ejemplo salida de datos #include <stdio.h> int main( ) { int i,j; i=3; j=4; printf("Hola el mundo \n"); printf("Valor i:%d \nValor j:%d \n",i,j); } /* Salida en pantalla: Hola el mundo Valor i:3 Valor j:4 */ Ejercicios salida datos 1. Del programa anterior elimine los \n que aparecen y vea que sucede 2. Del programa anterior modifique la linea printf("Valor i:\%d \nValor j:\n%d",i,j); por printf("Valor i:\%d \nValor j:\n%d",i); y vea que sucede

Autor: ycarruido

33

20/08/yyyy

Ejemplo captura de datos /* Programa de ejemplo de captura de un entero corto, un entero y un flotante */ #include <stdio.h> int main( ) { short s; int l; float f; printf("Introduzca un entero corto, un entero y un flotante separados por un espacio: \n") scanf("%hd %d %f",&s,&l,&f); } /* Después de haber introducido -123 999 y 99.0044 las variables s,l, y f tienen los valores -123 999 y 99.0044 */ Ejercicios captura de datos 1. Del programa anterior borre todos los caracteres "&" de la función scanf( ) y vea que sucede. 2. El programa anterior no despliega lo captura, modifique el programa de tal forma que despliegue lo capturado. 3. Cambie la línea scanf("%hd %d %f",&s,&l,&f); por scanf("%hd,%d,%f",&s,&l,&f); y vea lo que sucede 4. Prueba localidad variables #include <stdio.h> int global; int main ( ) { int l1,l2; printf("Introduzca tres valores enteros separados por un espacio:\n"); scanf("%d%d%d",&global,&l1,&l2);

Autor: ycarruido

34

20/08/yyyy

printf("Desplegado 1, valor de global,l1,l2:); printf("%d,%d,%d\n",global,l1,l2); { int global,l1; printf("Introduzca tres valores enteros separados por un espacio:\n"); scanf("%d%d%d",&global,&l1,&l2); printf("Desplegado 2, valor de global,l1,l2:"); printf("%d,%d,%d\n",global,l1,l2); } printf("Desplegado 3, valor de global,l1,l2:"); printf("%d,%d,%d\n",global,l1,l2); } Ejemplo operaciones aritméticas enteras /* Cálculo hora llegada de un vuelo */ #include <stdio.h> int main() { int hora, mins, segs; int tmpvol; printf(''De hora salida vuelo (hh mm ss):''); scanf(''%d%d%d'',&hora,&mins,&segs); printf(''Tiempo vuelo (en segundos):''); scanf(''%d'',&tmpvol); segs = segs + tmpvol; mins = mins + segs / 60; segs = segs % 60; hora = hora + mins / 60; mins = mins % 60; hora = hora % 24; printf(''Hora estimada llegada:''); printf(''%d hrs %d mins %d segs \n'',hora,mins,segs); }

Autor: ycarruido

35

20/08/yyyy

/* Cálculo del área de un triángulo y círculo */ #include <stdio.h> int main() { float base, altura; float area; float radio, pi; printf(''Valor de la base y altura:''); scanf(''%f%f'',&base,&altura); area = (base * altura)/2; printf(''El 'area del triangulo es: %f \n'',area); printf(''De el valor del radio:''); scanf(''%f'',&radio); pi = 3.151416; area = pi * radio * radio; printf(''El 'area del circulo es: %f \n'',area); } Ejemplo operador condicional /* Determina si un número es menor mayor o igual a cero */ #include <stdio.h> int main() { int x; printf(''De el valor de x:''); scanf(%d'',&x); if (x <= 0) { if (x== 0) printf(''N'umero igual a cero \n''); else printf(''Número MAYOR que cero \n''); } else printf(''Numero menor que cero \n''); }

Autor: ycarruido

36

20/08/yyyy

/* Determina el número más grande de entre tres */ #include <stdio.h> int main() { int i,j,k,mayor; printf(''De los valores i j k : ''); scanf(''%d%d%d'',&i,&j,&k); if (i > j) mayor = j; else mayor = i; if (mayor < k) mayor = k; printf(''El mas grande de (%d,%d,%d) es: %d \n'',i,j,k,mayor) }

Ejercicios operador condicional 1. Escribir un programa que permita jugar a doble o nada: El jugador apuesta una cantidad y tira una moneda. Si sale cara obtiene el doble de la cantidad apostada. Si sale cruz la pierde todo. 2. Escribir un programa que lea tres valores enteros y muestre por pantalla el máximo y el mínimo de ellos. 3. Escribir un programa que, pida la fecha de nacimiento (dia y numero de mes) de una persona e imprima por pantalla su signo zodiacal

Autor: ycarruido

37

20/08/yyyy

ESTRUCTURA GENERAL DEL switch Estructura general del switch switch (var) { case c1: case c2: break; case c3: case c4: Bloque 4 case c5: case c6: case c7: case c8: break; default: } Bloque 8

Bloque 1 Bloque 2 Bloque 3 Bloque 5 Bloque 6 Bloque 7

Opcion default no obligatoria. Ejemplo uso switch: un menu #include <stdio.h> int main() { int opcion; printf(''1> Mexico \n''); printf(''2> Francia \n''); printf(''3> Italia \n''); printf(''4> Inglaterra \n''); printf(''5> Barcelona \n''); printf(''Opcion: ''); scanf(''%d'',&opcion); switch (opcion) { case 1: printf(''Bueno \n''); break; case 2: printf(''Allo \n''); break; case 3: printf(''Pronto \n''); break; case 4: printf(''Hello \n''); break; case 5: printf(''Digi \n''); Autor: ycarruido

38

20/08/yyyy

break; } } #include <stdio.h> int main() { char letra; printf(''De una letra: ''); scanf(''%c'',&letra); switch (letra) { case 'a': case 'e': case 'i': case 'o': case 'u': printf(''Es una vocal minuscula\n''); break; case 'A': case 'E': case 'I': case 'O': case 'U': printf(''Es una vocal MAYUSCULA\n''); break; default: if( (letra>'a') && (letra<'z')) printf(''Consonante minuscula \n''); else printf(''Consonante MAYUSCULA \n''); } } Ejercicios 1. Escribir un programa que pida la nota de un examen (un nº real entre 0 y 10) e imprima en pantalla “Suspendido”, si la nota es menor que 5, “Aprobado” si está entre 5 inclusive y 7 sin incluir, “Notable” si está entre 7 inclusive y 9 sin incluir, “Sobresaliente” si está entre 9 inclusive y 10 sin incluir y “Matrícula de honor” si la nota es igual a 1. 2. Escribir un programa que, dado el número del mes, y el año (hay que considerar si el año es bisiesto) saque por pantalla el número de dias del mes.

Autor: ycarruido

39

20/08/yyyy

Autor: ycarruido

40

20/08/yyyy

Related Documents