• 締切済み

初心者です。C++の課題

C++の課題が出たのですが、行き詰まりました。 cinで入力した英数字、記号から、文字の系列に変換するプログラムで、 例えば、abbcdeee00))) と入力した場合、 a b c d e 0 ) と出力されるようにしたいのです。 条件は、 入力した文字系列はchar型の変数に1文字ずつ入力されること、 使えるのは、for、while、if のみ、 入力はEOFで終わること、 以上です。どなたか教えてください。

みんなの回答

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.4

>No.3 >ただし while の条件はもっと単純に >cin >> c >だと思う. >入力はEOFで終わること、 問題をよく読んでください。 そして、EOFは0と決まっていない。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

例えば ababababa なんてときにはそのまま ababababa とすればいい, ってことね? なら基本的には #2 の構造になります. ただし while の条件はもっと単純に cin >> c だと思う.

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.2

char c, d = EOF; while ((cin >> c) != EOF) { if (d != c) { cout << " " << c; d = c; } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

しつも~ん. 「abbcdeee00)))」から「a b c d e 0 )」になるということですが, このような具体例を 1つ出されただけでは規則がわかりませ~ん. 一般的な規則で示してくださ~い. まあ, 「行き詰まった」というなら「どこまでできているのか」「どこでどのようなところが行き詰まったのか」を書いてくれてもいいと思うんだけど.

tt_somnus
質問者

補足

一般的な規則ですが、 入力した文字列のうち連続している文字( 例でいうb,e,0,) )は1文字として出力する、ということです。 それと、語弊がありましたが、元の課題はもう少し長く、質問の部分が行き詰ったということです。

