• ベストアンサー

C言語超初級

はじめまして。 自分は大学入ってからC言語を勉強しています。 授業で課題が出ているのですが難しくてどうすればいいかわかりません。 プロの皆さんには楽勝だと思いますがよろしくおねがいします。 内容 いろいろ計算して出てきた商品価格(例えば1234567円)に位取りのカンマを挿入して表示する関数(int型の最大桁数である10桁の数値まで表示できるようにすること)を作成する。 1234567→1,234,567 見たいな感じです。 自分でも考えたいのでよろしかったら考え方みたいなのをヒントください。 ちなみにこの一ヶ月でならったことは int,float,char,if,for,swhitch,while,scanf,printf,簡単な関数の作り方くらいです。数少ない武器ですがこれらの道具でお願いします。 胸を貸してください。

  • kiki28
  • お礼率71% (240/337)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.11

問題のint型数値がnumberに置数されているものとします。 まず、3桁ごとにx1,x2,x3,x4に分類しましょう。 1)numberを1000000000で割った商をx1に、余りをnumberに格納します。 2)numberを1000000で割った商をx2に、余りをnumberに格納します。 3)numberを1000で割った商をx3に、余りをx4に格納します。 このx1,x2,x3,x4を印刷すればいいのですが、numberに意地のわるい 数字(1とか0)が入っていると困るので、場合分けしましょう。 1)x1,x2,x3が共にゼロのとき   x4を印刷して終了。   この書式は"%d\n"です。 2)x1,x2が共にゼロのとき   x3,x4を印刷して終了。   この書式は"%d,%d\n"です。 3)x1がゼロのとき   x2,x3,x4を印刷して終了。   この書式は"%d,%d,%d\n"です。 4)その他のとき   x1,x2,x3,x4を印刷して終了。   この書式は"%d,%d,%d,%d\n"です。 ね、初心者らしい解き方でしょ!?

kiki28
質問者

お礼

ありがとうございます。 この方法は自分も考え付きました。 ただ最初の値がfloat型だったのであまりを出せませんでした。 でもこねくりまわしたら結果的に表示はできました。 komaさんにはnumberを中継することで定義する関数を減らすことを学びました。ありがとうございます。

その他の回答 (11)

回答No.12

