配列の問題
1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する)
2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。

この問題が解けなくて困ってます。どうか知恵をかしてください。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

naturalです。


またまたコメント読みました。
では詰まっている点からお答えしていきます。

switch文の使い方と言うことですが、基本はこうですよね。
switch(式)
{
case 値1:
処理
break;
case 値2:
処理
break;



default:
上記以外の場合の処理
break;
}

尚、各case中のbreakの意味はお解りでしょうか?
これが無いと何れかのcaseに合致した場合にそれ以降のcaseの処理を全て通ってしまうので強制的に抜けてやらなくてはならないのです。
(敢えてbreak無しを利用することもありますが今回は必要ないでしょう)

さて、恐らく悩まれているのは式と値の部分ですよね?
この問題の場合「式」には入力された文字、つまり文字を入れるために用意した変数を指定します。
次に各caseの値ですが、何度か述べている様に文字コードが数値になっていますのでそれを指定すればよいのですが、可読性を上げるために文字定数を使用しましょう。
例えば「case 'A':」と言った具合にです。
各case内での処理はよろしいですね?
それぞれに対応するカウンタ(配列で用意したもの)をインクリメントするだけです。
尚、この問題の場合defaultは不要なのですが付ける癖をつけておいた方が良いと思われますので空処理でも付けておきましょう。

さて、このswitchをどこで使用するのか、ということも悩まれている点では無いかと思いますので簡単に流れも書いておきますね。
尚、「|」の部分はネストしていることを表しています。

1.変数の定義・初期化
2.永久ループ
|2-1.一文字入力
|2-2.EOFの入力がなかったか判定
||あった場合永久ループを抜ける
|2-3.入力文字の判定(switch文を使用)
||2-3-1.'A'の場合の処理
||・
||・
||・
||2-3-26.'Z'の場合の処理
||2-3-27.default(空処理)
3.結果表示

次にif文をどこで使用するのか、ということなのですがswitchの部分を全てif文で書くことも出来ますよね?
しかしこれは煩雑で見辛いのでswitch文にしましょう、ということです。
強いて言えば永久ループを抜ける条件「EOF」を判定するときに必要になります。

さて、永久ループを抜けたら何をすれば良いでしょうか?
カウントした結果を表示するだけですよね。
この辺りは実行例とかが示されているかもしれませんのでそれに従ってください。

以上ですが、また解らない点がありましたらコメントください。
それでは、頑張ってください。(^_^)
    • good
    • 0

naturalです。


コメント読みました。
まず最初にお断りしておきます。
この回答文は長いです。(^_^)

ではポイントをいくつか見ていきましょう。

入力部分から書いていくと全部書いてしまいそうなので省略します。
まず1番からです。

>入力回数のカウントには、配列を用いるものとする。

とありますが、まずこの部分はご理解されていますでしょうか。
ここはカウンターの配列を用意するわけです。
カウントをとるわけですから整数型を扱うものであれば良いですね。
一般に数値を扱うときにint型を嫌う向きもあります(移植性の問題等で)が、練習問題のようですからここは単純にintで行きたいと思います。
例えばこうですね。

int upper_cnt[26];

何故26個の配列になるかはお解りですね。
'A'~'Z'の個数をそれぞれ記録するエリアが必要になりますのでこのようになるわけです。
勿論個数をカウントするためには各要素はゼロでクリアしておく必要があります。(ゼロクリアする方法はまずは自分で考えてみましょうね)
例えば'F'という文字が入力されたのが判ったらupper_cnt[5]をインクリメントするわけです。
配列の要素と添え字の関係はよろしいですよね。
'F'の個数をカウントする場所が5番目になる訳がわかっていればOKです。
さて問題の文字を判定する方法ですが、例えば判定すべき文字がchar型の変数mojiに入っているとします。
'F'かどうかを判定するのであればif文を用いると次の様になります。

if(moji == 0x46)
{
カウントの処理;
}

0x46は'F'の文字コードです。
でもソースとしてはとても読み辛いですよね。
そこで文字定数を使用します。

if(moji == 'F')
{
カウントの処理;
}

そう、先程から本文中で使用していた'F'(シングルクォーテーションで囲うます)は文字定数なのです。
これを用いることによりその文字の持つ値(文字コード)を引用したのと同じ状態を得ることが出来ます。

