• ベストアンサー

プログラム問題(1)

以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログラムを作成するプログラム。  例 入力 1868  出力 明治元年       2007     平成19年 【自分でやったプログラム】 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define streq(a, b) !strcmp((a), (b)) const char *get_era(int); const char *get_era_name(int); int get_era_year(int); void test_get_era(void); int main(int argc, char *argv[]) { int year; char *endptr; const char *era; test_get_era(); if (argc < 2) { fprintf(stderr, "引数を入力してください。\n"); exit(1); } year = (int) strtol(argv[1], &endptr, 0); if (*endptr != '\0') { fprintf(stderr, "数値を入力してください。\n"); exit(1); } era = get_era(year); if (era == NULL) { fprintf(stderr, "西暦を入力してください。(1868-2007)\n"); exit(1); } printf("%s\n", era); return 0; } const char * get_era(int year) { static char buf[256]; int era_year = get_era_year(year); const char *era_name = get_era_name(year); if (era_year == -1) { return NULL; } if (era_year == 1) { sprintf(buf, "%s%s", era_name, "元年"); } else { sprintf(buf, "%s%d%s", era_name, era_year, "年"); } return buf; } int get_era_year(int year) { if (1868 <= year && year <= 1911) { return year - 1867; } if (1912 <= year && year <= 1925) { return year - 1911; } if (1926 <= year && year <= 1988) { return year - 1925; } if (1989 <= year && year <= 2007) { return year - 1988; } return -1; } const char * get_era_name(int year) { if (1868 <= year && year <= 1911) { return "明治"; } if (1912 <= year && year <= 1925) { return "大正"; } if (1926 <= year && year <= 1988) { return "昭和"; } if (1989 <= year && year <= 2007) { return "平成"; } return NULL; } void test_get_era(void) { /* 無効 */ assert(get_era(1867) == NULL); assert(get_era(2008) == NULL); /* 明治 */ assert(streq(get_era(1868), "明治元年")); assert(streq(get_era(1869), "明治2年")); assert(streq(get_era(1911), "明治44年")); /* 大正 */ assert(streq(get_era(1912), "大正元年")); assert(streq(get_era(1913), "大正2年")); assert(streq(get_era(1925), "大正14年")); /* 昭和 */ assert(streq(get_era(1926), "昭和元年")); assert(streq(get_era(1927), "昭和2年")); assert(streq(get_era(1988), "昭和63年")); /* 平成 */ assert(streq(get_era(1989), "平成元年")); assert(streq(get_era(1990), "平成2年")); assert(streq(get_era(2007), "平成19年")); }

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

「コンパイラが2バイト文字(漢字)を受けつけない」んだと思います。 2バイト文字には「1」とか「A」とか、全角数字や全角英字など「全角の文字、全部」が該当するので注意が必要。 「漢字が使えるコンパイラ」を使用して、テキストエディタも「コンパイラと同じ漢字コードを扱う物」にしましょう。

その他の回答 (2)

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

#1 のついでに, 処理系 (OS とかコンパイラなど) も書いてくれた方がいいかな. なんか文字列まわりっぽいんだけど, 全てローマ字で書いてみたらどうなりますか?

  • morigann
  • ベストアンサー率17% (57/329)
回答No.1

問題2にも言える事ですが、どこでどんなエラーが出たか追記していただけませんか? エラー内容が分からないと、ソースをすべて追うしかないのですが・・・

hamasaki--
質問者

補足

95:文字列または文字定数が閉じていない 96:Return文に:がない 98:文字列または文字定数が閉じていない 99:Return文に:がない と、errorがでるのですがそのとおり記述してもならないのでどこかほかの部分が間違っていると思います! よろしくお願いします!!

