Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Proyecto de C

Estas en el tema de Proyecto de C en el foro de C/C++ en Foros del Web. Buenas. Tengo pendiente este proyecto y necesito ayuda. por lo menos para orientarme a como se trabaja con esto... cabe destacar que es solo usando ...
  #1 (permalink)  
Antiguo 26/04/2016, 22:21
 
Fecha de Ingreso: abril-2016
Mensajes: 4
Antigüedad: 8 años, 6 meses
Puntos: 0
Proyecto de C

Buenas. Tengo pendiente este proyecto y necesito ayuda. por lo menos para orientarme a como se trabaja con esto... cabe destacar que es solo usando la biblioteca stdio.h . Graicas

Parte 1
La empresa BUENA SUERTE en su campaña denominada CONOCE TU UNIVERSIDAD desea enviar información a la comunidad universitaria a través de SMS. SMS es un servicio disponible en teléfonos móviles que permite el envío y la recepción de mensajes con un tamaño máximo de 160 caracteres por envío. Actualmente, la empresa BUENA SUERTE ha contratado a la empresa EMPRENDIMIENTO para que realice los envíos de mensajes.
La empresa EMPRENDIMIENTO requiere que la información le sea suministrada con un formato específico que difiere del formato que emite la empresa BUENA SUERTE. Como la empresa EMPRENDIENTO es nueva, ha firmado el contrato, ignorando que los formatos
son incompatibles. Ahora, la empresa EMPRENDIMIENTO necesita urgentemente que su problema sea solucionado y todavía no encuentra a un profesional. La primera parte del proyecto de este semestre consiste en solucionarle el problema a la empresa EMPRENDIMIENTO y para ello se debe codificar, compilar y ejecutar el algoritmo para convertir el formato suministrado por la empresa BUENA SUERTE al formato requerido. El algoritmo debe ser codificado en lenguaje C, utilizando las normas técnicas de los algoritmos
computacionales, haciendo uso únicamente de la biblioteca stdio.h. Un archivo generado automáticamente por la empresa BUENA SUERTE denominado entrada.txt y un archivo generado manualmente por la empresa EMPRENDIMIENTO denominado salida.txt es lo único que usted tiene para comenzar.

Parte 2
La junta directiva de la empresa BUENA SUERTE ha decidido que toda la información enviada a la empresa EMPRENDIMIENTO debe estar codificada. La segunda parte de este proyecto consiste en decodificar el archivo nuevaEntrada.txt, para obtener entrada.txt


Archivo de Entrada:

<MENSAJES> <MENSAJE> <DESTINATARIO> 04262742003 </DESTINATARIO> <TEXTO> Los orígenes de la Universidad de Los Andes se remonta al año de 1785, cuando Fray Juan Ramos de Lora, primer obispo de Mérida, funda en esta ciudad una casa de educación para los jóvenes con vocación por la carrera sacerdotal donde se les impartiría clases de religión, lengua latina y moral. Dos años después esta casa fue convertida en Seminario Tridentino y en 1789 se le dio el título de Real Colegio Seminario de San Buenaventura. En 1806, ya consolidado el instituto, el rey Carlos IV lo autoriza para conferir grados mayores y menores en Filosofía, Teología y Cánones, como si fuera una universidad, aunque no le otorga tal categoría. </TEXTO> </MENSAJE> <MENSAJE> <DESTINATARIO> 04262777452 </DESTINATARIO> <TEXTO> El 21 de Septiembre de 1810 la Junta Superior que gobernaba en Mérida le otorga al Seminario el ansiado Título de “Real Universidad de San Buenaventura de Mérida de los Caballeros”. En 1812 un gran terremoto destruye la ciudad y al año siguiente el Seminario- Universidad es trasladado a Maracaibo donde comienza a funcionar en 1815 sólo como Seminario. En 1821 el Seminario-Universidad retorna a Mérida. En 1824 a la Universidad se le da la denominación de Academia de Mérida (también le dicen Colegio de Mérida), pero se impone el nombre de Universidad de Mérida. En 1832 el gobierno nacional ordena la redacción de los primeros estatutos de esta Universidad, con lo cual Seminario y Universidad quedan separados igualmente, aunque quedan funcionando en el mismo edificio. </TEXTO> </MENSAJE> <MENSAJE> <DESTINATARIO> 04147486538 </DESTINATARIO> <TEXTO> El 21 de septiembre de 1872 el Presidente Antonio Guzmán Blanco decreta la extinción de los Seminarios en todo el territorio venezolano y la entrega de sus bienes a las escuelas de artes y oficios que se establezcan. Al entregar el Seminario en 1875 el edificio donde funcionaba, la Universidad de Mérida tuvo que desalojar y mudarse a otro inmueble, pero en 1877 el gobierno del General Francisco Linares Alcántara ordena el retorno de la Universidad a su antigua sede la cual le es traspasada definitivamente. </TEXTO> </MENSAJE> <MENSAJE> <DESTINATARIO> 04147361767 </DESTINATARIO> <TEXTO> El 24 de septiembre de 1883, estando de nuevo Guzmán Blanco en la presidencia de la República ordena la venta de todos los bienes de la Universidad de Mérida, con lo cual ésta se arruina y pasa a depender completamente del presupuesto del Estado. En esa misma fecha el gobierno le cambia el título a la Universidad de Mérida por el de Universidad de Los Andes. En 1904 el gobierno del General Cipriano Castro le da la denominación de Universidad Occidental y en 1905 se le restituye, ahora sí definitivamente, su denominación actual de Universidad de Los Andes. </TEXTO> </MENSAJE> </MENSAJES>

