Официальный сайт студ.городка НГТУ
Программирование и БД » [Си] Помогите найти ошибку в коде... 

#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

#2  15.06.09 01:03

Re: [Си] Помогите найти ошибку в коде...

_street-fighter_, напиши какие ошибки выдвет

Offline

#3  15.06.09 01:04

Re: [Си] Помогите найти ошибку в коде...

фу епт, ни че не пиши, до конца не дочитал первый раз.

Offline

#4  15.06.09 13:06

Re: [Си] Помогите найти ошибку в коде...

_street-fighter_ написал(а):

При редактировании файла с кодом си программа создает лишние пробелы... помогите найти ошибку плиз.

оО это как?!

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

#7  16.06.09 16:05

Re: [Си] Помогите найти ошибку в коде...

Ну да, можно.
Если прога после компиляции отформатированного теста работает не правильно, логично что ты не только отформатировал но и удалил что-то)

Offline

#8  18.06.09 23:51

Re: [Си] Помогите найти ошибку в коде...

Думаю будет глупо предложить отформатить в студии?

Offline

#9  19.06.09 11:37

Re: [Си] Помогите найти ошибку в коде...

Я написал(а):

Думаю гупая тема какая-то :) Ибо ошибка может возникнуть только после изменения текста, а не его содержания епт.

Offline

#10  19.06.09 11:43

$up
Профиль

Re: [Си] Помогите найти ошибку в коде...

не проще ли подебажить и посмотреть почему лишние пробелы появляются? В таком мусорном коде визуально трудно разобраться. Проще самому заново написать.

Offline

#11  19.06.09 18:03

Re: [Си] Помогите найти ошибку в коде...

Укроп написал(а):

это что комментарии не для тебя придумывали? я бы переписал для тебя может быть даже, но не такой кусок беспомощного говна.
код - кошмар.

Это не я бляяя...

Offline

#12  20.06.09 01:54

$up
Профиль

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

Программирование и БД » [Си] Помогите найти ошибку в коде... 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.227 сек.
Выполнено 14 запросов.