質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3041閲覧

多桁計算機(加算)の作成

mudannkesseki

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/18 16:38

編集2018/09/19 00:56

### 仕様
・2数の整数を文字列として入力する
・各桁の文字を数字押して再表現する
・それぞれの文字列の前後の並べ替えを行う
・各桁ごとに、それぞれの数字と桁上げを足し合わせる 桁上げの初期値は0とする
・↑で得られた数を10で割ったときの余りを答えの配列へ、商を次段の桁上げとして記憶
・答えの配列の前後を入れ替え、さらに数字を文字として表現する

    123        a[2] a[1] a[0]
+456   → + b[2] b[1] b[0]
----- -------------------
とした方が処理しやすいため。

### 現状
計算結果が何を入力しても 4 と出てくる。
2桁+2桁 をすると、4が先頭の4桁の数字が出てきたりする。
原因がわからないので見ていただきたいです。

C言語

1#include<stdio.h> 2#include<string.h> 3int main() 4{ 5 char a[50],b[50],c[50],d[50],n[50],m[50]; 6 int len1,len2,len3,i,z,x,y,p,q,k; 7 8 printf("INput the number a : "); 9 scanf("%s",a); 10 printf("INput the number b : "); 11 scanf("%s",b); 12 13 len1=strlen(a); 14 len2=strlen(b); 15 16 for(q=0;q<len1;q++){ 17 a[q]-=48; 18 } 19 20 for(q=0;q<len2;q++){ 21 b[q]-=48; 22 } 23 k=0; 24 for(i=len1-1;i>0;i--){ 25 n[i]=a[k]; 26 k++; 27 } 28 29 30 k=0; 31 for(i=len2-1;i>0;i--){ 32 m[i]=b[k]; 33 k++; 34 } 35 36 37 if(len1>len2 || len1=len2){ 38 k=0; 39 z=0; 40 for(p=0;p<len1+2;p++){ 41 x=n[p]+m[p]+z; 42 y=x%10; 43 z=x/10; 44 c[k]=y; 45 k++; 46 } 47 } 48 else if(len2>len1){ 49 k=0; 50 z=0; 51 for(p=0;p<len2+2;p++){ 52 x=n[p]+m[p]+z; 53 y=x%10; 54 z=x/10; 55 c[k]=y; 56 k++; 57 } 58 } 59 60 len3=strlen(c); 61 62 k=0; 63 for(i=len3-1;i>0;i--){ 64 d[i]=c[k]; 65 k++; 66 } 67 68 for(q=0;q<len3;q++){ 69 d[q]+=48; 70 } 71 72 printf("Answer : %s",d); 73 74 return 0; 75 76} 77

### 補足
学習用C言語開発環境を使用。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/09/18 23:50

C#タグは関係ないように思います。また、コードを掲載するときはコードブロックを使い適切にインデントをしましょう。
mudannkesseki

2018/09/19 00:57

有難うございます。コード挿入の方法があったんですね???? 編集いたしました。
guest

回答2

0

ベストアンサー

k=0;
for(i=len1-1;i>0;i--){
n[i]=a[k];
k++;
}

n[0]が代入されないので不定値になります。
このミスは、後のすべての反転処理で起こっています。

