#1 14.06.09 23:36
[Си] Помогите найти ошибку в коде...
Условие задачи: Отформатировать текст программы на языке С, разместив каждый оператор в отдельной строке и записав каждую закрывающую скобку под соответствующей открывающей.
Текст программы:
Код: c:
#include <stdio.h> #include <ctype.h> #include <conio.h> #include <string.h> #define N 32 #define L 300 void Ins_char (char *str, int pos, char s, int l) { for (int i=l+1; i>pos; i--) str[i]=str[i-1]; str[pos]=s; } void Del_Pos (char *str, int pos, int l) { for (int i=pos;i<(l-1);i++) str[i]=str[i+1]; } void NoTab (char *str, int &l) { for (int i=0; (isalpha(str[i])==0)&&(i<l); i++) if ((str[i]==' ')||(str[i]=='\t')) { Del_Pos (str, i, l); i--; l--; } } void Format (FILE *f1, FILE *f2) { int i,j,l, ck=0,a,c,q=0; char *v[]={"if", "for", "while", "switch"}; char *str=new char[L], tmp[N]; while (!feof (f1)) { strset (str, '\0'); fgets (str, L, f1); l=strlen(str); NoTab (str,l); a=-2; for (i=0; i<l; i++) { if ((i==0)&&(isalpha(str[i])!=0)) { for (j=0; j<q; j++) { Ins_char (str, 0, ' ', l); i++; l++; } continue; } if ((isalpha(str[i])!=0)&&((i==0)||(isalpha(str[i-1])==0))) { for (a=0,j=i; isalpha(str[j])!=0; j++, a++) tmp[a]=str[j]; tmp[a]='\0'; for (c=0; c<4; c++) if (strcmp(tmp,v[c])==0) { for (c=i-1; ((str[c]==' ')&&(c>-1)); c--); printf ("%d\t", c); if ((c>0)&&(str[c]!='\n')) { if (i>1) { Ins_char (str, i, '\n', l); puts("************"); l++; i++; } } for (j=0; ((j<q)&&(c==i-1)); j++) { Ins_char (str, i, ' ', l); l++; i++; } a=i; break; } else a=-2; } if ((str[i]=='{')&&(ck==0)) { q++; if (i!=0) { Ins_char (str, i, '\n', l); l++; i++; } for (j=0; j<q; j++) { Ins_char (str, i, ' ', l); l++; i++; } for(j=i+1;str[j]==' '; j++); if (str[j]!='\n') { Ins_char (str, j, '\n', l); i++; l++; for (c=0; c<q; c++) { Ins_char (str, j+1, ' ', l); l++; i++; } } continue; } if ((str[i]=='}')&&(ck==0)) { if (i!=0) { for(j=i-1; ((str[j]==' ')&&(j>-1)); j--); if ((j!=0)&&(str[j]!='\n')) { Ins_char (str, i, '\n', l); l++; i++; } } for (j=0; j<q; j++) { Ins_char (str, i, ' ', l); l++; i++; } for(j=i+1;str[j]==' '; j++); if (str[j]!='\n') { Ins_char (str, j, '\n', l); i++; l++; } if (q!=0) q--; continue; } if (str[i]=='(') ck++; if (str[i]==')') ck--; if ((i!=0)&&(str[i]=='#')&&(ck==0)) { Ins_char (str, i, '\n', l); l++; i++; continue; } if ((str[i-1]!='}')&&(str[i]==';')&&(ck==0)) { for(j=i+1; ((str[j]==' ')&&(j<l)); j++); if ((str[j]!='\n')&&(j<l-1)&&(str[j]!='}')) { Ins_char (str, j, '\n', l); i++; l++; j++; for (a=0; a<q; a++) { Ins_char (str, j, ' ', l); i++; l++; } } } /* if ((str[i]==';')&&(ck==0)) { c=0; for (j=i-1; (!((c==0)&&(str[j]==';'))&&(str[j]!='{')&&(str[j]!='}')&&(j>-1)&&(j!=a)); j--) { if (str[j]=='(') c++; if (str[j]==')') c--; } if (j!=a) { for (j++;str[j]==' ';j++); if (j!=0) {Ins_char (str, j, '\n', l); i++; l++; j++;} for (a=0; a<q; a++) { Ins_char (str, j, ' ', l); l++; i++; j++; } a=-2; } }*/ } j=0; i=0; while (j<l) { i=i+strlen(&(*(str+j))); fputs (&(*(str+j)), f2); j=j+i+1; } } } void main() { clrscr(); puts ("Proga formatiruet kod C"); FILE *f, *pnt; char filename [N],tmp[N]; puts ("\n Enter file name:"); gets (filename); if ((f = fopen (filename, "r")) == NULL) {puts ("Net faila"); getch(); return;} puts ("\n Enter temp file name:"); gets (tmp); if ((pnt = fopen (tmp, "w")) == NULL) {puts ("Oshibka sozdaniy faila"); getch(); fcloseall(); return;} rewind (pnt); Format (f, pnt); fcloseall(); //remove (filename); //if ((rename (tmp, filename))!=0) puts("Error rename!"); puts ("OK!"); getch(); }
При редактировании файла с кодом си программа создает лишние пробелы... помогите найти ошибку плиз.
Offline
#5 15.06.09 20:20
Re: [Си] Помогите найти ошибку в коде...
R0mm, допустим нужно отредактировать этот текст:
#include <stdio.h> #include <conio.h>
#include <math.h> #define N 20
void Enter_Arr (int A[], int &size)
{while (1) {
printf ("\nVvedite rasmer massiva (2-%d): ",N);
scanf ("%d", &size);
if ((size<=N)&&(size>1)) break; printf ("\nError!");
}
for (int i=0;i<size;i++)
scanf ("%d", &A[i]); }
void Out_Arr (int A[], int size)
{for (int i=0; i<size; i++) printf ("%d ", A[i]);}
void Sort (int s[], int a, int b)
{int i, j, tmp, k;
for(i = a; i <= b-1; i++)
{k = i;for( j = i+1; j <= b; j++)
if (s[j] < s[k]) k =j; tmp=s[k]; s[k]=s[i]; s[i]=tmp; } }
void Run (int Arr[], int size, int n)
{
int i, s=(int)pow(2,n);if (size/s==0) return;
for (i=0; i<size-s+1; i=i+s)
Sort (Arr, i, i+s-1);
if (size/s==1) {Sort (Arr, 0, size-1); return;}
Out_Arr (Arr, size); printf ("\n"); n++;Run (Arr, size, n); return;}
int main()
{clrscr();
printf ("Proga sortirovki po neymonu(vozrastanie)");
int A[N], size; Enter_Arr (A, size);Run (A, size, 1); Out_Arr (A, size);
puts ("\nOK!"); getch();
}
Вместо этого:
Получается это:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 20
void Enter_Arr (int A[], int &size)
{
while (1)
{
printf ("\nVvedite rasmer massiva (2-%d): ",N);
scanf ("%d", &size);
if ((size<=N)&&(size>1)) break;
printf ("\nError!");
}
for (int i=0;i<size;i++)
scanf ("%d", &A[i]);
}
void Out_Arr (int A[], int size)
{
for (int i=0; i<size; i++) printf ("%d ", A[i]);
}
void Sort (int s[], int a, int b)
{
int i, j, tmp, k;
for(i = a; i <= b-1; i++)
{
k = i;
for( j = i+1; j <= b; j++)
if (s[j] < s[k]) k =j;
tmp=s[k];
s[k]=s[i];
s[i]=tmp;
}
}
void Run (int Arr[], int size, int n)
{
int i, s=(int)pow(2,n);
if (size/s==0) return;
for (i=0; i<size-s+1; i=i+s)
Sort (Arr, i, i+s-1);
if (size/s==1)
{
Sort (Arr, 0, size-1);
return;
}
Out_Arr (Arr, size);
printf ("\n");
n++;
Run (Arr, size, n);
return;
}
int main()
{
clrscr();
printf ("Proga sortirovki po neymonu(vozrastanie)");
int A[N], size;
Enter_Arr (A, size);
Run (A, size, 1);
Out_Arr (A, size);
puts ("\nOK!");
getch();
}
Получается это:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 20
void Enter_Arr (int A[], int &size)
{
while (1)
{
printf ("\nVvedite rasmer massiva (2-%d): ",N);
scanf ("%d", &size);
if ((size<=N)&&(size>1)) break;
printf ("\nError!");
}
for (int i=0;i<size;i++)
scanf ("%d", &A[i]);
}
void Out_Arr (int A[], int size)
{
for (int i=0; i<size; i++) printf ("%d ", A[i]);
}
void Sort (int s[], int a, int b)
{
int i, j, tmp, k;
for(i = a; i <= b-1; i++)
{
k = i;
for( j = i+1; j <= b; j++)
if (s[j] < s[k]) k =j;
tmp=s[k];
s[k]=s[i];
s[i]=tmp;
}
}
void Run (int Arr[], int size, int n)
{
int i, s=(int)pow(2,n);
if (size/s==0) return;
for (i=0; i<size-s+1; i=i+s)
Sort (Arr, i, i+s-1);
if (size/s==1)
{
Sort (Arr, 0, size-1);
return;
}
Out_Arr (Arr, size);
printf ("\n");
n++;
Run (Arr, size, n);
return;
}
int main()
{
clrscr();
printf ("Proga sortirovki po neymonu(vozrastanie)");
int A[N], size;
Enter_Arr (A, size);
Run (A, size, 1);
Out_Arr (A, size);
puts ("\nOK!");
getch();
}
Offline
#6 16.06.09 06:03
Re: [Си] Помогите найти ошибку в коде...
Так это же хорошо ) код стал более читабельный )
Offline
#10 19.06.09 11:43
#11 19.06.09 18:03
#12 20.06.09 01:54
Re: [Си] Помогите найти ошибку в коде...
Эх, тряхнём стариной 8)
Есть некоторые косячки, но не смертельные.
Код: cpp:
void tab(FILE* fileout, int nLevel) { char string = '\t'; for (int i = 0; i < nLevel; i++) { fwrite(&string, sizeof(char), 1, fileout); } } void br(FILE* fileout, bool& bNoBreak) { if (!bNoBreak) { char string[] = {'\r','\n'}; fwrite(string, sizeof(char), 2, fileout); bNoBreak = true; } } void outchar(FILE* fileout, char ch, int nLevel, bool& bNoBreak) { if (bNoBreak) { tab(fileout, nLevel); } fwrite(&ch, sizeof(char), 1, fileout); bNoBreak = false; } void extract(FILE* file, FILE* fileout) { char ch; int nLevel = 0; int nRead = 0; int nDeep = 0; bool bEsc = false; bool bSingleQuote = false; bool bDoubleQuote = false; bool bOut = false; bool bNoBreakLine = false; bool bAllowBreak = false; bool bCheckComment = false; while(nRead = (int)fread((void*)&ch, sizeof(char), 1, file)) { if(ch == '\\') { //out next escaped char outchar(fileout, ch, nLevel, bNoBreakLine); nRead = (int)fread((void*)&ch, sizeof(char), 1, file); outchar(fileout, ch, nLevel, bNoBreakLine); } else if(ch == '"') { if (!bSingleQuote) { bDoubleQuote = !bDoubleQuote; } outchar(fileout, ch, nLevel, bNoBreakLine); } else if(ch == '\'') { if (!bDoubleQuote) { bSingleQuote = !bSingleQuote; } outchar(fileout, ch, nLevel, bNoBreakLine); } else if (bDoubleQuote || bSingleQuote) { //out text in quotes outchar(fileout, ch, nLevel, bNoBreakLine); } else if(ch == ' ' || ch == '\t') { //remove spaces and tabs at begin if (bOut) { outchar(fileout, ch, nLevel, bNoBreakLine); } } else if (ch == '\r') { //skip } else if (ch == '\n') { //allow break only for preprocessor instructions if (bAllowBreak) { br(fileout, bNoBreakLine); bAllowBreak = false; bOut = false; } } else if(ch == '{') { br(fileout, bNoBreakLine); outchar(fileout, ch, nLevel, bNoBreakLine); nLevel++; br(fileout, bNoBreakLine); bOut = false; } else if(ch == '}') { nLevel--; br(fileout, bNoBreakLine); outchar(fileout, ch, nLevel, bNoBreakLine); br(fileout, bNoBreakLine); bOut = false; } else if(ch == ';' && nDeep == 0) { //semicolon separates operators outchar(fileout, ch, nLevel, bNoBreakLine); br(fileout, bNoBreakLine); bOut = false; } else { if(ch == '(') { nDeep++; //disable semicolon break } else if(ch == ')') { nDeep--; } else if(ch == '#') { bAllowBreak = true; //allow break in preprocessor } else if(ch == '/') { if (bCheckComment) { bAllowBreak = true; // allow break in comment bCheckComment = false; } else { bCheckComment = true; } } outchar(fileout, ch, nLevel, bNoBreakLine); bOut = true; } } }
Исправлено $up (21.06.09 16:01)
Offline