Archivo de Salida:

DESTINATARIO: 04262742003
TEXTO: (1/5) Los orígenes de la Universidad de Los Andes se remonta al año de 1785, cuando Fray Juan Ramos de Lora, primer obispo de Mérida, funda en esta ciudad

DESTINATARIO: 04262742003
TEXTO: (2/5) una casa de educación para los jóvenes con vocación por la carrera sacerdotal donde se les impartiría clases de religión, lengua latina y moral. Dos

DESTINATARIO: 04262742003
TEXTO: (3/5) años después esta casa fue convertida en Seminario Tridentino y en 1789 se le dio el título de Real Colegio Seminario de San Buenaventura. En 1806, ya

DESTINATARIO: 04262742003
TEXTO: (4/5) consolidado el instituto, el rey Carlos IV lo autoriza para conferir grados mayores y menores en Filosofía, Teología y Cánones, como si fuera una

DESTINATARIO: 04262742003
TEXTO: (5/5) universidad, aunque no le otorga tal categoría.

DESTINATARIO: 04262777452
TEXTO: (1/6) El 21 de Septiembre de 1810 la Junta Superior que gobernaba en Mérida le otorga al Seminario el ansiado Título de “Real Universidad de San

DESTINATARIO: 04262777452
TEXTO: (2/6) Buenaventura de Mérida de los Caballeros”. En 1812 un gran terremoto destruye la ciudad y al año siguiente el Seminario- Universidad es trasladado a

DESTINATARIO: 04262777452
TEXTO: (3/6) Maracaibo donde comienza a funcionar en 1815 sólo como Seminario. En 1821 el Seminario-Universidad retorna a Mérida. En 1824 a la Universidad se le da

DESTINATARIO: 04262777452
TEXTO: (4/6) la denominación de Academia de Mérida (también le dicen Colegio de Mérida), pero se impone el nombre de Universidad de Mérida. En 1832 el gobierno

DESTINATARIO: 04262777452
TEXTO: (5/6) nacional ordena la redacción de los primeros estatutos de esta Universidad, con lo cual Seminario y Universidad quedan separados igualmente, aunque

DESTINATARIO: 04262777452
TEXTO: (6/6) quedan funcionando en el mismo edificio.

DESTINATARIO: 04147486538
TEXTO: (1/4) El 21 de septiembre de 1872 el Presidente Antonio Guzmán Blanco decreta la extinción de los Seminarios en todo el territorio venezolano y la entrega de

DESTINATARIO: 04147486538
TEXTO: (2/4) sus bienes a las escuelas de artes y oficios que se establezcan. Al entregar el Seminario en 1875 el edificio donde funcionaba, la Universidad de Mérida

DESTINATARIO: 04147486538
TEXTO: (3/4) tuvo que desalojar y mudarse a otro inmueble, pero en 1877 el gobierno del General Francisco Linares Alcántara ordena el retorno de la Universidad a su

DESTINATARIO: 04147486538
TEXTO: (4/4) antigua sede la cual le es traspasada definitivamente.

