700 likes | 796 Views
Capítulo 4 Program Input and the Software Design Process. Dale/Weems/Headington. Tópicos del Capítulo 4. Input Statements to Read Values for a Program using >> , and functions get , ignore , getline Prompting for Interactive Input/Output Using Data Files for Input and Output
E N D
Capítulo 4Program Input and the Software Design Process Dale/Weems/Headington
Tópicos del Capítulo 4 • Input Statements to Read Values for a Program using >>, and functions get, ignore, getline • Prompting for Interactive Input/Output • Using Data Files for Input and Output • Object-Oriented Design Principles • Functional Decomposition Methodology
Keyboard Screen executing program No I/O is built into C++ • instead, a library provides input stream and output stream istream ostream 3
<iostream> is header file • for a library that defines 3 objects an istream object named cin (keyboard) an ostream object named cout (screen) an ostream object named cerr (screen) 4
Asignando Valor a una Variable En un programa se le puede asignar (dar) un valor a una variable utilizando el “assignment operator” = Ejemplo: ageOfDog = 12; o por otro método como por ejemplo: cout << “How old is your dog?”; cin >> ageOfDog;
>> es un operador binario >> se le llama el operador de input o el operador de extración >> se asocia a la izquierda EXPRESSION HAS VALUE cin >> age cin STATEMENT cin >> age >> weight ; 6
Operador de Extración ( >> ) • La variable cin esta predefinida para indicar un “input stream from the standard input device”( El teclado) • El operadorde extración >> llamado “get from” toma 2 operandos. El operando de la izquierda es un “stream expression”, como por ejemplo cin. El operando de la derecha es una variable de un “data type” simple. • El operador >> trata de extraer el próximo ítem del “input stream" y almacena su valor en el operando de la derecha (variable). 7
Input Statements SYNTAXIS Estos dos ejemplos dan el mismo resultado. cin >> length ; cin >> width ; cin >> length >> width ; cin >> Variable >> Variable .. . ; 8
Caracteres no visibles incluyen . . . • espacios blancos • tabs • end-of-line (nueva linea) El caracter “newline” se crea al darle “Enter” o “Return”en el teclado, o al utilizar el manipulador “endl” o “\n” en un programa. 9
El Operador de Extración >> “skips over” (salta) (lee pero no almacena nada) descarta los caracteres “white space” según lee la data del “input stream” (ya sea teclado o un archivo en disco duro) 10
char first ; char middle ; char last ; cin >> first ; cin >> middle ; cin >> last ; NOTA: El pointer se mueve a la izquierda de una nueva línea despues del caracter “C”. Si en el teclado se entra:A[space]B[space]C[Enter] first middle last ‘A’ ‘B’ ‘C’ first middle last 11
age initial bill age initial bill int age ; char initial ; float bill ; cin >> age ; cin >> initial ; cin >> bill ; NOTA: El pointer se mueve a la izquierda de una nueva línea despues del caracter 2 en el “input stream”. Si en el teclado se entra:[space]25[space]J[space]2[Enter] OJO 25 ‘J’ 2.0 12
output data input data executing program Keyboard Screen cin (of type istream) cout (of type ostream) Keyboard and Screen I/O #include <iostream> 13
NOTA: muestra la localización del pointer de lectura (“marker position”) i ch x i ch x 25 ‘A’ i ch x 25 ‘A’ i ch x STATEMENTS CONTENTS MARKER POSITION int i ; 25 A\n char ch ; 16.9\n float x ; cin >> i ; 25A\n 16.9\n cin >> ch ; 25 A\n 16.9\n cin >> x ; 25 A\n 16.9\n Otro Ejemplo utilizando >> 25 16.9 14
Otra Forma de Leer Caracteres La función get( )puede ser utilizadapara leer un solo caracter. Obtiene el próximo caracter del “input stream” sin saltar los caracteres “whitespace”.(espacio en blanco, tab, etc.)
char first ; char middle ; char last ; cin.get ( first ) ; cin.get ( middle ) ; cin.get ( last ) ; NOTA: El pointer se va a localizar en el espacio en blanco despues de la “B”. Si en el teclado se entra:A[space]B[space]C[Enter] first middle last ‘A’ ‘ ’ ‘B’ first middle last 16
Utilize la función ignore( )para saltar caracteres La función ignore( )se utiliza para saltar (leer y descartar) caracteres en el “input stream”. La llamada (call) cin.ignore ( howMany, whatChar ) ; Va a saltar howMany caracteres o hasta que whatChar sea leído, lo que ocurra primero.
NOTA: muestra la localización del pointer de lectura (“marker position”) a b c 957 34 a b c 957 34 a b c 957 34 128 a b c STATEMENTS CONTENTS MARKER POSITION int a ; 957 34 1235\n int b ; 128 96\n int c ; cin >> a >> b ; 957 34 1235\n 128 96\n cin.ignore(100, ‘\n’) ; 957 34 1235\n 128 96\n cin >> c ; 957 34 1235\n 128 96\n Un Ejemplo Utilizando cin.ignore( ) 18
NOTE: muestra la localización del pointer de lectura (“marker position”) 957 34 ‘A’ 957 34 ‘A’ 957 16 34 ‘A’ STATEMENTS CONTENTS MARKER POSITION int i ; A 22 B 16 C 19\n char ch ; cin >> ch ; A 22 B 16 C 19\n cin.ignore(100, ‘B’) ; A 22 B 16 C 19\n cin >> i ; A 22 B 16 C 19\n Otro Ejemplo Usando cin.ignore( ) i ch i ch i ch i ch 19
“String Input” en C++ Es posible pedir por Input un “string” utilizando el operador de extración >>. EJEMPLO: string message ; cin >> message ; cout << message ; SIN EMBARGO . . .
Operator de Extración >> Al utilizar el operador de extración ( >> ) para leer caracteres de “input” dentro de una variable tipo “string”: • el operador >> salta cualquier caracter tipo “whitespace” tales como espacios en blanco y “newlines”. • Lee caracteres sucesivamente en el “string” y se detiene cuando encuentre el primer caracter “whitespace” (que no lo descarta, sino que se queda ahi en espera. “input stream”)
“String Input” Usando >> string firstName ; string lastName ; cin >> firstName >> lastName ; Asuma que el “input stream” tiene lo siguiente: JoeHernandez 23 ¿Cuáles serían los valores para las variables?
Resultados Usando >> string firstName ; string lastName ; cin >> firstName >> lastName ; RESULTADO “J o e” “Hernandez” firstName lastName
Función getline( ) • Debido a que el operador de extración se detiene al leer el primer caracter ”whitespace”, >>no se puede usar para entrar un “string” que contenga espacios en blanco • Se puede usar la función con 2 argumentos para eliminar este obstaculo • El primer argumento es una variable “input stream”, y el segundo argumento es una variable tipo “string” EJEMPLO string message ; getline (cin, message ) ;
getline(inFileStream, str) • getline no salta caracteres “whitespace” tales como espacios en blanco, “newlines”, etc • getline lee los caracteres sucesivamente (including espacios en blanco y se detiene cuando encuentra el caracter “newline” (‘\n’) • Ese caracter ”newline” es consumido por el get, pero no se almacena en la variable
“String Input” Usando getline string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName ); Asuma que el “input stream” tiene lo siguiente: JoeHernandez 23 ¿Cuáles serían los valores para las variables?
Resultados Usado getline string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName ); “ JoeHernandez 23” ? firstName lastName
Interactive I/O • En un programa interactivo, el usuario entra información mientras se esta ejecutando • Antes de que el usuario entre data, un prompt debe ser proveído para que explique el tipo de información que se desea solicitar. • Despues que el usuario entra los datos, el valor debe ser impreso para verificación y cotejo. A esto se le dice “echo printing“ • De esta forma el usuario puede cotejar si entro incorrectamente los datos. 28
Ejemplo de código Interactivo(I/O) cout << “Enter part number : “ << endl ; // prompt cin >> partNumber ; cout << “Enter quantity ordered : “ << endl ; cin >> quantity ; cout << “Enter unit price : “ << endl ; cin >> unitPrice ; totalPrice = quantity * unitPrice ;// calculate cout << “Part # “ << partNumber << endl ; // echo cout << “Quantity: “ << quantity << endl ; cout << “Unit Cost: $ “ << setprecision(2) << unitPrice << endl ; cout << “Total Cost: $ “ << totalPrice << endl ; 29
LABORATORIO15 - MINUTOS Utilizando las intrucciones del slide anterior, hacer un programa y correrlo. Verifique que los resultados estén correctos.
input data output data disk file “A:\myInfile.dat” disk file “A:\myOut.dat” executing program your variable (of type ifstream) your variable (of type ofstream) Archivos en disco para I/O #include <fstream> 31
Para usar el Disco (I/O), se necesita • utilizar #include <fstream> • Escojer identifiers válidos para el “filestreams” y declararlos • Abrir los archivos y asociarlos con el nombre en disco • Utilizar los “filestream identifiers” en las instrucciones de I/O (usar >> y << , manipuladores, get, ignore) • Cerrar los archivos 32
“Statements” para hacer I/O en el Disco #include <fstream> ifstream myInfile; // declarations ofstream myOutfile; myInfile.open(“A:\\myIn.dat”);// open files myOutfile.open(“A:\\myOut.dat”); myInfile.close( ); // close files myOutfile.close( ); 33
¿Que hace el abrir un archivo? • Asocia el identifier de C++ con el archivo físico en el disco. • Si el archivo de input no existe, el open no se puede ejecutar. No fue exitoso. • Si el archivo de output no existe, se crea uno nuevo. • Si el archivo de output ya existia, se borra y se queda en blanco. • Coloca un “file reading marker” al principio del archivo, apuntanto al primer caracter. 34
Lectura de Archivos La instrucción ifstream se utiliza para definir archivos de input LECTURA #include <fstream> Permite el manejo de archivos. IfstreamNombreArchivo; Definir nombre lógico e indicarque es de Input. NombreArchivo.open(“NombreFísico”); Abrir el archivo.Se indica también su localización física(“Path”). NombreArchivo >> valor; Lee un dato del archivo. NombreArchivo.close(); Cierra el archivo.
Escritura de Archivos La instrucción ofstream se utiliza para definir archivos de output. ESCRITURA #include <fstream> Permite el manejo de archivos. ofstreamNombreArchivo; Definir nombre lógico e indicar que es de Output. NombreArchivo.open(“NombreFísico”); Abrir el archivo. Se indica también su localización física. NombreArchivo << valor; Escribe un dato en el archivo. NombreArchivo.close(); Cierra el archivo.
Laboratorios - 20 minutosPasar y probar los siguientes programasPrograma Rectángulo completo //******************************************************************* // Programa rectángulo // Calcula el área de un rectángulo, lee el input de un archivo //******************************************************************* #include <iostream> #include <fstream> // manejo de archivos #include <iomanip> using namespace std; // Prototipos de Funciones float CalcArea (float altura, float base); void MostrarResultados (float area); int main() { float alto, ancho, AreaRectangulo; ifstream archNumeros; // Definir archivo de input ArchNumeros.open(“A:\numeros.dat”); // Abre el archivo en el path // indicado ArchNumeros >> alto >> ancho; // Lee de disco los dos datos ArchNumeros.close(); // Cerrar el archivo AreaRectangulo = CalcArea(alto, ancho); MostrarResultados(AreaRectangulo); return 0; } //******************************************************************* float CalcArea(float altura, float base) // Function Heading { return altura * base; } //******************************************************************* void MostrarResultados(float area) // Function Heading { cout << fixed << showpoint << setprecision(3); cout << “El área es “ << area << “ metros cuadrados “ << endl; }
Programa Rectángulo (main) //******************************************************************* // Programa rectángulo // Calcula el área de un rectángulo, lee el input de un archivo //******************************************************************* #include <iostream> #include <fstream> // manejo de archivos #include <iomanip> usingnamespace std; // Prototipos de Funciones float CalcArea (float altura, float base); void MostrarResultados (float area); int main() { floatalto, ancho, AreaRectangulo; ifstream archNumeros; // Definir archivo de input ArchNumeros.open(“A:\numeros.dat”); // Abre el archivo en el path indicado ArchNumeros >> alto >> ancho; // Lee de disco los dos datos ArchNumeros.close(); // Cerrar el archivo AreaRectangulo = CalcArea(alto, ancho); MostrarResultados(AreaRectangulo); return 0; }
Programa Rectángulo (cont.) //******************************************************************* float CalcArea(float altura, float base) // Function Heading { return altura * base; } //******************************************************************* void MostrarResultados(float area) // Function Heading { cout << fixed << showpoint << setprecision(3); cout << “El área es “ << area << “ metros cuadrados “ << endl; }
PROGRAMA 2 - Programa Salario completo //******************************************************************* // Programa Salario.cpp // Calcula el salario semanal de un empleado las horas extras se pagan a tiempo y medio //******************************************************************* #include <iostream> #include <fstream // manejo de archivos #include <iomanip> using namespace std; // Prototipos de Funciones float CalcSalario (float horas, float paga); void MostrarResultados (float salario); int main() { float HorasTrabajadas, PagoPorHora, SalarioSemanal; ifstream ArchEmpleado; // Definir archivo de input ArchEmpleado.open(“A:\empleado.dat”); // Abre el archivo en el path indicado ArchEmpleado >> PagoPorHora >> HorasTrabajadas; // Lee de disco los dos datos ArchEmpleado.close(); // Cerrar el archivo SalarioSemanal = CalcSalario(HorasTrabajadas, PagoPorHora); MostrarResultados(SalarioSemanal); return 0; } //******************************************************************* float CalcSalario(float horas, float paga) // Function Heading { if (horas <= 40) return horas * paga; else return (40 * paga) + (horas – 40) * 1.5 * paga; } //******************************************************************* void MostrarResultados(float salario) // Function Heading { cout << fixed << showpoint << setprecision(2); cout << “Su salario es $“ << salario << endl; }
Programa Salario (main) //******************************************************************* // Programa Salario.cpp // Calcula el salario semanal de un empleado las horas extras se // pagan a tiempo y medio //******************************************************************* #include <iostream> #include <fstream // manejo de archivos #include <iomanip> using namespace std; // Prototipos de Funciones float CalcSalario (float horas, float paga); void MostrarResultados (float salario); int main() { float HorasTrabajadas, PagoPorHora, SalarioSemanal; ifstream ArchEmpleado; // Definir archivo de input ArchEmpleado.open(“A:\empleado.dat”); // Abre el archivo en el path indicado ArchEmpleado >> PagoPorHora >> HorasTrabajadas; //Lee de disco los dos datos ArchEmpleado.close(); // Cerrar el archivo SalarioSemanal = CalcSalario(HorasTrabajadas, PagoPorHora); MostrarResultados(SalarioSemanal); return 0; }
Programa Salario (cont.) //******************************************************************* float CalcSalario(float horas, float paga) // Function Heading { if (horas <= 40) return horas * paga; else return (40 * paga) + (horas – 40) * 1.5 * paga; } //******************************************************************* void MostrarResultados(float salario) // Function Heading { cout << fixed << showpoint << setprecision(2); cout << “Su salario es $“ << salario << endl; }
PROGRAMA 3 - Programa Nota completo //******************************************************************* // Programa Nota.cpp // Calcula el promedio y nota del estudiante // Almacena los resultados en un archivo //******************************************************************* #include <iostream> #include <fstream // manejo de archivos #include <iomanip> using namespace std; // Prototipos de Funciones float CalcPromedio (float valor1, float valor2, float valor3); char DeterminarNota(float promedio); int main() { ifstream ArchEstudiante; //Input File ofstream ArchNota; // output File int NumEstudiante; float examen1, examen2, examen3, promedio; char nota; ArchEstudiante.open (“a:\\estudiante.dat”); ArchNota.open (“a:\\nota.dat”); ArchEstudiante >> NumEstudiante >>examen1 >> examen2 >> examen3; promedio = Calcpromedio(examen1, examen2, examen3); nota = DeterminarNota(promedio); ArchNota << fixed << showpoint << set presicion(1); ArchNota << NumeroEstudiante << “ “ << promedio << “ “ << nota << endl; ArchEstudiante.close(); // El cerrar estos archivos es opcional ArchNota.close(); // return 0; } //******************************************************************* float Calcpromedio(float valor1, float valor2, float valor3) // Function Heading { return (valor1 + valor2 + valor3) / 3; } //******************************************************************* char DeterminarNota(float promedio) // Function Heading { if (promedio >= 90) return ‘A’; else if (promedio >= 80) return ‘B’; else if (promedio >= 70) return ‘C’; else if (promedio >= 60) return ‘D’; else return ‘F’; }
Programa Nota (main) //************************************************************************************************** // Programa Nota.cpp // Calcula el promedio y nota del estudiante Almacena los resultados en un archivo //************************************************************************************************** #include <iostream> #include <fstream // manejo de archivos #include <iomanip> using namespace std; // Prototipos de Funciones float CalcPromedio (float valor1, float valor2, float valor3); char DeterminarNota(float promedio); int main() { ifstream ArchEstudiante; //Input File ofstream ArchNota; // output File int NumEstudiante; float examen1, examen2, examen3, promedio; char nota; ArchEstudiante.open (“a:\\estudiante.dat”); ArchNota.open (“a:\\nota.dat”); ArchEstudiante >> NumEstudiante >>examen1 >> examen2 >> examen3; promedio = Calcpromedio(examen1, examen2, examen3); nota = DeterminarNota(promedio); ArchNota << fixed << showpoint << set presicion(1); ArchNota << NumeroEstudiante << “ “ << promedio << “ “ << nota << endl; ArchEstudiante.close(); // El cerrar estos archivos es opcional ArchNota.close(); return 0; }
Programa Nota (cont.) //******************************************************************* float Calcpromedio(float valor1, float valor2, float valor3) // Function Heading { return (valor1 + valor2 + valor3) / 3; } //******************************************************************* char DeterminarNota(float promedio) // Function Heading { if (promedio >= 90) return ‘A’; else if (promedio >= 80) return ‘B’; else if (promedio >= 70) return ‘C’; else if (promedio >= 60) return ‘D’; else return ‘F’; }
Map Measurement Case Study(Ejemplo del capítulo anterior con manejo de archivos. De referencia únicamente) You want a program to determine walking distances between 4 sights in the city. Your city map legend says one inch on the map equals 1/4 mile in the city. Read from a file the 4 measured distances between sights on the map and the map scale. Output to a file the rounded (to the nearest tenth) walking distances between the 4 sights.
Using File I/O // *************************************************** // Walk program using file I/O // This program computes the mileage (rounded to nearest // tenth of mile) for each of 4 distances, using input // map measurements and map scale. // *************************************************** #include <iostream> // for cout, endl #include <iomanip> // for setprecision #include <iostream> // for file I/O using namespace std; float RoundToNearestTenth( float ); // declare function
int main( ) { float distance1; // First map distance float distance2; // Second map distance float distance3; // Third map distance float distance4; // Fourth map distance float scale; // Map scale (miles/inch) float totMiles; // Total of rounded miles float miles; // One rounded mileage ifstream inFile; // First map distance ofstream outFile; // Second map distance outFile << fixed << showpoint // output file format << setprecision(1); // Open the files inFile.open(“walk.dat”); outFile.open(“results.dat”);
// Get data from file inFile >> distance1 >> distance2 >> distance3 >> distance4 >> scale; totMiles = 0.0; // Initialize total miles // Compute miles for each distance on map miles = RoundToNearestTenth( distance1 * scale ); outFile << distance1 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles;
miles = RoundToNearestTenth( distance2 * scale ); outFile << distance2 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles; miles = RoundToNearestTenth( distance3 * scale ); outFile << distance3 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles; miles = RoundToNearestTenth( distance4 * scale ); outFile << distance4 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles;