• ベストアンサー

C言語の質問です

下記のプログラムは数字の0から9を意味する英単語の文字列テーブルを作成し、それからユーザーに(文字として)数字を入力させ、このテーブルを使って該当する単語を表示するものです #include <stdio.h> #include <conio.h> int main(void) { char digits[10][10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char num; printf("数字を入力してください: "); num = getche(); printf("\n"); num = num - '0'; if(num>=0 && num<10) printf("%s", digits[num]); return 0; } num = num - '0' とするのが分かりません。 使っている本には、ヒントとして 『入力された文字から'0'を引けば、テーブルのインデックスが得られます』とありますが、これもよく分かりません。

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

  • ベストアンサー
noname#77845
noname#77845
回答No.2

num = getche(); で入力されるのは文字としての数字です。 "0"なら30H(48)になります。 "0"から"0"を引くと当然 0 になります。 "1"なら31H(49)になりますから、同じように"0"を引くと 49-48=1 となり、"1"を入力したときのインデックス 1 が得られます。 同じように"9"までの配列なので、"0"を引くことでテーブルのインデックスが得られるのです。 判ります? 因みに、 文字 16進数 10進数  0   30H   48  1   31H   49  2   32H   50  3   33H   51  4   34H   52  5   35H   53  6   36H   54  7   37H   55  8   38H   56  9   39H   57

Guchiken
質問者

お礼

回答ありがとうございます!! インデックスを得るために文字コードが連続しているのを利用して'0'(10進でいう48)で引いていたんですね。判りました! 回答ありがとうございました!!

その他の回答 (2)

回答No.3

文字コードというのをご存知でしょうか? アスキーコードというルールに従うと 以下のように決まっているんです。 0という文字 --> 48番 1という文字 --> 49番 2という文字 --> 50番 3という文字 --> 51番 4という文字 --> 52番 5という文字 --> 53番 6という文字 --> 54番 7という文字 --> 55番 8という文字 --> 56番 9という文字 --> 57番 なので、あなたがキーボードから '5' を入力しても コンピュータはそれが数値の 5ではなく 53 と認識しているということです。 つまりその数値から '0' (48)を引くとその数字に対応する 数値が得られるということです。 例えば '5'は 53です。これから 48を引くと初めて 数値の 5 が得られるということです。

Guchiken
質問者

お礼

回答ありがとうございます 文字コードの存在は知っていて、アルファベットは連続してならんでいることは知っていました。数字については知りませんでした。アスキーコードの存在に気がつかなかったのは落度でした… 回答ありがとうございました!!

  • agricap
  • ベストアンサー率40% (79/195)
回答No.1

'0'は、「0」という文字の文字コードです。 具体的には10進数でいうと48です。 一方で、numは、やはり入力した数字の文字コードです。 0・・・48 1・・・49 2・・・50 (途中省略・・・・・・・・) 9・・・57 です。 ここで、0から9までの文字コードが連続しているところがミソです。 これが連続しているから、入力した数字の文字コードと、0の文字コードの差を求めると、入力した数字の数値としての値が得られることになります。 同様にa~z、A~Zなんかも文字コードが連続しているので、同様の手法はよく使います。

参考URL:
http://e-words.jp/p/r-ascii.html
Guchiken
質問者

お礼

回答ありがとうございます! 文字コードが関係してたんですね!気が付きませんでした! 文字として入力した数字の文字コードから'0'、つまり48引いて、インデックスとして使っているんですね。 回答ありがとうございました!!

