소스 해석이 미흡합니다 같은조라는 사람들은 잘 도와주짇않구요 ㅠㅠ
소스 해석 을 부탁드려도될까요? 아는건 적어봤는데 ㅠ 영 힘드네요
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<time.h> #define BER 0.1
#define frequency 100000 void main()
{
char* data_D; //보내는 데이터 배열로 사용할 포인터 변수
char* send_D; //받는 데이터 배열로 사용할 포인터 변수
char* divisor_P; //제수 배열로 사용할 포인터 변수
char* shift_R; //쉬프트 레지스트 배열로 사용할 포인터 변수
int length_data; //송신부 데이터 배열의 길이만큼의 변수
int length_send_D; //수신부 데이터 배열의 길이만큼의 변수
int length_divisor; //제수 배열의 길이만큼의 변수
int length_shift; //쉬프트 배열의 길이만큼의 변수
int total_error_cnt = 0;
int error_c = 0;
int error = 0;
int not_error = 0;
double rrand = 0;
double no_error = 0;
int D; int i,j,x,z,y;
char data[255+1];
char divisor[255+1];
FILE *fp;
fp = fopen("CRCTEST.txt", "w");
srand( (unsigned)time( NULL ) ); //시간에 따라 랜덤값이 변환
//데이터 입력
printf("\n");
printf(" 순환 중복 검사 \n");
//printf(" 2003730010 김만수 \n");
//printf(" 2005732034 민진경 \n");
printf("\n Input Data :");
scanf("%s" , data); length_data = strlen(data);
data_D = (char*)malloc(sizeof(char)*length_data);
strcpy(data_D, data);
//제수 입력
printf("\n Input Divisor :");
scanf("%s" , divisor);
length_divisor = strlen(divisor);
divisor_P = (char*)malloc(sizeof(char)*length_divisor);
strcpy(divisor_P, divisor);
//시프트 레지스터 배열
length_shift = length_divisor - 1;
shift_R = (char*)malloc(sizeof(char)*length_shift);
//샌드 데이터 배열
length_send_D = length_data + length_shift; //D + FCS 비트
send_D = (char*)malloc(sizeof(char)*length_send_D);
//메뉴
for(y=0; y<frequency; y++)
{
total_error_cnt=0;
error_c=0;
for(i=0; i<length_shift; i++)
{
shift_R[i] = '0';
}shift_R[length_shift]='\0';
for(i=0; i<length_send_D; i++)
{
send_D[i] = '0';
}send_D[length_send_D]='\0';
//텍스트 출력
fprintf(fp,"%d 번째\n", y+1);
fprintf(fp,"\n 송신 출력 \n\n");
for(i=0; i<length_data+1; i++)
{
if(i==0)
{
fprintf(fp," ");
for(z=length_shift-1 ; z >= 0 ; z--)
{
fprintf(fp," C%d " , z);
}
fprintf(fp," Input");
fprintf(fp,"\n");
}
else
{
fprintf(fp," %3d " , i );
} //쉬프트 레지스터, 데이타 출력
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%3c ",shift_R[j]);
if(j==length_shift-1)
{
if(i!=length_data)
{
fprintf(fp," %c" , data_D[i]);
}
}
}
//쉬프트 레지스터 데이타 송신 및 제수와 나누기
rrand = ((double)rand())/((double)RAND_MAX); if(rrand < BER)
{
send_D[i] = ((!(data_D[i]-'0'))+'0');
total_error_cnt++;
}
else
{
send_D[i] = data_D[i];
} D = ((shift_R[0]-'0')^(data_D[i]-'0')+'0'); // exclusive
for(x=0; x<length_shift; x++)
{
if(i!=length_data)
{
if(x!=length_shift-1)
{
shift_R[x] = ((((divisor_P[x+1]-'0')&(D-'0'))^(shift_R[x+1]-'0'))+'0');
}
else
{
shift_R[x] = D;
}
}
}
shift_R[x]='\0';
fprintf(fp,"\n");
}
fprintf(fp,"\n");
//출력
fprintf(fp," FCS = ");
for(j=0; j<length_shift; j++)
{
fprintf(fp," %c",shift_R[j]);
if(rrand < BER)
{
send_D[j+length_data] = ((!(shift_R[j]-'0'))+'0');
total_error_cnt++;
}
else
{
send_D[j+length_data] = shift_R[j];
}
}
send_D[j+length_data]='\0';
fprintf(fp,"\n");
fprintf(fp," 입력 데이터 D = %s\n" ,data_D);
fprintf(fp," 제수 P = %s\n" ,divisor_P);
fprintf(fp," 송신 데이터 T = %s\n\n" ,send_D);
//레지스터 초기화
memset(shift_R,'0',length_shift);
//메뉴
fprintf(fp,"%d 번째\n", y+1);
fprintf(fp,"\n 수신 출력 \n\n");
for(i=0; i<length_send_D+1; i++)
{
if(i==0)
{
fprintf(fp," ");
for(z = length_shift-1 ; z >= 0 ; z--)
{
fprintf(fp," C%d " , z);
}
fprintf(fp," Input");
fprintf(fp,"\n");
}
else
{
fprintf(fp," %3d " ,i);
}
//쉬프트 레지스터, 데이타 출력
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%3c ",shift_R[j]);
if(j==length_shift-1)
{
if(i!=length_send_D)
{
fprintf(fp," Input = %c" , send_D[i]);
}
}
}
//쉬프트 레지스터 데이타 송신 및 제수와 나누기
D = ((shift_R[0]-'0')^(send_D[i]-'0')+'0');
for(x=0; x<length_shift; x++)
{
if(i!=length_send_D)
{
if(x!=length_shift-1)
{
shift_R[x] = ((((divisor_P[x+1]-'0')&(D-'0'))^(shift_R[x+1]-'0'))+'0');
}
else
{
shift_R[x] = D;
}
}
}
shift_R[x]='\0';
fprintf(fp,"\n");
}
fprintf(fp,"\n");
//출력
fprintf(fp," FCS = ");
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%2c",shift_R[j]);
}
fprintf(fp,"\n");
if(total_error_cnt > 0)
{
fprintf(fp," ERROR \n\n");
error++;
for(i=0; i<length_shift; i++)
{
if(shift_R[i] == '0')
{
error_c++;
}
}
if(error_c == length_shift )
{
fprintf(fp,"보이지 않는 에러 \n\n");
no_error++;
}
}
else
{
fprintf(fp,"에러 없음\n\n");
not_error++;
}
}
printf("\n");
printf("에러 발생 갯수 : %d개\n\n",error);
printf("에러 발생했지만 보이지 않는 갯수: %d개\n\n",(int)no_error);
printf("에러 발생하지 않은 갯수 : %d개\n\n",not_error);
printf("보이지 않는 에러의 확률 : %.2lf %%\n\n",(no_error/frequency)*100);
//printf("프레임 에러의 확률 : %d개\n\n",(/)*100);
}
=----------------------------------------------------------------------------------------------------------------------------------------=
첨부의 그림과같은 오류 검사를 하는 crc의 프로그래밍입니다 ㅠ 부탁드립니다 ㅠㅠ
소스 해석 을 부탁드려도될까요? 아는건 적어봤는데 ㅠ 영 힘드네요
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<time.h> #define BER 0.1
#define frequency 100000 void main()
{
char* data_D; //보내는 데이터 배열로 사용할 포인터 변수
char* send_D; //받는 데이터 배열로 사용할 포인터 변수
char* divisor_P; //제수 배열로 사용할 포인터 변수
char* shift_R; //쉬프트 레지스트 배열로 사용할 포인터 변수
int length_data; //송신부 데이터 배열의 길이만큼의 변수
int length_send_D; //수신부 데이터 배열의 길이만큼의 변수
int length_divisor; //제수 배열의 길이만큼의 변수
int length_shift; //쉬프트 배열의 길이만큼의 변수
int total_error_cnt = 0;
int error_c = 0;
int error = 0;
int not_error = 0;
double rrand = 0;
double no_error = 0;
int D; int i,j,x,z,y;
char data[255+1];
char divisor[255+1];
FILE *fp;
fp = fopen("CRCTEST.txt", "w");
srand( (unsigned)time( NULL ) ); //시간에 따라 랜덤값이 변환
//데이터 입력
printf("\n");
printf(" 순환 중복 검사 \n");
//printf(" 2003730010 김만수 \n");
//printf(" 2005732034 민진경 \n");
printf("\n Input Data :");
scanf("%s" , data); length_data = strlen(data);
data_D = (char*)malloc(sizeof(char)*length_data);
strcpy(data_D, data);
//제수 입력
printf("\n Input Divisor :");
scanf("%s" , divisor);
length_divisor = strlen(divisor);
divisor_P = (char*)malloc(sizeof(char)*length_divisor);
strcpy(divisor_P, divisor);
//시프트 레지스터 배열
length_shift = length_divisor - 1;
shift_R = (char*)malloc(sizeof(char)*length_shift);
//샌드 데이터 배열
length_send_D = length_data + length_shift; //D + FCS 비트
send_D = (char*)malloc(sizeof(char)*length_send_D);
//메뉴
for(y=0; y<frequency; y++)
{
total_error_cnt=0;
error_c=0;
for(i=0; i<length_shift; i++)
{
shift_R[i] = '0';
}shift_R[length_shift]='\0';
for(i=0; i<length_send_D; i++)
{
send_D[i] = '0';
}send_D[length_send_D]='\0';
//텍스트 출력
fprintf(fp,"%d 번째\n", y+1);
fprintf(fp,"\n 송신 출력 \n\n");
for(i=0; i<length_data+1; i++)
{
if(i==0)
{
fprintf(fp," ");
for(z=length_shift-1 ; z >= 0 ; z--)
{
fprintf(fp," C%d " , z);
}
fprintf(fp," Input");
fprintf(fp,"\n");
}
else
{
fprintf(fp," %3d " , i );
} //쉬프트 레지스터, 데이타 출력
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%3c ",shift_R[j]);
if(j==length_shift-1)
{
if(i!=length_data)
{
fprintf(fp," %c" , data_D[i]);
}
}
}
//쉬프트 레지스터 데이타 송신 및 제수와 나누기
rrand = ((double)rand())/((double)RAND_MAX); if(rrand < BER)
{
send_D[i] = ((!(data_D[i]-'0'))+'0');
total_error_cnt++;
}
else
{
send_D[i] = data_D[i];
} D = ((shift_R[0]-'0')^(data_D[i]-'0')+'0'); // exclusive
for(x=0; x<length_shift; x++)
{
if(i!=length_data)
{
if(x!=length_shift-1)
{
shift_R[x] = ((((divisor_P[x+1]-'0')&(D-'0'))^(shift_R[x+1]-'0'))+'0');
}
else
{
shift_R[x] = D;
}
}
}
shift_R[x]='\0';
fprintf(fp,"\n");
}
fprintf(fp,"\n");
//출력
fprintf(fp," FCS = ");
for(j=0; j<length_shift; j++)
{
fprintf(fp," %c",shift_R[j]);
if(rrand < BER)
{
send_D[j+length_data] = ((!(shift_R[j]-'0'))+'0');
total_error_cnt++;
}
else
{
send_D[j+length_data] = shift_R[j];
}
}
send_D[j+length_data]='\0';
fprintf(fp,"\n");
fprintf(fp," 입력 데이터 D = %s\n" ,data_D);
fprintf(fp," 제수 P = %s\n" ,divisor_P);
fprintf(fp," 송신 데이터 T = %s\n\n" ,send_D);
//레지스터 초기화
memset(shift_R,'0',length_shift);
//메뉴
fprintf(fp,"%d 번째\n", y+1);
fprintf(fp,"\n 수신 출력 \n\n");
for(i=0; i<length_send_D+1; i++)
{
if(i==0)
{
fprintf(fp," ");
for(z = length_shift-1 ; z >= 0 ; z--)
{
fprintf(fp," C%d " , z);
}
fprintf(fp," Input");
fprintf(fp,"\n");
}
else
{
fprintf(fp," %3d " ,i);
}
//쉬프트 레지스터, 데이타 출력
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%3c ",shift_R[j]);
if(j==length_shift-1)
{
if(i!=length_send_D)
{
fprintf(fp," Input = %c" , send_D[i]);
}
}
}
//쉬프트 레지스터 데이타 송신 및 제수와 나누기
D = ((shift_R[0]-'0')^(send_D[i]-'0')+'0');
for(x=0; x<length_shift; x++)
{
if(i!=length_send_D)
{
if(x!=length_shift-1)
{
shift_R[x] = ((((divisor_P[x+1]-'0')&(D-'0'))^(shift_R[x+1]-'0'))+'0');
}
else
{
shift_R[x] = D;
}
}
}
shift_R[x]='\0';
fprintf(fp,"\n");
}
fprintf(fp,"\n");
//출력
fprintf(fp," FCS = ");
for(j=0; j<length_shift; j++)
{
fprintf(fp,"%2c",shift_R[j]);
}
fprintf(fp,"\n");
if(total_error_cnt > 0)
{
fprintf(fp," ERROR \n\n");
error++;
for(i=0; i<length_shift; i++)
{
if(shift_R[i] == '0')
{
error_c++;
}
}
if(error_c == length_shift )
{
fprintf(fp,"보이지 않는 에러 \n\n");
no_error++;
}
}
else
{
fprintf(fp,"에러 없음\n\n");
not_error++;
}
}
printf("\n");
printf("에러 발생 갯수 : %d개\n\n",error);
printf("에러 발생했지만 보이지 않는 갯수: %d개\n\n",(int)no_error);
printf("에러 발생하지 않은 갯수 : %d개\n\n",not_error);
printf("보이지 않는 에러의 확률 : %.2lf %%\n\n",(no_error/frequency)*100);
//printf("프레임 에러의 확률 : %d개\n\n",(/)*100);
}
=----------------------------------------------------------------------------------------------------------------------------------------=
첨부의 그림과같은 오류 검사를 하는 crc의 프로그래밍입니다 ㅠ 부탁드립니다 ㅠㅠ
음...저도 C언어 잘하는편은 아니지만...이정도는...학생이시면 공부해서 해야죠...
문법이 그렇게 어려운부분이 있는것도 아닌거 같은데....그냥 과제 해달라고 하는거 같음...
막말해서 죄송한데요...제가 학생떄 그랬거든요...
그래서 지금 남는게 하나도 없음...처음부터 다시 문법공부부터 해서 이제서야 펌웨어 기초적인것 쓸줄 암
글고 왠마한건 주석 다 달렸잖아요 단락단락 위에...
대충 하실줄 아시면 하루 맘잡고 해보세요
그래야 실력늘어 납니다...누구한테 해달라고 하면 졸업은 커녕 사회나와서 취업 안됩니다
별로 어려운 것도 아닌데, 막상 보려고 하니, 눈을 아주 피곤하게 하는 군요.
모든 것을 해달라고 하면, 해주는 사람 없을 것입니다.
아마도 돈을 달라고 하겠죠.
도움을 받고자 원한다면, 공부하다가 모르는 부분을 정확하게 설명하여 문의하시면,
아마도 상세한 답변과 부연 설명을 들을 수 있지 않을까 합니다
보통 고수들은 공부하거나 성의가 없는 사람에게도 일인반구 관심을 갖지 않거든요.
그리고 마음만 맞으면, 거의모든 것을 알려주기도 하죠/
계속 붙여놓으셨어요;;;;;
감사합니다...