さてこのまま全ての条件をif文で書いていっても良いのですが、これまた煩雑になりますよね。
そこでswitch文を使用します。
ソースを載せてしまうともう回答になってしまいますので使い方は考えてみてください。
解らなかったら別途ご相談下さい。

そうそう余談ですが、前回構文を使わない方法と書きましたが、最低限if文が一つ必要でした。

さて、2番についてです。
何故数値ではなく数字(文字)を入力するかというと、数字以外の文字の判定が問題の中に盛り込まれていますよね。
これは文字コード(または文字定数)を用いて入力された数字を判定せよと言う意味だと思います。

では数字で構成された文字列の入力を前提に考えてみましょう。
入力されたのが16だとします。(このように複数桁の入力もあるわけですから文字列で入力を受けます)
これは'1'、'6'、'\0'という3つの文字で構成された文字列の入力があったことを意味します。
'\0'はヌル文字で、C言語の文字列はこれを付加することで完成します。
勿論この場合自分で付加するのではなく文字列入力のための関数が行ってくれます。
次に加工に移りますが、まず加工後の数値を格納する変数を用意しておきます。
で、当然ゼロで初期化しておきます。
では加工処理に移ります。
文字列の先頭から、つまり数値としては上位桁から加工していきます。
最初の文字は'1'ですが、これを数値の1に変換したいと思います。
この辺りも関数を使用すれば簡単なのですが、ここは練習問題と言うことできちんとやってみましょう。

1から0を引いたら1ですよね。
また、6から0を引いたら6ですよね。
これと同じことが文字定数でも成り立ちます。
'0'から'9'の文字コードは連続した値で割り振られているためです。
ですから最初に取り出した上位桁の文字'1'になにをすれば数値の1にできるかはもうお解りですね。
同じ処理が'0'~'9'の全てに対して有効ですので処理は共通となります。

で、取り出し終わったら変換後の値を先程用意した数値用の変数に加算します。(ここポイントです)
次に下位の桁の加工に移行しますが、その際に今の数値用変数は10倍しておきます。
何故でしょう?
次の桁を同様に加工した後に加算することを考えれば解りますよね。
この加工処理をヌル文字に当たるまで繰り返します。
尚、10倍する処理の入れる場所によって処理が大分スッキリするのですが、この辺は作りながら考えてみてください。

勿論この間に文字の判定はしなければなりません。
一つでも数字ではない文字が混ざっていればエラー処理に移ります。
この判定も難しくはないですよね。
先程述べたとおり数字のコードは連続した値です。
つまりその範囲外であれば数字ではない、ということです。
この判定も勿論文字定数を用いて行いましょう。

最後に加工の結果得られた数値を添え字として文字列の要素を表示するわけですが、その前にこの数値が配列の要素数をはみ出していないかチェックすればOKです。

1番、2番ともに再入力等の処理の指定や表示方法に指定があれば問題に従ってください。
また、1番に関してはmojiというchar型の変数を使用していますが、こちらも問題の意図によって文字列を使用したりしますので、よく読んで解いてみてください。
ご不明の点がありましたらまたコメント下さい。
それでは頑張って下さい!

この回答への補足

すいません、またいきづまってしまいました。1の問題のswitch文のところがよくわかりません。それとif文をどこで使うのかがわかりません。よろしくお願いします。

補足日時:2001/07/09 20:54
    • good
    • 0

配列を使うならAが(ゼロ)になるように計算すると楽かな

    • good
    • 0

1.力技で一つづつswitch-caseで判断してみては?


で、見つけるごとに+1していくとか。
2.これもまた、同じようにして、見つけたら表示ということですね。
    • good
    • 0

問題と言うことでヒントだけ。