関連するQ&A

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • c言語の問題です。ファイルからデータを読み込み連結リストに記憶しソートするプログラムです。お願いします

    ソート部分がどうしてもできません。 またソートは以下のアルゴリズムで行うものです 与えられたリストをリストA、ソート済みのリストをリストBとする。処理の開始段階では、リストBは空である。 1.リストAの要素の中で、最大値をもつ要素Cを探す。 2.要素CをリストAから削除する。 3.要素CをリストBの先頭に挿入する。 4.リストAが空であれば終了。空でなければ 1. にもどる。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct physical Physical; struct physical { char name[41]; int age; float height; float weight; Physical *next; }; void read_data(char *file,Physical *p,Physical *tail); int comp1(const Physical *, const Physical *); int comp2(const Physical *, const Physical *); int comp3(const Physical *, const Physical *); int comp4(const Physical *, const Physical *); void sort(char *arg,Physical *p,Physical *q); Physical *listsort(Physical *p, int (*compar)(const void *, const void *)); int main(void) { char s[20],t,u[20]; Physical *p,*tail,*q; p=malloc(sizeof(Physical)); q=malloc(sizeof(Physical)); tail=malloc(sizeof(Physical)); while(1) { printf("CMD>"); fflush(stdout); fgets(s,20,stdin); sscanf(s,"%c %s",&t,u); switch(t){ case 'q':exit(0); case 'r':read_data(u,p,tail); break; case 's':sort(u,p,q); break; case 'd': while(q!=NULL) { printf("%s %d %.1f %.1f ",q->name,q->age,q->height,q->weight ); q=q->next;} break; } } free(p); return 0; } void read_data(char *file,Physical *p,Physical *tail){ FILE *fp; char string[100]; Physical header; tail=&header; header.next = NULL; p->next = NULL; tail->next = p; tail = p; if ((fp = fopen(file, "r")) == NULL) { exit(1); } while(fgets(string,sizeof(string),fp)!= NULL) { sscanf(string,"%s %d %f %f",p->name,&p->age,&p->height,&p->weight); Physical *tail2; tail2=malloc(sizeof(Physical)); tail2->next=NULL; p->next=tail2; p=tail2; } fclose(fp); } void sort(char *arg,Physical *p,Physical *q){ if(strcmp(arg,"name") == 0) q=listsort(p,(int(*)(const void*, const void*))comp1); if(strcmp(arg,"age") == 0) q=listsort(p,(int(*)(const void*, const void*))comp2); if(strcmp(arg,"height") == 0) q=listsort(p,(int(*)(const void*, const void*))comp3); if(strcmp(arg,"weight") == 0) q=listsort(p,(int(*)(const void*, const void*))comp4); } Physical *listsort(Physical *p,int (*compar)(const void *, const void *)){ Physical *q, *max,*s,*head; s=malloc(sizeof(Physical)); head=malloc(sizeof(Physical)); head=NULL; while(p->next){max = p, q = p->next; while( q->next ) { if( compar(q->next,max->next) ) max = q; q = q->next;} s=max->next; max->next=max->next->next; if(head==NULL) {head=s;} s->next=s; } return head; } int comp1(const Physical *a, const Physical *b){ return (strncmp(a->name,b->name,sizeof(Physical))); } int comp2(const Physical *a, const Physical *b){ if(a->age > b->age) return 1; else return 0; } int comp3(const Physical *a, const Physical *b){ if(a->height > b->height) return 1; else return 0; } int comp4(const Physical *a, const Physical *b){ if(a->weight > b->weight) return 1; else return 0; }

  • 関数がうまく動作しない

    関数get_monthにchar *型の文字列を引数にして、先頭の三文字(大文字でも小文字でも可)が正しいかどうかを関数strnxcmpでチェックしていくものです。 ところが、関数get_month中のreturn iで帰ってくるのはメインプログラムを動作させたところいつも0になってしまっているようです。(本当は1~12が帰ってくるようにしたい。) for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i;←ここのリターンで0が帰ってきてしまう。 } } } 何がおかしいためにこのようになってしまうのでしょうか? よろしくお願いします。 int strnxcmp(const char *s1,const char *s2,size_t n) { while(n && toupper(*s1) && toupper(*s2)) { if(toupper(*s1) != toupper(*s2)) { return ((unsigned char)*s1 - (unsigned char)*s2); } s1++; s2++; n--; } if(!n)return 0; if(*s1) return 1; return -1; } int get_month(char *s) { int m,i; char *tuki[]={"","January","Feburary","March","April","May","June","July","Augst", "September","October","November","December"}; for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i; } } return -1; }

  • このプログラムは「こんにちは」と打つと「こんにちは、元気ですか」と返答

    このプログラムは「こんにちは」と打つと「こんにちは、元気ですか」と返答するプログラムです このプログラムを改良して「こんにちは」と打つと「こんにちは、元気ですか」と言うようなキーワードを打つ決められた回答をするようなものを増やしていきたいのですが、どのように改良すればよいでしょうか? 例えば 「寒いですね」といれると「冬だからね」となるように #include <stdio.h> #include <string.h> int reply(const char *s) { const char *reply_s[] = {"こんにちは 元気ですか?", "バイバイ", "ふ~ん?"}; if(strstr(s, "こんにちは")) puts(reply_s[0]); else if(strstr(s, "さようなら")){ puts(reply_s[1]); return 0; } else puts(reply_s[2]); return 1; } int main(void) { char s[128]; do{ char *p; fgets(s, sizeof s, stdin); if(p = strchr(s, '\n')) *p = '\0'; }while(reply(s)); return 0; }

  • int型変数をchar型変数に格納する方法

    int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

  • qsortの引数について

    以下のプログラムがあります。 int compare( const char **name1, const char **name2 ) { return strcmp( *name1, *name2 ); } int main( void ) { char *names[] = { "rand", "calloc", "malloc" }; int num = sizeof names / sizeof names[0]; qsort( names, num, sizeof( names[0] ), (int (*)(const void *, const void * ))compare ); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~この部分 return 0; } 上の「~~~」の上の部分のqsort関数の第4引数のキャストの意味が 分かりません。なぜ関数の前に引数が書かれるのでしょうか? またintの後にある(*)は「int型のポインタ」と言う意味なのか、 compare関数のポインタなのかも分かりません。 ご回答よろしくおねがいします。

  • プログラムの異常終了

    TEST2とコマンドプロンプトに表示された後、異常終了します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char **f_name2){ printf("ファイル名を入力"); scanf("%s",*f_name2); } int count_num(FILE *fp){ int ch =0; int count=0; while((ch=fgetc(fp))!=EOF){ if(ch>0&&ch<9){ count++; } } return(count); } int main (void){ char *fname; FILE *fp; get_name(&fname); if((fp=fopen(fname,"r"))==NULL){ printf("ファイルオープンエラー"); }else{ printf("%d\n",count_num(fp)); } fclose(fp); printf("TEST2\n"); return(0); } textc13-7.exeは動作を停止しました。と表示があります。正常に終了したいので、 御指摘お願いします。

  • プログラム問題(4)

    以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか? 【問題】 学籍番号、氏名、出席からなる10人分のデータがある。出席の悪いものから並び替  えて表示するプログラム。  例  CA180002 山田太郎 70  CA170001 山田次郎 60  データは、適当なものを使います。 【プログラム】 #include <stdio.h> #include <string.h> typedef struct student_t { char id[9]; char name[51]; unsigned int attendance; } student; student stu[10]; int stu_i = 0; void student_new(const char *, const char *, unsigned int); void student_sort(void); int main(void) { int i; student_new("5", "宮本恒靖", 5); student_new("14", "三都主アレサンドロ", 1); student_new("21", "加地亮", 9); student_new("22", "中澤佑二", 6); student_new("7", "中田英寿", 2); student_new("8", "小笠原満男", 8); student_new("10", "中村俊輔", 7); student_new("15", "福西崇史", 3); student_new("9", "高原直泰", 4); student_new("13", "柳沢敦", 0); student_sort(); for (i = 0; i < stu_i; ++i) { printf("%s %s %d\n", stu[i].id, stu[i].name, stu[i].attendance); } } void student_new(const char *id, const char *name, unsigned int att) { strcpy(stu[stu_i].id, id); strcpy(stu[stu_i].name, name); stu[stu_i].attendance = att; stu_i++; } void student_sort(void) { int i, j; student tmp; for (i = 0; i < stu_i; ++i) { for (j = i + 1; j < stu_i; ++j) { if (stu[i].attendance > stu[j].attendance) { tmp = stu[i]; stu[i] = stu[j]; stu[j] = tmp; } } } }

  • 問題文に対してこのプログラムは正しいか

    文字列を先頭から1文字ずつ表示する関数を作成せよ。 void gput(const char *s, int speed); ここで、sは表示する文字列、speedはミリ秒単位の表示速度である。たとえば、 gput("ABC", 100); と呼びだすと、まず'A'を表示し、その100ミリ秒後に'B'を表示し、さらにその100ミリ秒後に'C'を表示する。このようにして"ABC"の全文字を表示すると呼び出し元に戻ること。 /* 課題2-1 */ #include <time.h> #include <stdio.h> #include <stdlib.h> /* gput関数の宣言 */ void gput(const char *s, int speed); /* sleep関数の宣言 */ int sleep(unsigned long x); int main (void) { gput("ABC", 1000); return (0); } /* gput関数の定義 */ void gput(const char *s, int speed) { int i; int c = strlen(s); for(i=0; i<c; i++){ putchar(s[i]); fflush(stdout); sleep(speed); } } /* sleep関数の定義 */ int sleep(unsigned long x) { clock_t c, s = clock(); do{ if((c = clock()) == (clock_t)-1) return (0); }while(1000UL * (c - s) / CLOCKS_PER_SEC < x); return (1); } 演習問題に解答が無いので質問します。 呼び出し元に戻ることとは、gput関数を呼び出した後にmain関数に戻ることを言っているのでしょうか。 またsleep関数では、return 0とreturn1を使い分けていますがそれぞれどういった意味があるのですか。 関数の返り値は理解できるのですが、本にmain関数のreturn0についてなど何も触れられていないので混乱しています。

  • 和暦変換

    和暦変換で悩んでいます。 悩んでいるのは明治→大正、大正→昭和で重なっている日についてです。 明治の範囲 明治元年9月8日(1868/10/23)~明治45年7月30日(1912/7/30) 大正の範囲 大正元年7月30日(1912/7/30)~大正15年12月25日(1926/12/25) 昭和の範囲 昭和元年12月25日(1926/12/25)~昭和64年1月7日(1989/1/7) 平成の範囲 平成元年1月8日(1989/1/8)~ ということなんですが、例えば「1912/7/30」を和暦に変換するときは、どちらにすべきなんでしょうか? ちなみにMicrosoftExcel で入力すると「1912/7/30」→「大正1年7月30日」と表示され 「明治45年7月30日」と入力しても、次のセルに移動すると「大正1年7月30日」となります。 ということは「1912/7/30」は大正と考えるべきなんでしょうか? (もっともExcel自体が1900/1/1までしか対応しておらず、 明治33年1月1日の前日が明治33年1月0日となるので。。。賢いんだかアレなんだかよくわからない^^;) 同様に「1926/12/25」は昭和でよいのか、大正で良いのかも判りません。 ここら辺が詳しい方、ぜひ教えてくださいませ<(_ _)>

専門家に質問してみよう