DESTINATARIO: 04147361767
TEXTO: (1/4) El 24 de septiembre de 1883, estando de nuevo Guzmán Blanco en la presidencia de la República ordena la venta de todos los bienes de la Universidad de

DESTINATARIO: 04147361767
TEXTO: (2/4) Mérida, con lo cual ésta se arruina y pasa a depender completamente del presupuesto del Estado. En esa misma fecha el gobierno le cambia el título a la

DESTINATARIO: 04147361767
TEXTO: (3/4) Universidad de Mérida por el de Universidad de Los Andes. En 1904 el gobierno del General Cipriano Castro le da la denominación de Universidad

DESTINATARIO: 04147361767
TEXTO: (4/4) Occidental y en 1905 se le restituye, ahora sí definitivamente, su denominación actual de Universidad de Los Andes.

Disculpen lo largo. Gracias de Antemano
  #2 (permalink)  
Antiguo 27/04/2016, 00:47
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Proyecto de C

Y exactamente que tienes hecho? En que parte quieres que te ayudemos?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 27/04/2016, 05:35
 
Fecha de Ingreso: abril-2016
Mensajes: 4
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Proyecto de C

Esto es lo que llevo


DESTINATARIO: 04262742003
TEXTO:(1/) Los orígenes de la Universidad de Los Andes se remonta al año de 1785, cuando Fray Juan Ramos de Lora, primer obispo de Mérida, funda en esta ciudad una

DESTINATARIO:
TEXTO:() casa de educación para los jóvenes con vocación por la carrera sacerdotal donde se les impartiría clases de religión, lengua latina y moral. Dos años

DESTINATARIO:
TEXTO:() después esta casa fue convertida en Seminario Tridentino y en 1789 se le dio el título de Real Colegio Seminario de San Buenaventura. En 1806, ya

DESTINATARIO:
TEXTO:() consolidado el instituto, el rey Carlos IV lo autoriza para conferir grados mayores y menores en Filosofía, Teología y Cánones, como si fuera una

DESTINATARIO:
TEXTO:() universidad, aunque no le otorga tal categoría.

DESTINATARIO: 04262777452
TEXTO:(1/) El 21 de Septiembre de 1810 la Junta Superior que gobernaba en Mérida le otorga al Seminario el ansiado Título de “Real Universidad de San Buenaventura de

DESTINATARIO:
TEXTO:() Mérida de los Caballeros”. En 1812 un gran terremoto destruye la ciudad y al año siguiente el Seminario- Universidad es trasladado a Maracaibo donde

DESTINATARIO:
TEXTO:() comienza a funcionar en 1815 sólo como Seminario. En 1821 el Seminario-Universidad retorna a Mérida. En 1824 a la Universidad se le da la denominación de

DESTINATARIO:
TEXTO:() Academia de Mérida (también le dicen Colegio de Mérida), pero se impone el nombre de Universidad de Mérida. En 1832 el gobierno nacional ordena la

DESTINATARIO:
TEXTO:() redacción de los primeros estatutos de esta Universidad, con lo cual Seminario y Universidad quedan separados igualmente, aunque quedan funcionando en el

DESTINATARIO:
TEXTO:() mismo edificio.

DESTINATARIO: 04147486538
TEXTO:(1/) El 21 de septiembre de 1872 el Presidente Antonio Guzmán Blanco decreta la extinción de los Seminarios en todo el territorio venezolano y la entrega de sus

DESTINATARIO:
TEXTO:() bienes a las escuelas de artes y oficios que se establezcan. Al entregar el Seminario en 1875 el edificio donde funcionaba, la Universidad de Mérida tuvo que

DESTINATARIO:
TEXTO:() desalojar y mudarse a otro inmueble, pero en 1877 el gobierno del General Francisco Linares Alcántara ordena el retorno de la Universidad a su antigua sede

DESTINATARIO:
TEXTO:() la cual le es traspasada definitivamente.

DESTINATARIO: 04147361767
TEXTO:(1/) El 24 de septiembre de 1883, estando de nuevo Guzmán Blanco en la presidencia de la República ordena la venta de todos los bienes de la Universidad de

DESTINATARIO:
TEXTO:() Mérida, con lo cual ésta se arruina y pasa a depender completamente del presupuesto del Estado. En esa misma fecha el gobierno le cambia el título a la

