Flash7774
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите найти ошибки в коде, программа начинает не правильно преводить числа в двоичную и восьмеричную СС, начиная с четырёхзначных чисел и так далее. Не могу понять почему, так же не пойму как записывать числа в дополнительном коде, я написал, но это, помоему, неправильно. Код: /* Файл f1 содержит последовательность №1 целых чисел (положительные и отрицательные) в 10-й системе счисления. Вывести на экран содержимое файла f1 . Записать в файл f2 числа из последовательности №1 в 2-ой системе счисления, отрицательные числа выводить в дополнительном коде. Записать в файл f3 числа из последовательности №1 в 8-ой системе счисления. Вывод в файлы f2 и f3 разбить на строки по 80 символов. */ #include <stdio.h> #include <math.h> #include <conio.h> #include <iostream.h> #include <string.h> #include <stdlib.h> int DecToXZ(int deci, int base) //функция перевода из десятичной СС в любую другую { const char *symbols="0123456789ABCDEF"; char scratch[16]="",tmpscr[16]=""; //результат, врем. переменная int remainder; div_t x; do { x=div(deci,base); remainder=x.rem; for (int j=0;j<16;j++) tmpscr[j]=0; tmpscr[0]=symbols[remainder]; strcat(tmpscr,scratch); strcpy(scratch,tmpscr); x=div(deci,base); deci=x.quot; } while (deci!=0); return atoi(scratch); } int main(void) { FILE *fptr1,*fptr2,*fptr3; //файл. переменная char fpath1[256],fpath2[256],fpath3[256],buf1[97]="",buf2[97]="",buf3[17]=""; //пути к файлам,буферы int i=0,num=0,temp,len; //итератор, счётчик чисел, врем. переменная clrscr(); //открытие файла №1 printf("Will Enter way to file number 1:\n"); scanf("%s",&fpath1); fptr1=fopen(fpath1,"r"); while (fptr1==0) { printf("\nThe Mistake! Repeat the attempt!\n"); getch(); clrscr(); printf("Will Enter way to file number 1:\n"); scanf("%s",&fpath1); fptr1=fopen(fpath1,"r"); } while (!feof(fptr1)) //подсчёт размера массива { int ret=fscanf(fptr1,"%d",&temp); if (ret!=1) break; num++; } int *arr=new int[num]; //создание дин. массива fseek(fptr1,0,0); while (!feof(fptr1)) //заполнение массива { int ret=fscanf(fptr1,"%d",&arr[i++]); if (ret!=1) break; } fclose(fptr1); clrscr(); printf("Contents of the file:\n"); //вывод на экран for (i=0;i<num;i++) cout << arr[i] << " "; getch(); clrscr(); //сохранение в файл №2 printf("\nWill Enter way to file number 2:\n"); scanf("%s",&fpath2); fptr2=fopen(fpath2,"w"); while (fptr2==0) { printf("\nThe Mistake! Repeat the attempt!\n"); getch(); clrscr(); printf("Will Enter way to file number 2:\n"); scanf("%s",&fpath2); fptr2=fopen(fpath2,"w"); } for (i=0;i<num;i++) //разбиение по 80 символов { if (arr[i]<0) temp=DecToXZ((~(arr[i])+1),2); else temp=DecToXZ(arr[i],2); for (int j=0;j<strlen(buf2);j++) buf2[j]=0; for (int j=0;j<strlen(buf3);j++) buf3[j]=0; strcpy(buf2,buf1); sprintf(buf3,"%d",temp); strcat(buf2,buf3); if (strlen(buf2)<=80) { if (strlen(buf2)<80) strcat(buf2," "); strcpy(buf1,buf2); if (i==num-1) { len=strlen(buf1); for (int j=0;j<(80-len);j++) strcat(buf1," "); fprintf(fptr2,"%s",buf1); for (int j=0;j<strlen(buf1);j++) buf1[j]=0; } } else { len=strlen(buf1); for (int j=0;j<(80-len);j++) strcat(buf1," "); strcat(buf1,"\n"); fprintf(fptr2,"%s",buf1); for (int j=0;j<strlen(buf1);j++) buf1[j]=0; i--; } } fclose(fptr2); clrscr(); //сохранение в файл №3 printf("Will Enter way to file number 3:\n"); scanf("%s",&fpath3); fptr3=fopen(fpath3,"w"); while (fptr3==0) { printf("\nThe Mistake! Repeat the attempt!\n"); getch(); clrscr(); printf("Will Enter way to file number 3:\n"); scanf("%s",&fpath3); fptr3=fopen(fpath3,"w"); } for (i=0;i<num;i++) //разбиение по 80 символов { if (arr[i]<0) temp=(-1)*DecToXZ(abs(arr[i]),8); else temp=DecToXZ(arr[i],8); for (int j=0;j<strlen(buf2);j++) buf2[j]=0; for (int j=0;j<strlen(buf3);j++) buf3[j]=0; strcpy(buf2,buf1); sprintf(buf3,"%d",temp); strcat(buf2,buf3); if (strlen(buf2)<=80) { if (strlen(buf2)<80) strcat(buf2," "); strcpy(buf1,buf2); if (i==num-1) { len=strlen(buf1); for (int j=0;j<(80-len);j++) strcat(buf1," "); fprintf(fptr2,"%s",buf1); for (int j=0;j<strlen(buf1);j++) buf1[j]=0; } } else { len=strlen(buf1); for (int j=0;j<(80-len);j++) strcat(buf1," "); strcat(buf1,"\n"); fprintf(fptr3,"%s",buf1); for (int j=0;j<strlen(buf1);j++) buf1[j]=0; i--; } } fclose(fptr3); delete []arr; return 0; } |
|