No.11です。 誤文訂正させて! 1)x1,x2,x3が共にゼロのとき   x4を印刷して終了。   この書式は"%d"です。 2)x1,x2が共にゼロのとき   x3,x4を印刷して終了。   この書式は"%d,%03d"です。 3)x1がゼロのとき   x2,x3,x4を印刷して終了。   この書式は"%d,%03d,%03d"です。 4)その他のとき   x1,x2,x3,x4を印刷して終了。   この書式は"%d,%03d,%03d,%03d"です。 先頭以外の%dは、全部%03dに変更です。(^^;

  • nano_cat
  • ベストアンサー率24% (26/106)
回答No.10

No.9です。感激していただいて、私も嬉しいです。 特に「今まで習ったものだけを使うように」という 指定がなければ使っていいと思います。 cの関数ライブラリを作る際は、まずsprintfを作って、 これを利用して、printfやfprintfを作るような気が します。 でもsprintfを使わなくても、sprintfと同様に できますよ。 int n; char buf[ 20 ]; n = 1234567; buf[ 0 ] = '0' + n / 1000000; buf[ 1 ] = '0' + ( n - ( n / 1000000 ) * 1000000 ) / 100000; ・・・・・ などのように。nの大きさに注意しないといけません。 (上の例はnは7桁と仮定しています。8桁以上だと うまくいきません。6桁以下ならば'0'が頭にくっつ いてしまう。問題は最大10桁だから、10桁でやって、 10桁未満の時の頭の'0'は取るようにすることも できる。) forループで回せばエレガントです。

kiki28
質問者

お礼

ありがとうございます。 これだと入れ替えることができますね。 でも今回は100ずつかえて割ったほうが懸命みたいですね。 またの機会に使わせていただきます。きっと使う日が来ると思います。 そのときはよろしく(?)

  • nano_cat
  • ベストアンサー率24% (26/106)
回答No.9

sprintf という関数があります。 printfの頭にsが付いたもの。 printfは画面に出力しますが、 sprintfは文字配列に出力します。 (他にfprintfというのもあります。これはファイルに 出力します。) これを使えば文字として扱えます。 int n; char buf[ 20 ]; n = 1234567; sprintf( buf, "%d", n ); としますと、 buf[ 0 ] に、'1'、 buf[ 1 ] に、'2'、 buf[ 2 ] に、'3'、 buf[ 3 ] に、'4'、 buf[ 4 ] に、'5'、 buf[ 5 ] に、'6'、 buf[ 6 ] に、'7'、 buf[ 7 ] に、'\0' が入ります。 文字列の長さを調べて(strlenという関数があります) 後はテキトーに。

kiki28
質問者

お礼

うおおー・・ sprintf ってすごいですね! そうですよ、これがしたかったのです。これをしなくてもできるみたいですけど。 しかし・・くっ・・・!使っちゃいけないのかな? 使ってもいいと思いますか?習ってないのですが。 算数みたいです。後になればすぐできる公式があるのに今は使うなみたいな。いいのかな? ありがとうございました!

noname#30727
noname#30727
回答No.8

>int,float,char,if,for,swhitch,while,scanf,printf これだけを使って表示させるには、文字配列に、右側から1文字ずつ書き込んでprintfで一括表示させるか、再帰的に左から1文字ずつ表示させるかのどちらかが簡単だと思います。 再帰は習っていないと思いますが、実は再帰の方が簡単なので、あえて再帰で書いてみます。多少の参考にはなると思います。 ちなみに、負数の最小値を指定するとちゃんと表示できません(笑 #include <stdio.h> void display(int n, int d) { if (n < 0) { printf("-"); n = -n; } if (n >= 10) { display(n / 10, d + 1); } printf("%d", n % 10); if (d && d % 3 == 0) { printf(","); } } int main() { int n; printf("intput: "); scanf("%d", &n); display(n, 0); printf("\n"); return (0); }

noname#16581
noname#16581
回答No.7

頭の桁がいくつあるかとそのあとの3桁がいくつあるかを考えて、「,」を挿入していきます。 一文字づつ別のchar型にコピーしていけばいいと思います。 あまり他の回答者さんのようにエレガントではないですが。 慣れれば、他のやり方も見つかると思います。 回答そのものですが、以下ソース #include<stdio.h> #include<string.h> int main() { int Num=1234567890; int Keta=1; char Str0[128];int m=0; char Str1[128];int n=0; sprintf(Str0,"%d",Num); while(Num/10!=0){Num/=10;Keta++;} int a=Keta%3; int b=Keta/3; if(a!=0) { strcpy(&Str1[n],&Str0[m]); n+=a; m+=a; Str1[n]=',';Str1[n+1]='\0'; n++; } for(int i=0;i<b;i++) { strcpy(&Str1[n],&Str0[m]); n+=3; m+=3; if(i<b-1) { Str1[n]=',';Str1[n+1]='\0'; n++; } } printf(Str1); getchar(); return 0; }

kiki28
質問者

お礼

たくさん打っていただきありがとうございます。 まだよんでませんがどうもポインタを使ってるみたいですか? 若干苦しいプログラムです。ごめんなさい。 また勉強したらしっかり読もうと思います。

  • EUR
  • ベストアンサー率61% (29/47)
回答No.6

たびたびすみません。 No1さんの回答に対して質問者さんが書いた「回答に関する補足」に対する補足ですが、 課題は表示を行えばいいとのことなので、printfのみで結果を表示することが出来ます。 No2さんのprintfの仕様を見てみましょうというのは、うまくprintfを用いれば、ループなどまわす必要もなく、すんなりと表示してくれるよ、と言う意味だと思います。 例、 printf("abc"); → abc と表示される char str[4] = "def"; pringf("%s", str); → def と表示される int num = 123; printf("%d", num); → 123 と表示される char str[4] = "ghi"; int num = 456; printf("%s%d", str, num) → ghi456 と表示される char str[4] = "jkl"; int num = 789; printf("%s何か挟んでみる%d", str, num) → ghi何か挟んでみる456 と表示される という感じです。

kiki28
質問者

お礼

あ、確かに。でも10桁指定のプログラムっぽくて微妙な印象を受けてしまいます。 %sって%cと一緒でしたよね?・・・自分で調べます、このくらいは。 下記のものを読ませてもらい分かりましたが。 分からないときは1234567を1と234と567に分ける方法が思いつきませんでした。 あれですね、あまりの道具を完璧に忘れてました。 これならできそうです。たびたびアドバイスありがとうございます。

  • 5S6
  • ベストアンサー率29% (675/2291)
回答No.5

#include <stdio.h> #include <string.h> void kanma(char *s) {   int count;   int i;   int len;   len = (int) strlen(s);   count = len % 3;   if (count == 0)     count = 3;   i = 0;   for (;;) {     putchar(s[i]);     i++;     if (i == len)       break;     count--;     if (count == 0) {       putchar(',');       count = 3;     }   } } メインは省略したけど、これがヒント。 ほとんど答えそのものだけど。 割り算もあるけどこういう方法もあります。 この場合桁制限を受けません。 int -> char変換は itoa使うとか sprintf 使うとか。 このくらい調べましょう。 割り算でもOKですよ。 プログラムわからないのは仕方ないとしても、アルゴリズムが考えられないと まずいですよ。

kiki28
質問者

お礼

まずいですか・・・才能ないんでしょうね(笑) 凡人なので大目に見てください。 atoi は知ってましたが逆もあったのですね。発見です。 この場合、アドレスはどうなっているのでしょうか? アドレスであってるのかな?先生は箱って言ってます。

  • EUR
  • ベストアンサー率61% (29/47)
回答No.4

おっとすみません、sprintfは武器に入っていませんでしたね。 でも、表示するだけならprintfでOKですね。

kiki28
質問者

お礼

あ、すみません。これ見てませんでした。

  • EUR
  • ベストアンサー率61% (29/47)
回答No.3

sprintf、商、余りを用いると出来ますよ。 int sho = (int)(a / b);//商を求める int amari = (int)(a % b);//余りを求める 1.数字を1000000で割った商をA、余りをBとする 2.Bを1000で割った商をC、余りをDとする 1234567でたとえると、 1234567を1000000で割った商は1、余りは234567 234567を1000で割った商は234、余りは567 後はsprintfを使えば簡単ですね。

kiki28
質問者

お礼

ありがとうございます。 なんかできそうな感じですが sprintf を知りません。 どういった機能を持つ関数なのですか? でも % は知ってました。これは道具に使えます。 後配列もつかえました。

  • 6dou_rinne
  • ベストアンサー率25% (1361/5264)
回答No.2

printfの仕様を見てください。

kiki28
質問者

補足

仕様とはなんでしょうか? もうちょっとヒントお願いします。ごめんなさい。

関連するQ&A

  • c言語

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c=\'m\'; while(c!=\'e\')//eでない限りwhileループを実行する { sum=sum+i; printf(\"\\n1 kara %d madewo tasuto %d desu.\\n\",i,sum); i++; printf(\"nanikakeywo oshitekudasai.owaru tokiha \'e\'\\n\"); c=getch(); } printf(\"loopwo nukemashita\\n\"); getch(); } while(c!=\'e\')をwhile(c>0)にして実行したい場合はcharをintにかえて、scanfを使わなければならないのはわかりますが、どこを変えればよいか分かりません。ちなみに、while(c>0)に変えた場合に、正の数を入力した後に、「次の数を入力してください」という文を表示してからくりかえす方法をおしえてください。

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • C言語

    はじめまして。 C言語を学習しております。 参考書の練習問題19(下記)で以下の部分がどうしても理解できません。 1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意 味がわかりません。 2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。 3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。 4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。 5、【while (1)】の部分で、count++する意味がわかりません。 6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。       if (count >= datasize) {       datasize += 10;       data = (People*)realloc(data,sizeof(People) * datasize);      } ここでつまづいて先に進めず困っております。 どうか教えていただきたく、お願い致します。 ●練習問題19 練習問題16(一番下に参考として解答を載せています)の、 「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。 ただし、データは構造体で記憶することとし、 また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」 という問題を元に、何人分でも入力できるように改造しなさい。 なお、年齢に-1が入力されれば入力終了とする。 ※配列番号がint型なのでint型の最大値まで扱えれば良い。 ●練習問題19の解答 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { int i,count,datasize; People *data; datasize = 10; data = (People*)malloc(sizeof(People) * datasize); count = 0; while (1) { InputPeople(&data[count]); if (data[count].age == -1) break; count++; if (count >= datasize) { datasize += 10; data = (People*)realloc(data,sizeof(People) * datasize); } } for (i = 0;i < count;i++) { ShowPeople(data[i]); } free(data); return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n");     /*●retutn 0は不要?*/ } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n");     /*●retutn 0は不要?*/ } ●練習問題16の解答 #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { People data[3]; int i; for (i = 0;i < 3;i++) { InputPeople(&data[i]); } for (i = 0;i < 3;i++) { ShowPeople(data[i]); } return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); }

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • C言語・値交換について

    キーボードから10個のfloat型の値を入力し、入力した順序と逆順に表示するプログラムを作成せよ。 との問題ですが解けずに悔しいです、アドバイスお願いします。 // charを使うと思いますが練習不足です><。 #include<stdio.h> int main() { int i; float a[10]; for(i=0;i<=10;i=i-1){ scanf("%f",&a[i]); printf("%f\n",a[i]); } for(i=0;i<=10;i++){ printf("Input=\n"); } return 0; }

  • C言語で、数値の桁数を求めるには??

    C言語で数値の桁数を求めるプログラムをもとめたいのですが どうすればいいのでしょうか int c; int a; c=12345; a=printf("%d",c); とするとaに桁数は入るのですが cがPRINTF関数により表示されてしまいます どうすればいいでしょうか? わかる方はおしえてください、おねがいします。

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }

  • C言語!教えてください!

    /* キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま  表示する。1ならば数字と並びを逆に表示する。  2ならばその数字と逆に並べた数字の差の絶対値を表示。その際に差が0  であるなら入力した数字をそのまま表示するプログラム。 */ #include <stdio.h> int main(void) { int no; printf("4桁の数字を入力してください:"); scanf("%d",&no); if(no % 3 ==0) printf("%d \n" , no); else if(no % 3 ==1) do{ printf("%d",no%10); no = no / 10; }while (no > 0 ); else ここから絶対値を考えようとしたのですが 逆にした値が文字で置かれていないのでやりようがありません。 逆にした値は文字で置けるものなんですか? それともこの文ではできませんか? よろしくお願いします。

  • C言語 strlen 再入力を促す

    文字列の比較で、 文字列の長さが60以上の時、再入力を促します。 while文を使って書いてみたのですが、 文字列Bの入力の前に、もう一度意味もなく 「文字列Aを入力===>」が表示されたり。 文字列Aのほうが小さいのに「Aのほうが大きい」と 表示されるようになったり、変な感じです。 どなたかご指摘・ご指導のほどよろしくお願いします。 int main(void) { char moji1[100]; char moji2[100]; while(strlen(moji1)>60){     printf("文字列Aを入力===>"); scanf("%80s" ,moji1); } while(strlen(moji2)>60){     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);    } if(compare(moji1,moji2)>0){ printf("===AはBより大きい===\n"); } else if(compare(moji1, moji2)<0){ printf("===AはBより小さい===\n"); } else if(compare(moji1, moji2)==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y && *x!=0){ x++; y++; } return (*x-*y); }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

専門家に質問してみよう