DESTINATARIO:
TEXTO:() Universidad de Mérida por el de Universidad de Los Andes. En 1904 el gobierno del General Cipriano Castro le da la denominación de Universidad Occidental y

DESTINATARIO:
TEXTO:() en 1905 se le restituye, ahora sí definitivamente, su denominación actual de Universidad de Los Andes.


me faltaria colocar que si (texto1/5), (Texto 2/5) y asi..... y ademas que salgan los destinatarios completos... es lo que me hace falta... Gracias
  #4 (permalink)  
Antiguo 27/04/2016, 05:36
 
Fecha de Ingreso: abril-2016
Mensajes: 4
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Proyecto de C

Cita:
Iniciado por Malenko Ver Mensaje
Y exactamente que tienes hecho? En que parte quieres que te ayudemos?
alli esta lo que llevo Amigo. Gracias
  #5 (permalink)  
Antiguo 27/04/2016, 05:42
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Proyecto de C

Cita:
Iniciado por damp_97 Ver Mensaje
alli esta lo que llevo Amigo. Gracias
O tengo el C muy oxidado o ahí no he visto ni una sola línea de código...
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 27/04/2016, 05:54
 
Fecha de Ingreso: abril-2016
Mensajes: 4
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Proyecto de C

Cita:
Iniciado por Malenko Ver Mensaje
O tengo el C muy oxidado o ahí no he visto ni una sola línea de código...
Disculpa Amigo... lo te que tengo de Codigo es el siguiente

#include <stdio.h>

#define token1 "<DESTINATARIO>"
#define token2 "<TEXTO>"
#define token3 "</TEXTO>"

int main() {
FILE *fp;
FILE* arch;
char linea[150];
int l160, suma, fin;
arch = fopen ("entrada.txt", "r");
fp = fopen ("salida.txt", "w");
while (fscanf (arch, "%s", linea) != EOF) {
if (compTexto(linea,token1)){

fprintf(fp, "\n");
fprintf(fp, "%s", "DESTINATARIO: ");
fscanf (arch, "%s", linea);
fprintf(fp, "%s\r", linea);
}

if (compTexto(linea,token2)){
fprintf(fp, "%s", "\nTEXTO:(1/) ");

l160 = 0;
while (fscanf (arch, "%s", linea) != compTexto(linea,token3)){

fin = longTexto(linea) + 1;
suma = l160 + fin;

if (suma < 160){
fprintf(fp, "%s ", linea);
l160 = suma;
}
else{
fprintf(fp, "\n");
fprintf(fp, "%s", "\nDESTINATARIO: ");
fprintf(fp, "%s", "\nTEXTO:() ");
fprintf(fp, "%s ", linea);
l160 = fin;
}
}
fprintf(fp, "\n");
}
}
fclose(fp);
return 0;
}

int compTexto(char c1[ ], char c2[ ]){
int k = 0;
while ((c1[k] != '\0') && (c2[k] != '\0') && (c1[k] == c2[k]))
k++;
return ((c1[k] == '\0') && (c2[k] == '\0')) ;
}

int longTexto(char c[ ]){
int k = 0;
while (c[k] != '\0')
k++;
return k;
}

No necesito que el codigo sea eficiente... solo que haga lo que se pide
  #7 (permalink)  
Antiguo 27/04/2016, 06:49
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Proyecto de C

Nombres de variables

¿a tí te parece que el nombre arch sobreentiende que sirve para gestionar el fichero de entrada? ¿y fp el de salida?

A mi al menos no. Te recomiendo utilizar nombres que sean significativos si no quieres volverte loco en cuanto el programa crezca un poco.

Buffers