関連するQ&A

  • C言語のポインタのことで

    int num=15; int *p=&num; char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • C言語の問題が解けません!

    僕は、C言語を勉強しているのですがこの問題の答えがわかりません。 どうか教えてください。 回答お願いします。 ・問題・ 10文字以内の2つの英単語を入力し、アルファベット順で最初にくる単語を表示するプログラムを作りなさい。 /プログラム/ #include<stdio.h> #include<string.h> int main(void) { char str1[256],str2[256]; int i; printf("文字列1は?"); printf("文字列2は?"); return 0; }

  • C言語 コンパイルできるが実行するとエラー

    非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用) ━━━━━━━━━━━━━━━━━━━━━━━━━━ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> /* atoi使用 */ #include <ctype.h> /* isdigit使用 */ int main(void) {   char cx;   int nx;   printf("非負の整数を入力してください。:");   scanf("%s", cx);   if(isdigit(cx) == 0){     printf("数字を入れてください。\n");   }else{     nx = atoi((const char*) cx);   }   printf("%d", nx);   return 0; } ━━━━━━━━━━━━━━━━━━━━━━━━━━ 実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?

  • C言語について

    いつも、お世話になっています。 以下のソースでわからないことがあります。 1.構造体入れ子になっている SCH の代入方法。 2.一覧表示するとき、入れ子になっているSCHの表示方法。 3./*IDの入力後に社員リストからそのIDを呼び出す*/の件ついての考え方。 宜しくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define MAX_NUMBER 100 /* 登録件数 */ #define NAME 30 /* 氏名の文字数 */ #define LINE 100 /* スケジュールの文字数 */ #define NUM 4 /* IDの桁数 */ typedef struct { char SCH[LINE]; /* 予定 */ } work; typedef struct { char ID[NUM]; /* 番号 */ char name[NAME]; /* 氏名 */ work sched; } syain; void namecheck(char* ID) { printf("ID:"); scanf("%s", ID); } void namecheck(char* name) { printf("名前:"); scanf("%s", name); } void syaintouroku(syain data[], int syain_num) { IDcheck(data[syain_num].ID); namecheck(data[syain_num].name); } void sched_touroku(syain data[], int syain_num) { puts("登録するIDを入力してください。"); /*IDの入力後に社員リストからそのIDを呼び出す*/      /*そのIDの方のスケジュールを登録*/ SCHcheck(data[syain_num].work.SCH); } void print_data(syain data[], int syain_num) { for(i = 0; i < MAX_NUMBER; i++){      printf(data[syain_num].ID, data[syain_num].name, data[syain_num].work.ID,); } } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; syaintouroku(meibo, max_syain); max_syain++; worktouroku(meibo, syain_num); print_data(meibo, syain_num) return 0; }

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • C言語の質問です

    キーボードから文字列を何度も入力し、入力文字数が0文字になるまで入力を繰り返し合計の文字数を表示するプログラムでなのですが。 ???の部分がわかりません 教えて頂けませんか? #include <stdio.h> #include <string.h> //関数のプロトタイプ宣言 int input(); int main(void) { int n; //入力文字数 int total; //合計文字数 for(total = 0 ; (n =??? ) != 0; total +=n ); printf("%d文字\n" , total); } int input() { char buff[80]; printf("文字列を入力:"); gets(buff); return ??? ; }

  • 上手く表示できない。(C言語)

    お世話になります。capeofdragonと申します。 Visual Studio 2008 ProでC言語を書いたのですが、 上手く表示されません。 やりたいことは、 256と言う、int型の値を、十分の一倍し、 25.6 と言う、文字列に置き換えて、 文字列として表示させることです。 以下にソースを添付します。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> char *ftoa(int num) { char Num[10]; char rNum[10]; char decimal1[1]; char integer[2]; _itoa_s(num, Num, 10); integer[0] = Num[0]; integer[1] = Num[1]; decimal1[0] = Num[2]; if(integer[0] == '0') { rNum[0] = integer[1]; rNum[1] = '.'; rNum[2] = decimal1[0]; return rNum; } else { rNum[0] = integer[0]; rNum[1] = integer[1]; rNum[2] = '.'; rNum[3] = decimal1[0]; return rNum; } } int _tmain(int argc, _TCHAR* argv[]) { char *pWk; int a = 256; pWk = ftoa(a); printf("pWk = %s\n",pWk); return 0; } コンパイルすると、 pWk =  と表示され、 pWk = 25.6 と表示されません。 また、sprintfを使いたいのですが、 高速化のために、キャラクター操作とかけ算、シフトレジスタなどだけで シンプルに作成したいと考えています。 お手数をお掛け致しますが、 ご教授宜しくお願い致します。

  • 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言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }