Премини към съдържанието

Тони Желев

Потребител
  • Публикации

    7
  • Регистрация

  • Последно онлайн

Харесвания

0 Неутрална репутация

Всичко за Тони Желев

  • Титла
    Новобранец
  1. Въпрос относно броенето на идентификатори

    така реших да започна наново и направих ето това. int fIdentifierCount(char source[]){ int idCount=0; int line=0; // flags bool fComment= false; bool fQuotes= false; bool fApostr= false; bool fNumber= false; bool fWord= false;FILE *fp;fp=fopen(source,"r");if(fp==NULL) return -1;else if(fp!=NULL) { char temp[1024]; while(fgets(temp,sizeof(temp),fp)!=NULL) { int i; line++; for(i=0;i<strlen(temp);i++) { if(temp[i]=='/' && temp[i+1]=='/' && fQuotes) { break; } if(temp[i]=='/' && temp[i+1]=='*' && !fQuotes) { fComment=true; continue; } if(temp[i]=='/' && temp[i-1]=='*' ) { fComment=false; continue; } if(temp[i]=='"' && !fQuotes && temp[i-1]!='') { fQuotes=true; } else if(temp[i]=='"' && fQuotes && temp[i-1]!='') { fQuotes=false; } if(temp[i]==''' && !fApostr && !fQuotes) { fApostr=true; } else if(temp[i]==''' && fApostr && !fQuotes) { fApostr=false; } if((temp[i]>='0' && temp[i]<='9') && !fWord) { fNumber=true; } if(((temp[i]>='A') && (temp[i]<='Z')) || ((temp[i]>='a') && (temp[i]<='z')) || (temp[i]<='_')) { if(!fApostr && !fQuotes && !fComment && !fNumber && !fWord) { fWord=true; } } if(!(((temp[i]>='A') &&(temp[i]<='Z')) || ((temp[i]>='a') && (temp[i]<='z')) || ((temp[i]>='0') && (temp[i]<='9')) || (temp[i]=='_'))) { if(fWord) { idCount++; fWord=false; } else if(fNumber) { fNumber=0; } } } } } fclose(fp); return idCount;}Така това сега отговаря ли на описанието за идентификатор по-горе?
  2. Въпрос относно броенето на идентификатори

    Днес ми дойде една малко странна идея, но не знам колко ще ми свърши работа... Масив(или файл и после да добавя информацията му в масив) със всички типове данни. След това да вкарвам ред по ред в програмата и да проверявам. Ще имам 2 функции за прескачане на коментари (една за // и една за /* */). И примерно имам ред: int ImeNaFunckiq();int main();{// nqkakuv komentar int prom1,prom2;/* drug komentar prosto za primer */... return 0;}И така да сравнявам всеки ред дума по дума с тази от масив-а. Ако се окаже, че има съвпадение (с някоя дума), да прескочи интервала и ако следващият знак е буква ( визирам "int prom1,prom2;" да имам един брояч който брой запетайките като накрая върне резултат от брояча +1 [нали 1 запетая разделя 2 думи] ), а ако следващият знак е скоба ( пък да увеличава някакъв друг броя. И вече най отдолу на функцията събера двата брояча, не знам дали идеята си заслужава но на мен ми се струва ок, остава само да се оправя с вкарването на файл с ключовите думи в масив... файла (прим. keywords.txt) ще бъде просто списък с по 1 тип на ред. прим charunsigned charintlong int и така всичките.
  3. Въпрос относно броенето на идентификатори

    bump
  4. Въпрос относно броенето на идентификатори

    Успях да го докарам до работещ код който брой, но ми остана да добавя проверката за " това е кода на цялата програма (курсовата) и тя е обекта на сканиране. като резултат ми изкарва 249 идентификатора. #include <stdio.h>#include <stdlib.h>#include <windows.h>// Functions prototypes Startvoid fcase1(char *,char *,int );void fcase2(char *,int);void fcase3(char *,int);void fcase4(int);int fLinesCount(char *);int fIdentifierCount(char *);int fSearchChar(char *,char,int);// Functions prototypes Endint main(){ char exit; do { int choise,count=0; char fin[30]; char fout[30];// Styling StartSetConsoleOutputCP(1251);system("COLOR 0A");// Styling End// Menu Startprintf("////////////////////////////////////////////////////////////////////");printf("////////////");printf("//");printf(" Курсова Работа по ПИК I ");printf(" //");printf("//");printf(" Изработил Тони Христов Желев, факултет ФТК, група 54б, номер 111");printf("213205");printf(" //");printf("//");printf(" ");printf(" //");printf("//");printf("Моля изберете опция от менюто.");printf(" //");printf("//");printf(" ");printf(" //");printf("//");printf("1. Четене програмата от файл и запис на резултата в друг. ");printf(" //");printf("//");printf("2. Четене прогрмата от файл и извеждане на резултата на екрана.");printf(" //");printf("//");printf("3. Четене на програмата от клавиатурата и извеждане във файл.");printf(" //");printf("//");printf("4. Четене на програмата от клавиатурата и извеждане резултата на");printf(" екрана.");printf(" //");printf("//");printf(" ");printf(" //");printf("///////////////////////////////////////////////////////////////////");printf("/////////////");printf("Избор: "); fflush(stdin); scanf("%i",&choise);// Menu End// Switch start switch (choise) { case 1: fcase1(fin,fout,count); break; case 2: fcase2(fin,count); break; case 3: fcase3(fout,count); break; case 4: fcase4(count); break; default: printf("Въведохте невалидна опция"); break; }// Switch end// Close the program [y/n] Start fflush(stdin); printf("nИскате ли да затоврите програмата? [y/n]"); fflush(stdin); scanf("%c",&exit); system("cls"); }while(exit!='y');// Close the program [y/n] End return 0;}// Definition of Functionsint fLinesCount(char fin[]){ unsigned int lines_count = 0; FILE *fp = fopen(fin, "r"); int ch; if(fp==NULL) return -1; else while ((ch=fgetc(fp))!=EOF ) if ( ch == 'n') ++lines_count; fclose(fp); return lines_count;}int fIdentifierCount(char fin[]){ int i=0; int in_str_comment=0; int in_line_comment=0; int in_quotes; int in_word=0; int in_number=0; unsigned int id_count; char buff[1024]; FILE *fp = fopen(fin,"r"); if(fp==NULL) return -1; else { do { buff[i]= fgetc(fp); if(buff[i]=='/' && buff[i+1]=='/') in_line_comment=1; if (buff[i]='n') in_line_comment=0; if(buff[i]=='/' && buff[i+1]=='*') in_str_comment=1; if (buff[i]=='*' && buff[i+1]=='/') in_str_comment=0; if((buff[i] >= '0') && (buff[i] <= '9') && in_word==0) { in_number = 1; } if(in_str_comment==0 && in_line_comment==0 && in_number==0 ) { if(!(((buff[i] >= 'A') && (buff[i] <= 'Z')) || ((buff[i] >= 'a') && (buff[i] <= 'z')) || ((buff[i] >= '0') && (buff[i] <= '9')) || (buff[i] == '_'))) in_word=1; if(in_word) {id_count++;} } in_word=0; in_line_comment=0; in_quotes=0; in_str_comment=0; in_number=0; i++; }while(buff[i]!=EOF); } return id_count;}void fcase1(char fin[],char fout[], int count){ FILE *ffout; int v,m; printf("Моля въведете името на файла за четене: "); fflush(stdin); scanf("%s",fin); printf("Моля въведете името на файла за записване: "); fflush(stdin); scanf("%s",fout); fflush(stdin); ffout=fopen(fout,"w"); v=fLinesCount(fin); if(v==-1) fprintf(ffout,"File "%s" can't be opened",fin); else fprintf(ffout,"Броя на редовете е - %dn",v); m=fIdentifierCount(fin); if(m==-1) fprintf(ffout,"File "%s" can't be opened",fin); else fprintf(ffout,"Броя на идентификаторите е - %dn",m); fclose(ffout);}void fcase2(char fin[], int count){ int v; printf("Моля въведете името на файла за четене: "); fflush(stdin); scanf("%s",fin); v=fLinesCount(fin); if(v==-1) printf("File "%s" can't be opened",fin); else printf("Броя на редовете е - %d",v);}void fcase3(char fout[], int count){ int v,i=0; char buff[20000]; FILE *ffout; printf("Моля въведете името на файла за записване: "); fflush(stdin); scanf("%s",fout); fflush(stdin); ffout=fopen(fout,"w"); printf("Напишете програмата и натиснете CTRL+Z за край:n"); while((buff[i]=fgetc(stdin))!=EOF) { i++; } buff[i]='0'; i=0; while(buff[i]!='0') { if (buff[i]=='n') ++count; i++; } fprintf(ffout,"Броя на редовете е - %d",count); fclose(ffout);}void fcase4(int count){ int v,i=0; char buff[20000]; printf("Напишете програмата и натиснете CTRL+Z за край:n"); while((buff[i]=fgetc(stdin))!=EOF) { i++; } buff[i]='0'; i=0; while(buff[i]!='0') { if (buff[i]=='n') ++count; i++; } printf("Броя на редовете е - %d",count); }a само функцията int fIdentifierCount(char fin[]){ int i=0; int in_str_comment=0; int in_line_comment=0; int in_quotes; int in_word=0; int in_number=0; unsigned int id_count; char buff[1024]; FILE *fp = fopen(fin,"r"); if(fp==NULL) return -1; else { do { buff[i]= fgetc(fp); if(buff[i]=='/' && buff[i+1]=='/') in_line_comment=1; if (buff[i]='n') in_line_comment=0; if(buff[i]=='/' && buff[i+1]=='*') in_str_comment=1; if (buff[i]=='*' && buff[i+1]=='/') in_str_comment=0; if((buff[i] >= '0') && (buff[i] <= '9') && in_word==0) { in_number = 1; } if(in_str_comment==0 && in_line_comment==0 && in_number==0 ) { if(!(((buff[i] >= 'A') && (buff[i] <= 'Z')) || ((buff[i] >= 'a') && (buff[i] <= 'z')) || ((buff[i] >= '0') && (buff[i] <= '9')) || (buff[i] == '_'))) in_word=1; if(in_word) {id_count++;} } in_word=0; in_line_comment=0; in_quotes=0; in_str_comment=0; in_number=0; i++; }while(buff[i]!=EOF); } return id_count;}имам някаква идея от рода на: if(buff[i]==''" && buff[i+1]!='"')in_quotes=1;но не се сещам как да го сваля, мислех гo като: buff[i-1]!='"' && buff[i]=='"'но тогава се препокирват едно с друго.. :/
  5. Въпрос относно броенето на идентификатори

    Благодаря по изясниха ми се нещата, но или ми брой 0 или дава грешка (don't send..) нещо в if-овете ми куса :/. int fIdentifierCount(char fin[]){ int i=0; int in_coment=0; char buff[200000]; unsigned int id_count; FILE *fp = fopen(fin,"r"); if(fp==NULL) return -1; else { while(!feof(fp)) { buff[i]=fgetc(fp); i++; } do { if(buff[i]=='/' && buff[i+1]=='/' || buff[i]=='/' && buff[i+1]=='*' || buff[i+1]=='"') { in_coment=1; } while(in_coment==0){ if(buff[i]=='n' || buff[i]=='*' && buff[i]=='/' || buff[i]== '"' ) { in_coment=0; } else if(buff[i]>='a' && buff[i]<='z' || buff[i]>='A' && buff[i]<='Z' || buff[i]>='0' && buff[i]<='9' || buff[i]=='_') { if((buff[i+1]>='a') && (buff[i+1]<='z' )|| (buff[i+1]>='A') && (buff[i+1]<='Z') ||( buff[i+1]>='0') && (buff[i+1]<='9') || (buff[i+1]=='_') || buff[i]=='0') id_count++; } i++; } i++; }while(buff[i]<='0'); } return id_count;}Това ми е функцията ако може още някоя и друга насока.
  6. Кирилица в конзолата C++

    Има 2 за мен известни варианта... единият е от regedit да промениш кодовата таблица която е зададена на 866(ако е е 866) на 1251, другият е на която програма пишеш да има вариант за смяна на кодировката на проекта. За 1рвият трябва да напишеш chcp в cmd и то ще ти изпише на коя таблица е. След това в regedit търсиш. HKEY_LOCAL_MACHINE / SYSTEM / CONTROL / CURRENTCONTROLSET / CONTROL / NLS / CODEPAGE Намираш 866(или която е твоята) и я променяш от "c_866.nls" на "c_1251.nls" без кавичките. Иначе просто сменяш номера, рестартираш и си готов.
  7. Имам курсова задача в която трябва да преброя редовете и броя на идентификаторите. С редовете нямам проблем но тези идентификатори не мога и не мога да разбера как да ги следя... Нали идентификатор е всяко име(за което се заделя памет). Примерно int a,b,c;char masiv1[30];int main();{printf("hello world");return 0;}Тук идентификаторите са а,b,c,masiv1, но не мога да измисля как да напиша програма в която да ги преброя тези имена... Опитвах по какъв ли не начин, но не се получава. Прочетох една от по старите теми и получих малко просветление, но там беше даден линк с пояснения, но той вече не работи. За това моля за някакви насоки как да проверявам за неща. Условието точно гласи: " За "идентификатор" ще се приема всяка част от текста,която започва с буква или символ за подчертаавне и съдържа букви,цифри и символ за подчертаване, при условие, че не се намира в символен низ или коментар. Да се отчита, че кавичката не винаги затваря низ("abc"def"). Да не се изключват ключовите думи в езика. А и още нещо не мога да използвам парсери(phasers или както се пишеха :/) нито други библиотеки само "спартански" условия и C. Всяка помощ е добре дошла дори било то само насоки или примерна извадка от някъде която върши работа. Благодаря предварително.
  • Разглеждащи в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

×

Информация

Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.