• 締切済み

計算機言語(C言語)の課題です。

ポインタstrが文字列の先頭文字を指している時、その文字列に含まれる英小文字を英大文字に変換する関数 void str_toupper(char *str) を作成しなさい。ただし、英小文字a~zおよび英大文字A~Zには、それぞれ昇順に、連続した1バイトの整数が割り当てられているものとする。例えば、aには10進数の97、zには10進数の122が割り当てられ、Aには10進数の65、Zには10進数の90が割り当てられるといった具合である。

みんなの回答

回答No.6

まず、丸投げは禁止です。自分なりに努力した姿勢を示すことが大事です。 まあ、2ページめに回され、忘れ去られる運命にあるようですから、もう回答しても良いでしょう。 課題は、英子文字を英大文字に変換しなさい。ただし、文字の比較は10進数を使うこと。 すなわち、「習ったアスキーコード表の10進数を使い、英字を大文字に変換せよ」ということです。 http://e-words.jp/p/r-ascii.html 回答プログラムがチョー簡単なところから察するに、きちんと講義は受けるべきです!! 一時的な回答はえられても、自分の得にはなりません。 #include <stdio.h> void str_toupper(char *str); int main(void) { char buff[]="Until Saturday, Burmese democracy campaigner Aung San Suu Kyi was arguably the world's most famous prisoner."; printf("buff[]:¥n%s¥n", buff); str_toupper(buff); printf("result:¥n%s¥n", buff); return 0; } void str_toupper(char *str) { int c; while(c=*str) { if(c>=97 && c<=122){ *str=c-32; //32=97-65 } str++; } } ----- 実行結果 ----- buff[]: Until Saturday, Burmese democracy campaigner Aung San Suu Kyi was arguably the world's most famous prisoner. result: UNTIL SATURDAY, BURMESE DEMOCRACY CAMPAIGNER AUNG SAN SUU KYI WAS ARGUABLY THE WORLD'S MOST FAMOUS PRISONER. http://www.bbc.co.uk/news/world-asia-pacific-11761133

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

string を std 名前空間で使うなら transform もそうした方がいいのではないかと& toupper を使うためには cctype を #include せにゃまずいのではないか>#4.

  • zuntac
  • ベストアンサー率36% (45/124)
回答No.4

#include <string> #include <algorithm> #include <iostream> void str_toupper(std::string& str) { transform(str.begin(), str.end(), str.begin(), toupper); } 面倒だから引数はstringにしちゃいましたが、ちゃんと説明できれば許してもらえるのでは。

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

個人的には, そこは許していいと思う>#2. 「言葉のあや」ってものもあるし. それよりも, 「ただし、英小文字a~zおよび英大文字A~Zには、それぞれ昇順に、連続した1バイトの整数が割り当てられているものとする。」の方が許しがたい. こんな条件は「腐ったプログラム」 (あるいは「腐ったプログラムを書くやつ」) を拡大再生産するだけでまったく意味がないのに.... まともなプログラマなら, この条件はあってもなくても同じプログラムを書く.

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

ここは課題を出されたら回答するところかな。 ま、いいけどね。 >ポインタstrが文字列の先頭文字を指している時 ポインタは必ず文字列の先頭を指してるけど? ポインタの指しているところが文字列の中間かどうかわからんよね。 問題がおかしいよ。 あなたは日本語と課題を理解できてる?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

課題は自分でやりましょう C言語では文字を' 'で囲むとその文字の値になります 問題の例では'a'は97に'A'は65になります 文字の値が'a'以上'z'以下であれば小文字ということです 次にa-z A-Zがそれぞれ連続しているということは大文字と小文字の差はすべて同じということになります 問題に書かれた例ではaとAの差は32、zとZの差も32になります プログラムで差を求めるには'a' - 'A' とか 'z' - 'Z'を使えば文字コードが何であっても大丈夫です 後はがんばって

