Ayuda con un programa en c++

#1
AYUDAN CON UN PROGRAMA EN DEV C++ QUE CUENTE LINEAS DE CODIGO HASTA AHORITA TENGO ESTO Y NO ENCUENTRO UN ERROR POR FAVOR AYUDENME:cowverine::metal::eolo:

#include <stdio.h> /* getchar, putchar, EOF */

int separador (int ch)
{
return (ch==' ') || (ch=='\t') || (ch=='\n');
}

int main ()
{
long contador_caracteres;
long contador_palabras;
long contador_lineas;
int actual;
int prev;
// Inicialización de los contadores
contador_caracteres = 0;
contador_palabras = 0;
contador_lineas = 1;
// Lectura de los datos de entrada
prev = ' ';
actual = getchar();
while (actual != EOF) {
contador_caracteres ++;
// ¿Fin de línea?
if (actual=='\n')
contador_lineas++;
// ¿Comienzo de una nueva palabra?
if (!separador(actual) && separador(prev))
contador_palabras++;
// Siguiente carácter
prev = actual;
actual = getchar();
}
// Resultado
printf("%ld caracteres\n", contador_caracteres);
printf("%ld palabras\n", contador_palabras);
printf("%ld líneas\n", contador_lineas);
return 0;
}

ALGUIEN TIENE IDEA DE COMO HACER ESTO?
 
#2
Hola
Pues no soy un experto en C++ pero me quedan algunas dudas sobre tu programa, primero de donde quieres leer el código, como lo tienes lo estás leyendo del teclado, yo pensaría que lo deberías leer de un archivo y lo que también veo que es que las líneas vacías también las contaría.
Bueno, según yo, hice algunas modificaciones a tu código, suponiendo que existe un archivo llamado codigofuente.cpp en la misma carpeta donde estas ejecutando el programa.


#include <stdio.h> /* getchar, putchar, EOF */

int separador (int ch)
{
return (ch==' ') || (ch=='\t') || (ch=='\n');
}

int main ()
{
long contador_caracteres;
long contador_palabras;
long contador_lineas;
char actual;
char prev;
FILE *origen;
// Inicialización de los contadores
contador_caracteres = 0;
contador_palabras = 0;
contador_lineas = 1;

// Lectura de los datos de entrada

printf("Analizando codigofuente.cpp ...\n");

if( origen = fopen("codigofuente.cpp","r") )
{
while( !feof(origen) )
{
actual = fgetc(origen);

contador_caracteres ++;
// ¿Fin de línea?
if (actual=='\n')
contador_lineas++;
// ¿Comienzo de una nueva palabra?
if (!separador(actual) && !separador(prev))
contador_palabras++;
// Siguiente carácter
prev = actual;
}

fclose(origen);
// Resultado
printf("%ld caracteres\n", contador_caracteres);
printf("%ld palabras\n", contador_palabras);
printf("%ld líneas\n", contador_lineas);

getchar();
}
else
{
printf("No fue posible abrir el archivo.\n");
}

return 1;
}
 
