• 締切済み

配列の練習問題

#include<iostream> using namespace std; //count関数の宣言 int count(char str[], char ch); int main() { char str[100]; char ch; cout << "文字列を入力して下さい。\n"; cin >> str; cout << "文字列から探す文字を入力して下さい。\n"; cin >> ch; int c = count(str, ch); cout << str << "の中に" << ch << "は" << c << "個あります。\n"; return 0; } //count関数の定義 int count(char str[], char ch) { int i = 0; int c = 0; while (str[i]) { if (str[i] == ch) c++; i++; } return c; } こんにちは。 この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 確認がてらに質問します。 よろしくお願いします。

みんなの回答

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.3

>基本的に私はプログラムを丸暗記ではなく意味を理解して覚えています。 それは良いことです。 しかし、設問に対する回答のプログラムと言うニュアンスですが設問が提示されていないのでプログラムが設問に対して納得ができる動作になっているか否かの評価ができません。 あなたが納得できない内容も述べられていませんので解説できないのが現状です。 ソースコードから読み取れる動作は長い文字列を入力した後に検索する文字を入力すると長い文字列の中に検索する文字が何個有るかを調べて結果を表示するもののようです。 例えば 最初に「ABCDEFGEH」と入力して、検索する文字に「E」を入力すると 「ABCDEFGEHの中にEは2個有ります。」 ということです。 何処が納得できませんか?

situmonyou4989
質問者

お礼

回答ありがとうございます。 あくまで全体のプログラムの意味ではなく個々のプログラムとしての意味を 質問したのですが、それもNo.1のcametanさんがやってくれたので 問題の個々のプログラムの動作の意味の確認はできたと思います。 bunjiiさんの言っていたことは、理解できますが、これ以上この質問に関しては質問することがないのでそろそろ締め切ります。 お手数かけてすみませんでした、ありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 「この問題」が提示されていませんが補足できますか? 「回答のプログラム」とは提示のソースコードのことですか? C++のソースのようですね。 コンパイルしてバイナリファイルを実行したときどのような結果になるか説明されていなかったのですか? イマイチ分からない箇所を提示して頂ければあなたの知りたいことが分かりますので解説できると思います。 説明できないときはソースコードが載っているサイト(URL)を提示してください。

situmonyou4989
質問者

お礼

「解答のプログラム」とは提示のソースコードのことですか? そうです、このソースコードの事です、ややこしくしてしまいすみません。 基本的に私はプログラムを丸暗記ではなく意味を理解して覚えています。 でもある程度は覚えて、後は数学のようにこれはこうだからと公式のように割り切るしかないんでしょうかねー・・・。

回答No.1

//count関数の定義 //文字列strの中に文字chが何個あるのか調べるプログラム // count関数は引数に文字列strと文字chの二つを取る int count(char str[], char ch) {   int i = 0; // 文字列(配列str)の添字の初期値(i = 0番目)   int c = 0; // 与えられた文字chの個数c(初期値は当然0)   while (str[i]) { // 文字列(配列str)の中身を一個一個ループしながら調べていく     if (str[i] == ch) // 文字列(配列str)の中身のi番目が文字chだったら       c++; // 個数cを1増やす     i++; // 文字列(配列str)の次の中身へ移る   }   return c; // 文字列が無くなったら文字chの個数cを返す }

situmonyou4989
質問者

お礼

回答ありがとうございます、 参考にさせて頂きます。

関連するQ&A

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }

  • プログラムの動作

    10文字をスキップするプログラムなのですが、どのようにスキップしているのかわからないので教えてください。 下にソースコードを書きます。 #include <iostream> using namespace std; //10文字をスキップする istream &skipchar(istream &stream) { int i; char c; for(i=0; i<10; i++)stream >> c; return stream; } int main() { char str[80]; cout << "いくつかの文字を入力する:"; cin >> skipchar >> str; cout << str << endl; return 0; } よろしくおねがいします。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • 教えてください

    入力した文字列のスペースをすべて取り除く関数を返すのですが、分かりません。(例)a s d fと入力したら、asdfと表示します。途中まで考えたのですが、どうしてもできません。教えてください。宜しくお願いします。(このソースは、コンパイルエラーです。) 14: 移植性のないポインタ変換(関数a) #include <stdio.h> char a(char *st) { char *ptr=st; while(*st!='\0') { if (*st != ' ') { *ptr++=*st; } } *ptr='\0'; return(ptr); } int main(void) { char str[21]={'\0'}; int i=0; char ch; printf("文字列を入力してください:"); while(i<21) { ch=getchar(); if (ch=='\n') {break; } else if (ch != '\0' && ch != '\n') { str[i] =ch; i++; } } str[i] = '\0'; printf("%s",a(str)); return(0); }

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • 2次元配列

    課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。 改行のみの入力の場合、エラーメッセージを表示し、再入力させる。 初心者の私には、データの表示と、条件の処理の仕方がわかりません。 下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。 お願いします。 #include <stdio.h> #include <string.h> #define BUFFERSIZE 1024 main() { char str[10][BUFFERSIZE]; char c; int count = 0; int i; int j; int l[10]; /*氏名の入力*/ for (i = 0; i < 10; i++) { printf("氏名人力 : "); while ( (c = getchar()) != '\n' ) { if( count < BUFFERSIZE - 1 ){ str[i][count++] = c; } } str[i][count] = '\0'; printf("累計 : %d \n", i+1); } for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c",str[i][j]); } putchar('\n'); } return 0; }

  • プログラミング 関数

    教えてください。 入力された文字列のうち、文字aの数を数える関数count_aを作成する。 以下は関数count_aを利用したmainのプログラムの例です。 #include <stdio.h> int count_a(char str[]); int main ( void ) { char str[255]="abcaeag"; printf("%d\n",count_a(str)); return 0; }

  • 配列を返す

    ファイルから読み込んだ一行の文字列を読み込みカンマごとに区切って 返すというプログラムを関数化することで効率を図りたいと思います。 int main() { char buf[1000]; char *str; char *bufG; //ファイルを読み込む  while(fgets(buf,1000,fp) != NULL){//一行ずつ読む str = buf;//先頭アドレスを指す     bufG = //文字列を返す関数  ・  ・  ・ } } //文字列を返す関数 {    for(i = 0; *str != ',' && *str != '\0'; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前の質問で自動変数でこの関数を抜けたら廃棄になるというのは わかったんですが(そういう警告がでました) ここからどのようにすれば求めるプログラムになりますか? 引数とかちょとわからないので関数定義を書きませんでした。 (1)ファイルをよみこむ (2)一行ずつ読み込み文字列をbufにいれる (3)ポインタstrをbufの先頭アドレスにする (4)get_word関数にてポインタをずらしていき カンマがあればそこまでの文字列を返す (5)main関数に戻り変数に代入する (6)終端文字があるまで(4)ー(5)を繰り返す。 (7)さらに行数分繰り返す これらの一連の流れをやりたいのですが わかりません。

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

専門家に質問してみよう