まず1番についてです。
大文字'A'~'Z'は文字コード表で見れば文字コードと呼ばれる数値にすぎません。
数値ですからそのまま比較できる訳です。
素直に文字コードを記述してやっても良いですが可読性が落ちますのでここは文字定数を使いましょう。(文字定数についてはテキストで調べて下さいね)
でもif文で全ての分岐を記述していては煩雑になりますのでここは別の文(自分で考えましょう)を使います。
構文を使うよりもっとスッキリする方法があるのですがここではきっと求められていないでしょう。
次にEOFが入力されたかどうかですがこれは使用する入力関数の仕様を見てみましょう。
返却値等で確認できるはずです。
配列の扱いについて解らなかったら別途コメント下さい。
次に2番の数字の入力ですが、ここでポイントになるのは入力されているのは実は文字(複数桁もあるので文字列)だと言うことです。
文字の1と数値の1は別物です。
文字コード表に載っている1と言う文字の値が文字の1の持つ値です。
数値の1は値1でそのままですね。
つまり入力されたままの状態の1を見てその数字番目の配列要素を見ても1番目の文字は出てこないのです。
だから文字の1を数値の1に、文字の2を数値の2に変換する仕組みが必要になります。
これらの処理は関数でも出来ますが恐らく問題の意図として使用不可なのではないでしょうか。
この処理のヒントは、数値の1から数値の0を引いたら値は1ですよね。
では文字の1から同様の結果を出すには?
あとは取り出した値がどの桁に収まるべきか処理するだけです。
(例えば12は1と2の文字で出来てるけれど10と2にならなければいけませんよね)
ちょっと書きすぎたかも知れませんのでこの辺にしておきます。

この回答への補足

考えてみましたがどーしてもプログラムが書けません。
少しでいいんで教えてください。

補足日時:2001/07/08 20:28
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語のソースコードの書き方

C言語のソースコードの書き方に関する質問です。
0を5個と1を4個の、合わせて9個の数字を並べて出来上がる数列のパターン(126通り)を全て羅列させるプログラムを作りたいと考えていますが、そのためにどういった方針を立ててソースコードを書けばよいかが分かりません。
どういった構造かだけでも構いませんので、教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
return;
}
if (m == 0) {
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
return;
}

pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
}

int
main(void)
{
int m = 5, n = 4;
char pattern[m + n];
iter(pattern, 0, m, n);
return 0;
}

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1,...続きを読む

Qコマンドラインに入力されている文字列の1文字を出力

○下記のコードについての質問になります

#include <stdio.h>

int main(
intargc,/*コマンドライン引数*/
char*argv[]/*コマンドライン*/
)
{
int counter;/*ループカウンタ*/

for( counter = 0 ; counter < argc ; counter++)
{
printf( "argv[%d]:%s\n" , counter , argv[counter] );
}
/*-----------------------------------------------------------
printf( "コマンドラインの1文字を抜き取る:%c" , ????????);
------------------------------------------------------------*/

return (0);
}

○質問
コマンドラインのプログラムになります。
「--」で囲っている部分になりますが、
コマンドラインに入力されている文字列の1文字だけを出力できるように
したいのですが、どうすればこれを実現することができるのでしょうか??
一例として

>command.exe orange ringe
^^^^^^

と、コマンドを打ったときに、「^^」の部分になりますが、
orangeの「a」だけを出力させたい場合を、知りたいと思っております。

以上、宜しくお願いします。

○下記のコードについての質問になります

#include <stdio.h>