関連するQ&A

  • 計算機言語(C言語)の課題です。

    ポインタstrが文字列の先頭文字を指しているとき、その文字列に含まれる数字、符号’+’及び’-’以外の文字を削除する関数 void del_char(char *str) を作成しなさい。例えば、A-+1BC2+3D\0であれば-123\0とする。なお、符号についても、数字より前にある最初のもの以外は、削除するものとする。

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する #include <ctype.h> #include <stdio.h> void name_toupper(char str[]) { unsigned i = 0; while (str[i]) { str[i] = toupper(str[i]); i++; } } void name_tolower(char str[]) { unsigned i = 0; while (str[i]) { str[i] = tolower(str[i]); i++; } } int main(void) { char str[100]; printf("文字"); scanf("%s", str); name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); return 0; } 自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 あと(3)ができないし、ただしを満たしているのかもあいまいです。 文字列の入力の形式:char *gets(char *buffer)を用いればどうにかなるのではと思っていますがどうですか? 説明が長くなって申し訳ありませんが教えてください。 よろしくお願いします。

  • C言語ののポインタについて

    「明解C言語 入門編」p262の演習11-4についての質問です。 このサイトも参考にしてみて、 入力された文字の大文字小文字を反転するプログラムをvimで書いてみたのですが #include <stdio.h> #include <ctype.h> void str_toupper(char *str) { while (*str = toupper(*str)) { *str++; } } void str_tolower(char *str) { while(*str = tolower(*str)) { *str++; } } int main(void) { char str[100]; printf("文字列を入力してください:"); scanf("%s", str); str_toupper(str); printf("大文字:%s\n", str); str_tolower(str); printf("小文字:%s\n", str); return(0); } clangを用いてコンパイルすると4warnings generatedと出ます。 ------------------------------------------------------------ ex11-4.c:6:13: note: use '==' to turn this assignment into an equality comparison while(*str = toupper(*str)){ ^ ------------------------------------------------------------- こんなのや ---------------------------------------- ex11-4.c:7:3: warning: expression result unused [-Wunused-value] *str++; ^~~~~~ ---------------------------------------------------- といった警告が表示されます。 どこをどう訂正すれば良いのでしょうか。 よろしくお願いします。

  • C言語について教えてください。

    #include <string.h> #include <stdio.h> void print_all_char(char *str) { while(*str! = '\0') { printf("%c\n", *str); str++; } } int main(void) { char astr[5]; char *pstr; strcpy(astr, "ABCD"); pstr = "EFGHI"; puts("「配列で実現する文字列」を表示する"); puts(astr); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(astr); puts("「ポインタで実現する文字列」を表示する"); puts(pstr); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(pstr); return 0; } 自分でつくった上のプログラムではエラーが発生します。 なぜだか分かりません。教えてください。 ちなみに、実行結果は 「配列で実現する文字列」を表示する ABCD 「配列で実現する文字列」のすべての文字を表示する A B C D 「ポインタで実現する文字列」を表示する EFGHI 「ポインタで実現する文字列」のすべての文字を表示する E F G H I のようにしたいです。 よろしくお願いします。

  • 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言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • 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言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • C言語のポインタと配列について

    下のコードについて2つ質問があります。 (1) char *p; p = str; ならわかるのですが、なぜ型が違う char *p = str; のような代入がOKなのでしょうか。文字列をコピーするときの   *p = *str; と比較して、とても違和感があります。  str は引数で受けた文字列の先頭アドレス。 (2)   char *str;   str = " 1 23 4 5"; と   char str[] = " 1 23 4 5"; との違いがよくわかりません。 #include <stdio.h> #include <ctype.h> void TrimSpace(char *str) {   char *p = str;        // (1)型が違うのになぜこんな代入をするのか?      while (*str != '\0') {     if ( !isspace(*str) ) {       *p = *str;      // この代入は自然       p++;     }     str++;   }   *p = '\0'; } int main(void) {      //char *str;   //str = " 1 23 4 5";     (2)これでは空白を詰めた後の文字列が表示されないのはなぜか?      char str[] = " 1 23 4 5"; //これで OK   printf("空白を詰める前:\"%s\"\n", str);   TrimSpace(str);   printf("空白を詰めた後:\"%s\"\n", str);   return 0; }

専門家に質問してみよう