Lesson 8-3 |
---|
Lesson 8-2で作成したテキストファイルを読み込み、曲名を入力するとその曲が入って
いるCDの名前と何番目かを表示してくれるプログラムを作成しなさい。
|
この問題のプログラム例
(
findCD.c)
をリスト
3に示す。
リスト3:曲名検索
001: #include <stdio.h>
002: #include <string.h>
003:
004:
005: struct cd_data{
006: char title[64];
007: char artist[64];
008: char song[6][64];
009: };
010:
011:
012: int read_file(struct cd_data CD[]);
013: int read_title(int cdnum, FILE *rfile, struct cd_data CD[]);
014: int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]);
015: int read_song(int cdnum, FILE *rfile, struct cd_data CD[]);
016: int find_song(char song[], struct cd_data CD[]);
017:
018:
019:
020:
021: int main(void){
022: char song[64];
023: int nc, find;
024: struct cd_data CD[10];
025:
026:
027:
028: printf("探したい曲名?\t");
029: fgets(song, 64, stdin);
030: nc=strlen(song);
031: song[nc-1]='\0';
032: printf("\n");
033:
034:
035:
036: read_file(CD);
037: find = find_song(song,CD);
038:
039:
040: if(find==0){
041: printf("お探しの曲はありません。\n");
042: }
043:
044: return 0;
045: }
046:
047:
048:
049:
050: int read_file(struct cd_data CD[]){
051: FILE *rfile;
052: int i;
053:
054: rfile = fopen("CDdata.txt","r");
055:
056: for(i=0; i<10; i++){
057: read_title(i, rfile, CD);
058: read_artist(i, rfile, CD);
059: read_song(i, rfile, CD);
060: }
061:
062: fclose(rfile);
063:
064: return 0;
065:
066: }
067:
068:
069:
070:
071: int read_title(int cdnum, FILE *rfile, struct cd_data CD[]){
072: int nc, nc1, nc2;
073: char temp, c1[64], c2[64];
074:
075: sprintf(c1,"CD%d",cdnum+1);
076: nc1=strlen(c1);
077:
078: do{
079: fscanf(rfile, "%s",c2);
080: nc2=strlen(c2);
081: if(nc1<nc2){
082: nc=nc2;
083: }else{
084: nc=nc1;
085: }
086: }while(strncmp(c1,c2,nc)!=0);
087:
088: temp=fgetc(rfile);
089:
090: sprintf(c1,"Title");
091: nc=strlen(c1);
092:
093: do{
094: fscanf(rfile, "%s",c2);
095: }while(strncmp(c1,c2,nc)!=0);
096:
097: temp=fgetc(rfile);
098:
099: fgets(CD[cdnum].title,64,rfile);
100:
101: nc=strlen(CD[cdnum].title);
102: CD[cdnum].title[nc-1]='\0';
103:
104: return 0;
105:
106: }
107:
108:
109:
110:
111: int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]){
112: int nc, nc1, nc2;
113: char temp, c1[64], c2[64];
114:
115: sprintf(c1,"Artist:");
116: nc1=strlen(c1);
117:
118: do{
119: fscanf(rfile, "%s",c2);
120: nc2=strlen(c2);
121: if(nc1<nc2){
122: nc=nc2;
123: }else{
124: nc=nc1;
125: }
126: }while(strncmp(c1,c2,nc)!=0);
127:
128: temp=fgetc(rfile);
129:
130: fgets(CD[cdnum].artist,64,rfile);
131:
132: nc=strlen(CD[cdnum].artist);
133: CD[cdnum].artist[nc-1]='\0';
134:
135: return 0;
136:
137: }
138:
139:
140:
141:
142: int read_song(int cdnum, FILE *rfile, struct cd_data CD[]){
143: int i, nc, nc1, nc2;
144: char temp, c1[64], c2[64];
145:
146: for(i=0; i<6; i++){
147: sprintf(c1,"song%d:", i+1);
148: nc1=strlen(c1);
149:
150: do{
151: fscanf(rfile, "%s",c2);
152: nc2=strlen(c2);
153: if(nc1<nc2){
154: nc=nc2;
155: }else{
156: nc=nc1;
157: }
158: }while(strncmp(c1,c2,nc)!=0);
159:
160: temp=fgetc(rfile);
161:
162: fgets(CD[cdnum].song[i],64,rfile);
163:
164: nc=strlen(CD[cdnum].song[i]);
165: CD[cdnum].song[i][nc-1]='\0';
166:
167: }
168:
169: return 0;
170:
171: }
172:
173:
174:
175:
176: int find_song(char song[], struct cd_data CD[]){
177: int i,j;
178: int nc, nc1, nc2, fnd;
179:
180: fnd=0;
181:
182: nc1=strlen(song);
183:
184: for(i=0; i<10; i++){
185: for(j=0; j<6; j++){
186:
187: nc2=strlen(CD[i].song[j]);
188: if(nc1<nc2){
189: nc=nc2;
190: }else{
191: nc=nc1;
192: }
193:
194:
195:
196:
197: if(strncmp(song, CD[i].song[j], nc)==0){
198: if(fnd==0){
199: printf("%sが見つかりました。タイトルと曲番は以下の通り。\n", song);
200: fnd=1;
201: }
202: printf("\t%s %d\n", CD[i].title, j+1);
203: }
204:
205: }
206: }
207:
208: return fnd;
209:
210: }
211:
212:
探したい曲名? song1
song1が見つかりました。タイトルと曲番は以下の通り。
title5 1
title6 1
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年6月6日