Código C:
Ver original
  1. char linea[150];
  2. while (fscanf (arch, "%s", linea) != EOF) {

Por lo que has puesto en tu primer mensaje el fichero de entrada tiene líneas de longitud aleatoria... eso si no resulta que está todo en una sola línea.

¿Qué sucede si intentas almacenar en linea más de 149 caracteres? En el mejor de los casos que el programa fallará y se cerrará. En el peor de los casos seguirá funcionando pero habrás pisado memoria que no te corresponde, luego su comportamiento a partir de ese momento será errático.

Comparación de cadenas

Código C:
Ver original
  1. if (compTexto(linea,token1)){

En línea con el apartado anterior. En el fichero de entrada no veo que los tokens sean los únicos elementos en una línea luego esa comparación va a fallarte siempre.

Ideas
Si sabes que el fichero de entrada tiene un formato específico crea funciones para leerlo. Por ejemplo, sabes que el fichero se estructura en tokens y que los tokens empiezan con '<', pues para empezar yo crearía una función que me permitiese buscar caracteres en una cadena. Algo del tipo:

Código C:
Ver original
  1. char* BuscarEnCadena(char* ptr, char caracter);

Donde ptr sería un puntero a una cadena de texto y en caracter indicas el item que quieres buscar.

Es importante que te devuelva un puntero a la posición del caracter o NULL si no hay más ocurrencias.

Vale, ya has localizado el posible inicio de un token (digo posible porque nada impide poner ese caracter entre medias). Ahora habría que averiguar qué token es.

Lo más limpio es usar un enumerado y una función:

Código C:
Ver original
  1. typedef enum
  2. {
  3.   Ninguno,
  4.   Mensajes,
  5.   FinMensajes
  6.   Mensaje,
  7.   FinMensaje
  8.   Destinatario,
  9.   FinDestinatario
  10.   Texto
  11.   FinTexto
  12. } Tokens;
  13.  
  14. Tokens CheckToken(char* ptr);

¿Por qué usar un enumerado?
  • Por que el código que queda es más limpio.
  • Porque los enumerados se pueden comparar con ==
  • Porque los enumerados se pueden usar en una sentencia switch
  • Porque si te equivocas al escribir un enumerado el compilador te avisa con un error

La función simplemente tendría que verificar si ptr contiene alguno de los tokens y devolvería el valor del enum que correspondiese.

Recapitulando, ya puedes localizar caracters determinados en una cadena y puedes comprobar el tipo de token. ¿Qué tal una función para extraer el contenido entre dos punteros?

Código C:
Ver original
  1. void CopiaString(char* inicio, char* fin, char* destino);

La idea es la siguiente:
  • Localizar dónde termina el token Destinatario
  • Localizar dónde empieza el token /Destinatario
  • Copiar lo que hay entre medias, que al fin y al cabo es la información que te interesa.
  • Repetir los pasos anteriores para Texto

Y con esto prácticamente ya tendrías la lectura del fichero de entrada lista.

Para el fichero de salida tienes que partir el mensaje mientras exceda de 160 caracteres. Como no creo que te apetezca pegarte con memoria dinámica que tal una función tal que:

Código C:
Ver original
  1. int PartirString(char* inicio, char* destino, int longitud);

La función podría devolver un 1 si aun queda cadena por trocear y 0 en caso contrario. Esta opción te permite saber cuándo parar.

La función podría usar una variable estática interna para no tener que actualizar el puntero inicio en cada llamada... algo así:

Código C:
Ver original
  1. char buff[10];
  2. char* textoOriginal = "Hola";
  3. int res = PartirString(textoOriginal,buff,1); // buff = "H", res=1
  4. res = PartirString(NULL,buff,1); // buff = "o", res=1
  5. res = PartirString(NULL,buff,1); // buff = "l", res=1
  6. res = PartirString(NULL,buff,1); // buff = "a", res=0

Cómo declarar la variable estática... pues algo así:

Código C:
Ver original
  1. int PartirString(char* inicio, char* destino, int longitud)
  2. {
  3.   static char* ptr = NULL;
  4.  
  5.   if( inicio != NULL )
  6.     ptr = inicio;
  7.  
  8.   // A partir de aquí trabajas únicamente con ptr
  9.   // ...
  10. }

Y bueno, con esto prácticamente ya tendrías casi todo el programa hecho... no se me ocurren más funciones que vayas a necesitar para terminar el trabajo.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 27/04/2016 a las 09:47
  #8 (permalink)  
Antiguo 27/04/2016, 15:06
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Proyecto de C

Se te olvido un detalle antes de llamar a la función que divide en trozos de 160 caracteres. Yo, como ya sabríamos la posición inicial y la final, si hacemos la resta tenemos el largo del texto y si lo dividimos entre 160 nos daría la partes partes que tienen 160 caracteres. Luego obtenemos el modulo y si es mayor de 0 incrementamos en 1 las partes porque habría una parte con menos de 160. Otra manera de comprobar si hay residuo seria multiplicar el cociente por el divisor y si es menor que el dividendo es que hay resto jejeje.

Etiquetas: cadena, char, ejercicio, funciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:41.