課題:基数変換
Posted: 2010年7月08日(木) 16:04
はじめまして。
以下のことで困っています。
[1] 質問文
[1.1] 課題で、基数変換のプログラムを作っています。
整数部と小数部に分け、それぞれ2進数から20進数まで、最大12桁表示するというものを目指していま す。
[1.2] 以下が自作のソースコードです。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int power(int dx, int no)
{
int tmp=1;
while(no-- > 0)
tmp*=dx;
return(tmp);
}
int main(void)
{
char in1[50]; //基数変換する数(整数部)//
char in2[50]; //基数変換する数(小数部)//
int a=0;
int b=0;
int base1; //基数//
int base2=10;
int i;
int n; //変換後の桁数//
int p1[50];
int p2[50];
int q1[50];
int q2[50];
char out1[12]; //基数変換後の数(整数部)//
char out2[12]; //基数変換後の数(小数部)//
printf("基数変換する数の整数部を入力してください:");
scanf("%c", &in1[50]);
printf("基数変換する数の小数部を入力してください:");
scanf("%c", &in2[50]);
printf("基数を入力してください(2-20):");
scanf("%d", &base1);
printf("変換後の桁数を入力してください(1-12):");
scanf("%d", &n);
//10進数への変換//
for(i=n-1; i=0; i--){
//整数部分//
switch(in1){
case '0' : p1=0; break;
case '1' : p1=1; break;
case '2' : p1=2; break;
case '3' : p1=3; break;
case '4' : p1=4; break;
case '5' : p1=5; break;
case '6' : p1=6; break;
case '7' : p1=7; break;
case '8' : p1=8; break;
case '9' : p1[i]=9; break;
case 'A' : p1[i]=10; break;
case 'B' : p1[i]=11; break;
case 'C' : p1[i]=12; break;
case 'D' : p1[i]=13; break;
case 'E' : p1[i]=14; break;
case 'F' : p1[i]=15; break;
case 'G' : p1[i]=16; break;
case 'H' : p1[i]=17; break;
case 'I' : p1[i]=18; break;
case 'J' : p1[i]=19; break;
}
a+=p1[i]*power(base2, i);
//小数部分//
switch(in2[i]){
case '0' : p2[i]=0; break;
case '1' : p2[i]=1; break;
case '2' : p2[i]=2; break;
case '3' : p2[i]=3; break;
case '4' : p2[i]=4; break;
case '5' : p2[i]=5; break;
case '6' : p2[i]=6; break;
case '7' : p2[i]=7; break;
case '8' : p2[i]=8; break;
case '9' : p2[i]=9; break;
case 'A' : p2[i]=10; break;
case 'B' : p2[i]=11; break;
case 'C' : p2[i]=12; break;
case 'D' : p2[i]=13; break;
case 'E' : p2[i]=14; break;
case 'F' : p2[i]=15; break;
case 'G' : p2[i]=16; break;
case 'H' : p2[i]=17; break;
case 'I' : p2[i]=18; break;
case 'J' : p2[i]=19; break;
}
b+=p2[i]/power(base2, i);
}
//n進数への変換//
for(i=0; i<n; i++){
//整数部分//
q1[i]=a%base1;
switch(q1[i]){
case 0 : out1[i]='0'; break;
case 1 : out1[i]='1'; break;
case 2 : out1[i]='2'; break;
case 3 : out1[i]='3'; break;
case 4 : out1[i]='4'; break;
case 5 : out1[i]='5'; break;
case 6 : out1[i]='6'; break;
case 7 : out1[i]='7'; break;
case 8 : out1[i]='8'; break;
case 9 : out1[i]='9'; break;
case 10 : out1[i]='A'; break;
case 11 : out1[i]='B'; break;
case 12 : out1[i]='C'; break;
case 13 : out1[i]='B'; break;
case 14 : out1[i]='E'; break;
case 15 : out1[i]='F'; break;
case 16 : out1[i]='G'; break;
case 17 : out1[i]='H'; break;
case 18 : out1[i]='I'; break;
case 19 : out1[i]='J'; break;
}
//小数部分//
q2[i]=b*base1;
switch(q2[i]){
case 0 : out2[i]='0'; break;
case 1 : out2[i]='1'; break;
case 2 : out2[i]='2'; break;
case 3 : out2[i]='3'; break;
case 4 : out2[i]='4'; break;
case 5 : out2[i]='5'; break;
case 6 : out2[i]='6'; break;
case 7 : out2[i]='7'; break;
case 8 : out2[i]='8'; break;
case 9 : out2[i]='9'; break;
case 10 : out2[i]='A'; break;
case 11 : out2[i]='B'; break;
case 12 : out2[i]='C'; break;
case 13 : out2[i]='B'; break;
case 14 : out2[i]='E'; break;
case 15 : out2[i]='F'; break;
case 16 : out2[i]='G'; break;
case 17 : out2[i]='H'; break;
case 18 : out2[i]='I'; break;
case 19 : out2[i]='J'; break;
}
}
printf("整数部:%c", &out1[12]);
printf("小数部:0.%c", &out2[12]);
return(0);
}
[1.3] デバッグでエラー・警告は出ないのですが、
エラー:Debug Error
Run-Time Check Failure #2
Stack around the variable 'in1' was corrupted
ここで再試行を選択すると、以下のメッセージが出ます。
例外unknown software exception(0x8000003)がアプリケーションの0x7c94120eで発生しまし た
また、入力値(小数部)in2と基数が同じ行に表示される
肝心の変換後の値が出ない
というトラブルも起こっています。
[1.4] とりあえず、明日までの課題なので、早急に1.3の事項について解決したいです。
[2] 環境
[2.1] OS : Windows XP
[2.2] コンパイラ名 : VC++(Visual Studio2005)
[3] その他
・プログラミング全般に関して初心者です。
よろしくお願いいたします。
以下のことで困っています。
[1] 質問文
[1.1] 課題で、基数変換のプログラムを作っています。
整数部と小数部に分け、それぞれ2進数から20進数まで、最大12桁表示するというものを目指していま す。
[1.2] 以下が自作のソースコードです。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int power(int dx, int no)
{
int tmp=1;
while(no-- > 0)
tmp*=dx;
return(tmp);
}
int main(void)
{
char in1[50]; //基数変換する数(整数部)//
char in2[50]; //基数変換する数(小数部)//
int a=0;
int b=0;
int base1; //基数//
int base2=10;
int i;
int n; //変換後の桁数//
int p1[50];
int p2[50];
int q1[50];
int q2[50];
char out1[12]; //基数変換後の数(整数部)//
char out2[12]; //基数変換後の数(小数部)//
printf("基数変換する数の整数部を入力してください:");
scanf("%c", &in1[50]);
printf("基数変換する数の小数部を入力してください:");
scanf("%c", &in2[50]);
printf("基数を入力してください(2-20):");
scanf("%d", &base1);
printf("変換後の桁数を入力してください(1-12):");
scanf("%d", &n);
//10進数への変換//
for(i=n-1; i=0; i--){
//整数部分//
switch(in1){
case '0' : p1=0; break;
case '1' : p1=1; break;
case '2' : p1=2; break;
case '3' : p1=3; break;
case '4' : p1=4; break;
case '5' : p1=5; break;
case '6' : p1=6; break;
case '7' : p1=7; break;
case '8' : p1=8; break;
case '9' : p1[i]=9; break;
case 'A' : p1[i]=10; break;
case 'B' : p1[i]=11; break;
case 'C' : p1[i]=12; break;
case 'D' : p1[i]=13; break;
case 'E' : p1[i]=14; break;
case 'F' : p1[i]=15; break;
case 'G' : p1[i]=16; break;
case 'H' : p1[i]=17; break;
case 'I' : p1[i]=18; break;
case 'J' : p1[i]=19; break;
}
a+=p1[i]*power(base2, i);
//小数部分//
switch(in2[i]){
case '0' : p2[i]=0; break;
case '1' : p2[i]=1; break;
case '2' : p2[i]=2; break;
case '3' : p2[i]=3; break;
case '4' : p2[i]=4; break;
case '5' : p2[i]=5; break;
case '6' : p2[i]=6; break;
case '7' : p2[i]=7; break;
case '8' : p2[i]=8; break;
case '9' : p2[i]=9; break;
case 'A' : p2[i]=10; break;
case 'B' : p2[i]=11; break;
case 'C' : p2[i]=12; break;
case 'D' : p2[i]=13; break;
case 'E' : p2[i]=14; break;
case 'F' : p2[i]=15; break;
case 'G' : p2[i]=16; break;
case 'H' : p2[i]=17; break;
case 'I' : p2[i]=18; break;
case 'J' : p2[i]=19; break;
}
b+=p2[i]/power(base2, i);
}
//n進数への変換//
for(i=0; i<n; i++){
//整数部分//
q1[i]=a%base1;
switch(q1[i]){
case 0 : out1[i]='0'; break;
case 1 : out1[i]='1'; break;
case 2 : out1[i]='2'; break;
case 3 : out1[i]='3'; break;
case 4 : out1[i]='4'; break;
case 5 : out1[i]='5'; break;
case 6 : out1[i]='6'; break;
case 7 : out1[i]='7'; break;
case 8 : out1[i]='8'; break;
case 9 : out1[i]='9'; break;
case 10 : out1[i]='A'; break;
case 11 : out1[i]='B'; break;
case 12 : out1[i]='C'; break;
case 13 : out1[i]='B'; break;
case 14 : out1[i]='E'; break;
case 15 : out1[i]='F'; break;
case 16 : out1[i]='G'; break;
case 17 : out1[i]='H'; break;
case 18 : out1[i]='I'; break;
case 19 : out1[i]='J'; break;
}
//小数部分//
q2[i]=b*base1;
switch(q2[i]){
case 0 : out2[i]='0'; break;
case 1 : out2[i]='1'; break;
case 2 : out2[i]='2'; break;
case 3 : out2[i]='3'; break;
case 4 : out2[i]='4'; break;
case 5 : out2[i]='5'; break;
case 6 : out2[i]='6'; break;
case 7 : out2[i]='7'; break;
case 8 : out2[i]='8'; break;
case 9 : out2[i]='9'; break;
case 10 : out2[i]='A'; break;
case 11 : out2[i]='B'; break;
case 12 : out2[i]='C'; break;
case 13 : out2[i]='B'; break;
case 14 : out2[i]='E'; break;
case 15 : out2[i]='F'; break;
case 16 : out2[i]='G'; break;
case 17 : out2[i]='H'; break;
case 18 : out2[i]='I'; break;
case 19 : out2[i]='J'; break;
}
}
printf("整数部:%c", &out1[12]);
printf("小数部:0.%c", &out2[12]);
return(0);
}
[1.3] デバッグでエラー・警告は出ないのですが、
エラー:Debug Error
Run-Time Check Failure #2
Stack around the variable 'in1' was corrupted
ここで再試行を選択すると、以下のメッセージが出ます。
例外unknown software exception(0x8000003)がアプリケーションの0x7c94120eで発生しまし た
また、入力値(小数部)in2と基数が同じ行に表示される
肝心の変換後の値が出ない
というトラブルも起こっています。
[1.4] とりあえず、明日までの課題なので、早急に1.3の事項について解決したいです。
[2] 環境
[2.1] OS : Windows XP
[2.2] コンパイラ名 : VC++(Visual Studio2005)
[3] その他
・プログラミング全般に関して初心者です。
よろしくお願いいたします。