int main(
intargc,/*コマンドライン引数*/
char*argv[]/*コマンドライン*/
)
{
int counter;/*ループカウンタ*/

for( counter = 0 ; counter < argc ; counter++)
{
printf( "argv[%d]:%s\n" , counter , argv[counter] );
}
/*-----------------------------------------------------------
printf( "コマンドラインの1文字を抜き取る:%c" , ????????);
------------------------------------------------------------*/

retu...続きを読む

Aベストアンサー

★コマンドラインの引数と文字列について
・『command.exe orange ringe』という2つの引数が与えられたとき
 (1)argv[0]…"command.exe"
 (2)argv[1]…"orange"
 (3)argv[2]…"ringe"
 (4)argv[3]…NULL
 となります。なお、argv[0]は処理系によっては、起動パス名などが空になる場合があります。注意!
・1つの引数から1文字の取得(argv[1] が "orange" の場合)
 (1)argv[1][0]…'o'
 (2)argv[1][1]…'r'
 (3)argv[1][2]…'a'
 (4)argv[1][3]…'n'
 (5)argv[1][4]…'g'
 (6)argv[1][5]…'e'
 (7)argv[1][6]…'\0'
 となります。これは main() 関数の定義で『char *argv[]』となっているため、ポインタへの配列は
 2次配列と同じような要領でアクセス(取得・設定)が可能です。

本題:
・上記のことから『orange』の『a』は argv[1][2] で取り出せます。→『*(argv[1] + 2)』でも可能。
 for 文と添え字のカウンタ変数を2つ使えば1文字ずつの出力が出来ます。
 『argv[counter][i]』という感じになります。
・以上。おわり。→上記のを参考に for 文の部分は KGM さんが記述して下さい。

★コマンドラインの引数と文字列について
・『command.exe orange ringe』という2つの引数が与えられたとき
 (1)argv[0]…"command.exe"
 (2)argv[1]…"orange"
 (3)argv[2]…"ringe"
 (4)argv[3]…NULL
 となります。なお、argv[0]は処理系によっては、起動パス名などが空になる場合があります。注意!
・1つの引数から1文字の取得(argv[1] が "orange" の場合)
 (1)argv[1][0]…'o'
 (2)argv[1][1]…'r'
 (3)argv[1][2]…'a'
 (4)argv[1][3]…'n'
 (5)argv[1][4]…'g'
 (6)argv[1][5]…'e'
 (...続きを読む

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

以下のソースコードを学習用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言語開発環境で行ったのですが、
『ファイル「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("...続きを読む

Aベストアンサー

>>おかげで、エラー表記されずに、プログラムが実行されました。

これはコンパイルがうまく完了したってことでしょうか?できあがったプログラムが実行できたってことではないですよね?そうなら

>>’タイトル’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

なんて問題は起きないはすですからね。

できあがったファイルは、XXXX.EXEのように拡張子のEXEがついていますか?もしXXXX.OBJであれば、リンクができていませんから、実行できません。

学習用C言語開発環境の使い方を確認してみてください。

P.S.
昔は、コンパイラを使うのは大変でしたが、今は楽ですね。CではなくPascal系コンパイラーですが、カセットテープに入っていて、コンパイラの読込にテープレコーダで15分かかったりとか、まあ大変だけど面白い時代でした。

Q標準入力から文字列配列に格納

をしたいのです。
例えばchar string[100];
にscanf("%s",string);
としたのですが、%sではスペースまでしか
読み込まないみたいです。
どうしたらよいでしょうか?
お願いします。
c=getchar()も試そうとしましたが、よくわかりません。
標準入力を確定するにはcontrol+Dでしょうか?
お願いします。

Aベストアンサー

#1の人の様にfgetsを使いましょう。getsも使えますが、バッファのサイズに限りがあるので、fgetsを使った方が安全です。
なお、
getsは、¥n(改行コード)を捨てますが、
fgetsは、¥nを捨てません。

gets 及び fgets は、改行コード(エンター)で確定します。(エンターを押す前は、バックスペースとかできます)
標準入力からの入力の終了には、
windowsだったらCTRL+Zです。
たしか、UNIX系だったらCTRL+D
だったと思います。
その場合getsなどはNULLを返してきます。
エラーの場合もNULLになるので、ファイルの終わりを調べるには
feof()を使います。
また、
例えば、
<END>など、特殊な文字列を終了記号として用いるのも1つの方法かと思います。

QC言語ソースコードに関する質問です。

以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。
0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。)

ソースコードを書くと、エラーがでた。
#include <stdio.h>
int fib(int n)
{
if(n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(void)
{
int n;
for(n=0;n<17;n++)
printf("%d,",fib(n));
}

正しソースコードを教えてください!

よろしくお願いします。

Aベストアンサー

#include <stdio.h>

void fib(int i, int j, int n)
{
if (n == 1)
{
printf("%d\n", i);
}
else
{
printf("%d\n", i);
return fib(j, i + j, n - 1);
}
}

int main(void)
{
fib(0, 1, 15);

return 0;
}

Q文字列配列をサブルーチンにアドレス渡ししてscanf入力

main関数内で
char strarray[3][21]
という文字列配列を宣言し、
サブルーチンvoid input(・・・)内でscanfを使って
strarray[0]~strarray[2]の各行に入力を行うとします。
ここでポインタを引数としてstrarrayをmainとinputで共有する場合、
strarrayに関して以下の項目はどう記述すればよいのでしょうか?

1)inputを宣言する際の仮引数の書式
2)main内でinputを呼び出す際の引数の書式
3)input内でscanfする際の引数の書式

いろいろ組み合わせを試してはみたのですが、
どうにもSegmentationFaultを回避できません。
いい加減混乱してきたので、そろそろすっきりと整理したいと思っています。
よろしくお願いします。

…まあ「構造体使えばいいじゃないか」と言われてしまえばそれまでなのですが…

Aベストアンサー

まず、配列とポインタの関係から説明します。

C 言語の場合、配列はコンパイラによって、その「先頭要素を指すポインタ」に読み替えられます。

つまり、int hoge[10]; と定義した配列に対して、式の中で hoge と書くと、これは int*型の変数として扱われて、それは &hoge[0] と同じ意味になります。
# 一部例外はあります。
# たとえば、sizeof(hoge) とした場合、ポインタサイズではなくて、配列のサイズが
# 取得できます。

で、これをそのまま配列の配列に適用してみれば良いわけです。

どうなるかというと、char piyo[3][10]; と定義した変数に対して、式の中で piyo と書けば char(*)[10]型の変数として扱われて、それは &piyo[0] と同じ意味になります。

char(*)[10] 型と書きましたが、これは「char型配列(要素数10)を指すポインタ型」のことです。
配列を指すポインタ型の変数を定義する場合には、次のように書きます。
char (*p_piyo)[10];

つまり、piyo はもともと「char型配列(要素数10)の配列(要素数5)」だったわけですよね。
これが、コンパイラによって「char型配列(要素数10)を指すポインタ」として扱われるようになるわけです。

注意点としては、この配列→ポインタの読替え規則は再帰的には行われないことですね。
どういうことかというと、配列の配列は、ポインタのポインタにはならず、配列のポインタにしかならない、ということです。

さて、前置きが長くなりましたが、話を etendard さんのご質問に戻します。

1) これまでの話で、char strarray[3][21] に対してコンパイラが読み替える等価な型が char (*str_ptr)[21] となることはおわかりいただけると思います。