if(len1>len2 || len1=len2){

len1にlen2を代入しています。
len1がlen2以上という条件なら
if(len1 >= len2)になります。

else if (len2 > len1)

わざわざifつける必要はないですね

len3=strlen(c);

cは文字の配列ではないのでstrlenで何が返ってくるかはわかりません。

c

1// len1 >= len2の場合 2len3 = c[len1] != 0 ? len1 + 1 : len1; 3// len2 < len1の場合 4len3 = c[len2] != 0 ? len2 + 1 : len2;

最後に、表示前にd[len3] = '\0';で終端文字を入れます。

投稿2018/09/19 00:31

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mudannkesseki

2018/09/20 09:23

ご丁寧に有難うございます。len3=strlen(c)の部分を以下のプログラムに書き換えると、出力に必ず+40された値がでてきました。何が原因かもしよろしければ教えていただけませんか。 if(len1>=len2){ len3=len1+1; } else(len2>len1);{ len3=len2+1; } k=0; for(i=len3-1;i>0;i--){ d[i]=c[k]; k++; } for(q=0;q<len3;q++){ d[q]+=48; } d[len3]='\0'; printf("Answer : %s",d);
asm

2018/09/20 10:06

確認しました。 mおよびnを初期化せずに使っているためゴミが混入するようです。 変数定義時にn[50] = {0}, m[50] = {0};とすることで当環境では改善しました。
mudannkesseki

2018/09/21 15:38 編集

有難うございます。私もやってみたのですが、うまくいきませんでした。先日、+40されるといってしまいましたが、本当は、出力の先頭にかならず4がくる の間違いでした。申し訳ないです。 こちら全体のコードで長くて申し訳ないのですが、お時間がある際に見ていただけたらと思います。 部分的に取り出して実行してみたら、計算まえはうまくいってそうなので、問題は計算部分のifとelseのところなのかなと考えています。99+1=100のときみたいに、入力した桁数よりも答えの方が桁が増えるときを考慮すると、計算をやめる命令が分かりません。 ``` #include<stdio.h> #include<string.h> int main() { char a[50],b[50],c[50],d[50],n[50]={0},m[50]={0}; int len1,len2,len3,i,z,x,y,p,q,k,t,u; printf("INput the number a : "); scanf("%s",a); printf("INput the number b : "); scanf("%s",b); len1=strlen(a); len2=strlen(b); for(q=0;q<len1;q++){ a[q]-=48; } for(q=0;q<len2;q++){ b[q]-=48; //-48 } k=0; for(i=len1-1;i>=0;i--){ n[i]=a[k]; k++; } k=0; for(i=len2-1;i>=0;i--){ m[i]=b[k]; k++; } //反転 if(len1>=len2){ k=0; z=0; for(p=0;p<len1;p++){ x=n[p]+m[p]+z; y=x%10; z=x/10; c[k]=y; k++; } } else(len2>len1);{ k=0; z=0; for(p=0;p<len2;p++){ x=n[p]+m[p]+z; y=x%10; z=x/10; c[k]=y; k++; } } //計算 if(len1>=len2){ len3=len1+1; } else(len2>len1);{ len3=len2+1; } k=0; for(i=len3-1;i>0;i--){ d[i]=c[k]; k++; } //反転 for(q=0;q<len3;q++){ d[q]+=48; printf("%d \n",d[q]); } //+48 d[len3]='\0'; printf("Answer : %s",d); return 0; } ```
asm

2018/09/21 16:08

計算部分の条件式はlen1もしくはlen2の大きい方+1です。 len3は回答の通りc[len3]の値が0か非0かで変わります。 最後の答えの反転の条件式を見直してください。 else(len2>len1); これは非常に危険です。 if(省略){略} else len2 > len1; と同じ事になります。if-elseについて復習した方がよいでしょう。 以上を修正して https://wandbox.org/permlink/vUHCySIEXGJZ6BkI こうなります。
mudannkesseki

2018/09/21 16:21

大きい方+1でしたか。気づけませんでした...。プログラム実行できました。有難うございます。 プログラミングもteratailも初心者でして、コメントでもコード挿入できると勘違いしており、大変見づらいのに回答していただいて本当に申し訳ないです。これからは追記でコード挿入するよう気を付けます。 度々お答えいただいき本当にありがとうございました。
asm

2018/09/21 16:26

桁上りがあるものとして計算前にlen3 = len1かlen2の大きい方+1にして計算した後に 最上位桁c[len3]が0の場合はlen3を1減らすの方が処理が簡単になるかもしれませんね。 コメントにコード書けないのはこのサイトの中でも分かりづらい仕様だと思いますね…
guest

0

処理の内容は見てませんが、いくつかあどばいすを。

for(q=0;q<len1;q++){

a[q]-=48;
}

char* s;
for(s=a;*s;s++) *s-='0';

とできます。

if(len1>len2 || len1=len2){

これは、
if(len1>=len2){
とおなじですね

for(i=len1-1;i>0;i--){

for(i=len1-1;i>=0;i--){
の間違いでは。

WindowsでやってるならVisualStudioを使ってデバッグするようにしましょう。
そうすれば、当てずっぽでコードを書かなくて済むようになります

投稿2018/09/19 00:05

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問