#3
tengo otro nuevo problema con las lineas de código vacías y con los comentarios (//) ya que no me los cuenta me podrían hecha la mano amigos bakunos:metal:

#include <stdio.h> /* getchar, putchar, EOF */
int separador (int ch)
{
return (ch=='\n') || (ch='//') || (ch=='#')|| (ch==' ');
}
int main ()
{
long contador_lineas;
long contador_comentarios;
long contador_librerias;
long contador_espblanco;
char actual;
char prev;
FILE *origen;
// Inicialización de los contadores
contador_lineas = 1;
contador_comentarios = 0;
contador_librerias = 0;
contador_espblanco = 0;
// Lectura de los datos de entrada
printf("Analizando codigofuente.cpp ...\n");
if( origen = fopen("codigofuente.cpp","r") )
{
while( !feof(origen) )
{
actual = fgetc(origen);

// ¿Fin de línea?
if (actual=='\n')
contador_lineas++;
if(actual =='//')
contador_comentarios++;
if(actual =='#')
contador_librerias++;
if(actual ==' ')
contador_espblanco++;
// ¿Comienzo de una nueva palabra?
prev = actual;
}
fclose(origen);
// Resultado
printf("%ld lineas\n", contador_lineas);
printf("%ld comentarios\n", contador_comentarios);
printf("%ld librerias\n", contador_librerias);
printf("%ld espacios en blanco\n", contador_espblanco);
getchar();
}
else
{
printf("No fue posible abrir el archivo.\n");
}
return 1;
}
 
#4
Los comentarios no te los cuenta por que solo lees un carácter a la vez, actual solo tiene un carácter y cuando comparas actual == '//' estas comparándolo con dos caracteres, intenta esto:

if(actual =='/' && prev == '/' )
contador_comentarios++;
 
#6
Se me ocurre que cuando encuentres un salto de línea pongas una variable que indique que la línea está vacía como verdadera y hasta que encuentre un carácter que no sea algún espacio u otro salto de línea la ponga en falso, prueba esto a ver si me entiendes:

#include <stdio.h> /* getchar, putchar, EOF */
int separador (int ch)
{
return (ch=='\n') || (ch='//') || (ch=='#')|| (ch==' ');
}
int main ()
{
long contador_lineas;
long contador_comentarios;
long contador_librerias;
long contador_espblanco;
long contador_lvacias;
bool lvacia = true;
char actual;
char prev;
FILE *origen;
// Inicialización de los contadores
contador_lineas = 1;
contador_comentarios = 0;
contador_librerias = 0;
contador_espblanco = 0;
contador_lvacias = 0;
// Lectura de los datos de entrada
printf("Analizando codigofuente.cpp ...\n");
if( origen = fopen("codigofuente.cpp","r") )
{
while( !feof(origen) )
{
actual = fgetc(origen);

// ¿Fin de línea?
if (actual=='\n')
{
contador_lineas++;
if( lvacia == true )
{
contador_lvacias++;
}
lvacia = true;
}
if( actual !='/n' && actual != '\t' && actual != '\r' && actual != ' ' && actual != 10)
{
printf("[ %d ]\n", actual);
lvacia = false;
}
if(actual =='/' && prev == '/' )
contador_comentarios++;
if(actual =='#')
contador_librerias++;
if(actual ==' ')
contador_espblanco++;
// ¿Comienzo de una nueva palabra?
prev = actual;
}
fclose(origen);
// Resultado
printf("%ld lineas\n", contador_lineas);
printf("%ld comentarios\n", contador_comentarios);
printf("%ld librerias\n", contador_librerias);
printf("%ld espacios en blanco\n", contador_espblanco);
printf("%ld lineas vacias\n", contador_lvacias);
getchar();
}
else
{
printf("No fue posible abrir el archivo.\n");
}
return 1;
}
 
#8
si tengo 2 funciones como le puedo hacer para que me cuente las lineas por cada función por ejemplo función alta tiene 20 lineas función abrir tiene 25? no tengo ni idea de como hacerlo :chommy:

int crear(FILE *a)
{
system("cls");
char na[15], txt[80], opc='s';
printf("nombre archivo: ");
fflush(stdin);
gets(na);
a=fopen(na,"w");
if (a!=NULL)
{
while (opc=='s')
{
system("cls");
printf("Nombre: ");
fflush(stdin);
gets(txt);
strcat(txt," ");
fputs(txt,a);
printf("otro datos s/n");
scanf("%c",&opc);
}
}
fclose(a);
system("cls");
getch();
}

int abrir(FILE *a)
{
system("cls");
char na[15], txt[80];
printf("nombre archivo: ");
fflush(stdin);
gets(na);
a=fopen(na,"r");
if(a!=NULL)
{
while(!feof(a))
{ fgets(txt,80,a);
printf("\n%s",txt);
}
}
else
printf("\nNo Existe");
fclose(a);
getch();
system("cls");
}
 
#9
hice esto pero no funciono :eolo:

#include <stdio.h>
#include <cstdlib>
#include <conio.h>
#include<string.h>
using namespace std;
int separador (int ch)
{
return (ch=='\n') || (ch=='/') || (ch=='#') || (ch==' ');
}

int main()
{
long contador_lineas,contador_comentarios,contador_lvacias,total_lineas;
bool lvacia = true;
char actual,prev,actual1[200];
char nombres[10][30];
int lin=0,con=0,par=0,lineas=0,llave=0,cor=0,condicion=0,i,j,k;
int contar_funciones[200];
system("color F2");
FILE *origen;
contador_lineas=0;
contador_comentarios=0;
contador_lvacias=0;
printf(" BiEnVeNiDo...!!! 8.1 ISC\n\n");
printf("Analizando codigofuente.cpp\n");
if( origen = fopen("codigofuente.cpp","r"))
{
while( !feof(origen) )
{
actual = fgetc(origen);
fgets(actual1,200,origen);
int tam=strlen(actual1);
if (actual=='\n')
{
contador_lineas++;
if( lvacia == true )
{
contador_lvacias++;
}
lvacia = true;
}
if( actual !='/n' && actual != '\t' && actual != '\r' && actual != ' ' && actual != 10)
{
lvacia = false;
}
if(actual =='/' && prev == '/' )
contador_comentarios++;
for(i=0;i<tam;i++)
{
if(actual1=='i')
{
if(actual1[i+1]=='n')
{
if(actual1[i+2]=='t')
{
if(actual1[i+3]==' ')
{

for(j=0;j<tam;j++)
{
if((actual1[j]=='(')||(actual1[j]==')'))
{
par++;
}
}
if(par==2)
{
if(condicion==1)
{
contar_funciones[condicion-1]=lineas;
lineas=0;
}

int aux=i+4;
int pos=0;

while(actual1[aux]!='(')
{
nombres[condicion][pos]=actual1[aux];
pos++;
aux++;
}
condicion++;


fgets(actual1,200,origen);
fgets(actual1,200,origen);

cor=1;
con=0;
lineas++;
while(cor!=0)
{

tam=strlen(actual1);

for(k=0;k<tam;k++)
{

if((actual1[k]!=' ')&&(actual1[k]!='\n'))
{
con++;
}
if(actual1[k]=='{')
{
cor++;
}
if(actual1[k]=='}')
{
cor--;
}
if((con==1)&&(actual1[k]=='/'))
{
break;
}
if(con>1)
{
break;
}
}
if(con>1)
{
lineas++;
}
fgets(actual1,200,origen);
con=0;
}
llave++;

contar_funciones[condicion-1]=lineas;
lineas=0;
}

}
}

if(llave==0)
{
lineas++;
}

}
con=0;
par=0;
}
}
total_lineas=contador_lineas-contador_lvacias-contador_comentarios;
prev = actual;
}
fclose(origen);
//printf("%ld lineas\n", contador_lineas);
// printf("%ld comentarios\n", contador_comentarios);
//printf("%ld lineas vacias\n", contador_lvacias);
printf("Total de lineas %ld\n", total_lineas);
printf("\n Nombre de Funcion : %s\n", nombres);
printf("\n Lineas de Codigo : %d\n", contar_funciones);
getchar();
}
else
{
printf("No fue posible abrir el archivo.\n");
}
return 1;
}
 
Arriba