関数の引数に配列を渡す場合は、必ずポインタに読みかえられますので、仮引数の宣言もポインタに読み替えられた方の型で書くことになります。
# というよりも、配列を渡すことができないので、配列の先頭要素を指すポインタを
# 渡している、という言い方のほうが正しいのですけどね。

つまり、プロトタイプは

void input( char (*str_ptr)[21] );

のようになります。
できれば、配列の要素数も一緒に渡せるようにするのが良いでしょう。

その場合は、こんな感じです。

void input( char (*str_ptr)[21], int num );

2) 関数コールする場合は次のようにします。

input( strarray );

要素数付きの場合は、次のようにします。

input( strarray, 3 );

要素数付きにしたほうが良い理由は、ポインタに読み替えられた方の配列の要素数が、関数に渡らないためです。

標準関数では、gets() なんかはその典型ですよね。
# バッファオーバーランの原因となるということで、WARNING を吐くコンパイラも
# あるとか。。。

それに対して fgets() は文字列の数も渡せるので、より安全だといえます。
要するに、それと同じことです。

3) input() の中で scanf() する場合には、次のようにすれば良いです。

for ( i=0; i<3; i++ )
{
scanf( "%s", str_ptr[i] );
}

# なぜこれで良いのかは、よく考えてみてください。

同様に、要素数付きの場合には次のようにします。

for ( i=0; i<num; i++ )
{
scanf( "%s", str_ptr[i] );
}

ちなみに、関数の仮引数の場合に限り、ポインタ宣言と配列宣言は同じ物になります。
# というよりも、いずれもポインタ宣言になります、といった方が正しいです。

つまり、以下の表記はいずれも同じ物になります。

void input( char (*array_ptr)[21] );
void input( char array_ptr[][21] );
void input( char array_ptr[3][21] );

ただし、3番目の表記をした場合であっても、[3] の部分の要素数は無視されます。
# コンパイラが勝手にポインタに読み替えてしまいますからね。

宣言や定義について、このような読替えが起こるのは関数の仮引数宣言の場合だけです。
通常の、宣言や定義ではこのような読替えは起こりませんのでご注意ください。

かなり長くなってしまいましたが、こんな感じでいかがでしょうか。