関連するQ&A

  • C++でランレングス符号化のプログラムを組みたいです。

    C++で、while,if文,char,intでランレングス符号化のプログラムを組みたいです。 たとえば、文字列aabcccと入力するとa2,b1,c3となるようにしたいです。 配列は使わずに、charで変数を二つ用意し、cinで入力、if文で判定しカウントという流れをwhileで繰り返す。そしてEOFで終了というような感じにしたいと思ってます。 よろしくお願いします。

  • getlineについて

    現在getlineを用いてプログラムを作成しようとしているのですが、例えば #include <iostream> using std::cin; using std::cout; using std::endl; int main(){ char buffer[81]; while(!cin.eof()){ cin.getline(buffer,sizeof(buffer)); cout << buffer << endl; while((!cin.eof())&&cin.fail()){ cin.clear(); cin.ignore(80,'\n'); } } return 0; } というプログラムを作った場合、標準入力から各行を80文字だけ読み込み出力をするわけなんですが、 この80文字という文字制限をなくしたい場合どういった工夫をすればいいのでしょうか?

  • C言語の課題で困っています;

    C言語の課題で困ってます; 学校の課題で、キーボードから文字を入力する(最大80文字)。入力された文字列と、入力した文字列を逆順にした文字列を表示する。(malloc,freeを使って作成して下さい) ヒントで #invlude <stdio.h> void main(void){ char *buf; //入力文字列用 char *seq; //入力文字列用コピー用 char *rev; //逆順文字列用 int lec, i; buf =(char*)malloc(81); printf("文字列を入力:"); scanf("%s"buf ); for(i = 0; buf[i] ??? '\0'; i++){ } Ien = i; /* lenに文字列の長さが入る */ seq = ???(??? + 1); /* len+1文字文確保*/ for(i = 0; ???; i++){ seq[0] = buf[0]; } free(buf); rey = ???(len + 1); for(i = 0; < len; i++){ rev[len - i - 1] = seq[i]; } ren[i] ~ '\0'; printd("入力文字列 : %s\n",sep); でたんですが、全然分からなくて足りない部分の答えを教えてもらえると助かります;

  • C言語の関数の戻り値がおかしい?

    #include<stdio.h> #include<ctype.h> #include<stdlib.h> int get_word(char *buf,int buf_size,FILE *fp) { int len; int ch; while((ch = getc(fp)) != EOF && !isalnum(ch));/*→「英数字のとき」このループは飛ばす。*/ if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/ return EOF; } len = 0; do{ buf[len] = ch; len++; if(len >= buf_size){ fprintf(stderr,"word too long.\n"); exit(1); } }while((ch = getc(fp)) != EOF && isalnum(ch)); buf[len] = '\0'; return len; } int main(void) { char buf[256]; while(get_word(buf,256,stdin) != EOF){ printf("<<%s>>\n",buf); } return 0; } C言語ポインタ完全制覇という本のP67に載っていたプログラムをそのまま載せています。 get_word関数の中のif文で、EOFを返した時もループwhile(get_word(buf,256,stdin)により再入力するようなプログラムになっています。でも、「!=EOF」と記述されているのだから、EOFが返ったら終了だと思うのですが… なぜ再入力し続けるプログラム(無限ループ)になってしまっているのでしょうか? というか、私の環境で動作させたらおかしいだけじゃないでしょうか? よろしくお願いします。

  • C言語の問題があと少しでわからないのですが

    学校の課題に取り組んで分からないことろが出てきました。問題は以下のものです。 問題13 任意の文字列を(str)を入力して、削除文字を入力させ、strから削除文字を削除して表示しなさい。 出力例:str = abcd 削除文字:c →結果:abd というものです。 途中まで自分で考え ------------------------------------------------------------------------------------------------------------------- #include <stdio.h> void rmv(char *str, char c); int main(void) { char str[80]; int c; printf("文字列入力 : "); fgets(str, 80, stdin); printf("削除文字入力 : "); c = getchar(); void rmv(str, (char)c); printf("削除後文字列 : %s", str); return 0; } void rmv(char *str, char c) { while(*str) { if(*str == c) { while(*str) { *str = *(str + 1); ++str; } } ++str; } *str = '\0'; } --------------------------------------------------------------------------------------------------------- としましたが削除文字判定と文字つめのループ用に同じポインタを使っているので文字が一文字しか消えないと言われました。 解決方法にrmv関数内で別のポインタを用意し、if文内でコピー(例 p =str;)し次のwhile文内でこのポインタを用いて判定するというヒントを貰いましたが。自分で組んでいて上手く動きません。 どのように処理をしていけばいいでしょうか。 超初心者なので説明も付けていただくと有難いです。

  • C言語の課題なのですが、助けてください

    C言語のプログラミングの課題で、「以下のプログラムをキーワードを引数として入力できるように変更する(argvを利用する)」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }

  • C++で二分法のプログラム

    C++で二分法のプログラムを作るんですが x1-x2が十分小さくなれば(10^-5)終了する 例 cos(x/2)の解を出す これどうやればいいんですか?whileを使うらしいですが。 文法というのは、 if系、while、switch、continue、for、break文くらいしかやってないんですが #include <iostream> #include <cmath> using namespace std; int main() { までは行きますが… 出力はcout 入力はcinでお願いできないでしょうか

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • [C++]ファイル出力について

    教えてください。 コマンドプロンプトから何行か書いた文章をファイルにしたいのですが、 うまくいきません。 作ったものの結果は1行1文字で出力されて、eofでうまく 終わってくれません。 コマンドプロンプトで入力(改行)された通りにファイルに出力 できるようにしたいので、どこがおかしいのか指摘お願いします。 #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <string> using namespace std; int main(int argc, char *argv[]) { char str[100]; int i; i = 0; if (argc <= 1) { cerr << "Need filename" << endl; exit (1); } ifstream ifs(argv[1], ios::in); if (ifs) { cerr << "Caution" << argv[1] << " already exists " << endl; cerr << " Specify a different filename " << endl; exit (2); } ofstream ofs(argv[1], ios::out); if (!ofs) { cerr << " Unable to write to " << argv[1] << endl; exit (3); } while(str[i] !=EOF) { cin >> str[i]; ofs << str[i] << endl; i++; } return 0; }

  • この課題を解いてください

    大学で C言語の入門の授業を取っています。 受講生はC言語をやるのは初めてのようです。 私は何年か前からやっていたので楽勝の授業なんですが、 3週目にして、以下の課題を与えられました。 キーボードから数値を入力して、それが正なら「plus」を、負なら「minus」 を、ゼロなら「zero」を表示するプログラムを作成せよ。ただしピリオド「.」が入力されたら終了とする。 で、私は、 #include<stdio.h> #include <stdlib.h> int main(void){ char s[1]; int a; while (1){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%s",&s[0]); a=atoi(s); if(s[0]=='.')break; if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } のように作りました。 私は授業ではまだ習っていない配列や、atoiという関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?

専門家に質問してみよう