まず、配列とポインタの関係から説明します。

C 言語の場合、配列はコンパイラによって、その「先頭要素を指すポインタ」に読み替えられます。

つまり、int hoge[10]; と定義した配列に対して、式の中で hoge と書くと、これは int*型の変数として扱われて、それは &hoge[0] と同じ意味になります。
# 一部例外はあります。
# たとえば、sizeof(hoge) とした場合、ポインタサイズではなくて、配列のサイズが
# 取得できます。

で、これをそのまま配列の配列に適用してみれば良いわけです。

どうな...続きを読む

Qc言語のソースコードを教えて下さい

キーボードから10個の正整数値を読み込み,合計値を表示するプログラムを作りなさい。
ただし,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数sumのみを用いることとする。

このプログラムのソースコードを教えて下さい。
解説もよろしくお願いします。

Aベストアンサー

一例です。
添付のURLを参照して下さい。
因みに、平均値も算出しているが気にせずに、後はご自身で変数、コードを要調整して下さい。

参考URL:http://www.geocities.jp/kenji_y0328/crenshu/renshu/r021.gif

QC++でscanfで入力した数字が配列で使う

C++に関しての質問です。
scanfで1番目に入力した数字が0とします。
scanfで2番目に入力した数字が3とします。
すると以下の配列のpoint[0][3]の変数をprintfで出力したいのですが、どうすればいいでしょうか?

+----- 配列 -----+
point[0][0] = 27;
point[0][1] = 58;
point[0][2] = 26;
point[0][3] = 57;

Aベストアンサー

scanf("%d",&inp1);
scanf("%d",&inp2);
printf("point[%d][%d]=%d",inp1,inp2,point[inp1][inp2]);

Qソースコードの間違い (C言語)

変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。

#include <stdio.h>

void main() {
char moji[100]={0};
int c=0;

fgets(moji,sizeof moji,stdin);

while( moji[c] != '\0' ) ++c;

printf("\n%d\n",c); //
}

例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

Aベストアンサー

>なぜこういうことがおきるのでしょうか
そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。

Q数字を入力して配列に格納するプログラムを書きたいです。

各行任意個の数字をスペースで区切って入力し、格納する数字は10個までとします。また、/の入力以降は数字を格納せず、プログラムを終了するようにしたいです。
PrintNumは配列に格納された数字を順番に印字する関数として、次のプログラムを書くと、数字を入力するとき、2行目を入力しようとするとエラーになってしまいます。

char line[50];
char *ptr;
int count=0;
int numbers[50];

while(*ptr!='/'){

fgets(line,50,stdin);
ptr = strtok(line," ");
if(ptr!=NULL && *ptr!='/')
numbers[count++]=atoi(ptr);
if(count>=10){
PrintNum(numbers,count);
return 0;
}
while(ptr!=NULL && *ptr!='/'){
ptr=strtok(NULL," ");
if(ptr!=NULL && *ptr!='/')
numbers[count++]=atoi(ptr);
if(count>=10){
PrintNum(numbers,count);
return 0;
}
}

}

PrintNum(numbers,count);
return 0;

最初のwhile文でたとえば while(1) とすると2行目以降も入力できることがわかったのですが、上のプログラムは何がまずいのかわかりません。教えていただけると幸いです。

各行任意個の数字をスペースで区切って入力し、格納する数字は10個までとします。また、/の入力以降は数字を格納せず、プログラムを終了するようにしたいです。
PrintNumは配列に格納された数字を順番に印字する関数として、次のプログラムを書くと、数字を入力するとき、2行目を入力しようとするとエラーになってしまいます。

char line[50];
char *ptr;
int count=0;
int numbers[50];

while(*ptr!='/'){

fgets(line,50,stdin);
ptr = strtok(line," ");
if(ptr!=NULL ...続きを読む

Aベストアンサー

以下のようなことをしたいのだと思いますが、
%test
%10 15 20[ENT]
%30 /[ENT]
10
15
20
30
%
(%はプロンプトだと思ってください)

1行目の処理を終了した後、ptrはNULLになっています。
そのため
>while(*ptr!='/'){
ここの判定でアドレス0を参照してSegment Faultになるのでしょう。


人気Q&Aランキング

おすすめ情報