プログラミングで住所の長い順に並べて表示させる方法とは?

このQ&Aのポイント
  • プログラミングで住所の長い順に並べて表示させる方法を教えてください。
  • プログラム内のファイルからデータを読み込み、住所の長さに基づいてソートして表示する方法を知りたいです。
  • book1.txtというファイルには複数の名前、生年月日、住所が書かれています。それらの住所を長さの順で並べて表示するためのプログラムの作り方を教えてください。
回答を見る
  • ベストアンサー

プログラミングについて

プログラミングについて #include <stdio.h> #include <math.h> int main() { char line[100], name[100], birth[100], address[100]; FILE *in_file; in_file = fopen("Book1.txt", "r"); if ( in_file == NULL ) { return 0; } while( fgets( line, 100, in_file ) != NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, birth=%s, address=%s\n", name, birth ,address ); } fclose(in_file); return 0; } のプログラミングで、住所の長い順に並べて表示させたいんですが、ここからどういじればいいでしょうか? ちなみに、book1.txtの内容は下記のもの 山田太郎 1200/01/01 福岡市東区箱崎3丁目 情報次郎 1300/12/31 福岡市東区貝塚団地 伊代彩菜 1999/07/15 福岡市西区元岡 福岡花子 1800/05/31 福岡市東区香椎浜1丁目

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

  • ベストアンサー
  • crossgate
  • ベストアンサー率65% (78/119)
回答No.1

方法は2パターンあります。 1つ目は、ファイルの内容を行順に全て読み込んだうえで、住所の長い順でソートして出力する。  ⇒ ループが2回まわることになります。    ファイルの行数(最大)が決まっていないと、領域をallocしながら読み込むことになります。    ソートのロジックが必要です。 2つ目は、ファイルの内容を住所の長い順でソートして読み込み、出力する。  ⇒ 読み込み部分がプラットフォーム依存になります。    UNIX/Linuxなら分かりますが、Windowsは分からないのでアドバイスできません。 どちらが良いのか分からないので、1つ目は面倒なので置いといて、 2つ目(Linux用)はこんな感じです。 --------------------------------------------------------------------------- #include <stdio.h> #include <math.h> /* Book1.txtから住所の長さ、名前、誕生日、住所を取り出して、住所の長さの降順でソートするコマンド */ #define CMD "cat Book1.txt|awk -F' ' '{printf \"%03d %s %s %s\\n\",length($3),$1,$2,$3}'|sort -r" int main() { char line[100], name[100], birth[100], address[100]; FILE *in_file; /* 変数追加 */ char addlen[4]; /* fopenをpopenに変更 */ in_file = popen(CMD, "r"); if ( in_file == NULL ) { return 0; } while( fgets( line, 100, in_file ) != NULL ) { /* addlenは不要だがデータとしてあるためとりあえず取る */ sscanf( line, "%s %s %s %s", addlen, name, birth, address ); printf( "name=%s, birth=%s, address=%s\n", name, birth ,address ); } /* fcloseをpcloseに変更 */ pclose(in_file); return 0; }

その他の回答 (1)

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.2

crossgateです。 1つ目バージョンです。 全角スペースでインデントしてるので、適当に変えてください。 ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <math.h> /* データを入れておく構造体 */ typedef struct {   char name[100];   char birth[100];   char address[100]; } sData; /* 何件ずつデータ格納エリアを確保するか */ #define ALLOCCNT 100 /* qsortの評価関数 */ static int FuncSort(const void *s1, const void *s2) {   int len1, len2;   /* 住所の長さを取得 */   len1 = strlen(((sData*)s1)->address);   len2 = strlen(((sData*)s2)->address);   if ( len1 == len2 ) {     return 0;   } else if ( len1 > len2 ) {     return -1;   } else {     return 1;   } } /* メイン関数 */ int main() {   char line[100];   FILE *in_file;   sData *data_area;   int data_cnt;   int loop_cnt;   in_file = fopen("Book1.txt", "r");   if ( in_file == 0x00 ) {     return 0;   }   /* 初期領域を確保 */   data_area = (sData*)calloc(ALLOCCNT, sizeof(sData));   if ( data_area == 0x00 ) {     fclose(in_file);     return 0;   }   data_cnt = 0;   while( fgets( line, 100, in_file ) != 0x00 ) {     /* データ数が上限に達したら領域を再確保 */     if (( 0 == (data_cnt % ALLOCCNT)) & ( data_cnt != 0 )) {       data_area = (sData*)realloc(data_area, (sizeof(sData) * (data_cnt + ALLOCCNT)));       if ( data_area == 0x00 ) {         fclose(in_file);         return 0;       }       /* 再確保した領域は念のため初期化 */       memset(&data_area[data_cnt], 0x00, (sizeof(sData) * ALLOCCNT));     }     sscanf( line, "%s %s %s", data_area[data_cnt].name, data_area[data_cnt].birth, data_area[data_cnt].address );     data_cnt++;   }   /* 取り込んだデータをソート */   qsort(data_area, data_cnt, sizeof(sData), FuncSort);   /* ソート順に出力 */   for ( loop_cnt = 0 ; loop_cnt < data_cnt ; loop_cnt++ ) {     printf( "name=%s, birth=%s, address=%s\n", data_area[loop_cnt].name, data_area[loop_cnt].birth, data_area[loop_cnt].address );   }   fclose(in_file);   return 0; }

関連するQ&A

  • c言語プログラミング実行時エラーについて質問です。

    c言語プログラミングを実行しようとすると、 エラーが出て次のようなメッセージが出てしまいました。 「「7行目」で記述エラーを発見しました。「constant expression」を付け忘れています。」 どなたか原因を教えてください。よろしくお願いいたします。 以下が失敗したプログラムです。 #include <stdio.h> int main(int argc, const char * argv[]) { const char FILENAME[] = "/Users/user/Desktop/date3.txt"; const int LEN = 100; char line [LEN]; char name [LEN]; char birth [LEN]; char address [LEN]; FILE *dat; dat = fopen(FILENAME, "r"); if ( dat == NULL ) { printf(" ファイル %s がオープンできません. ", FILENAME); return -1; } while( fgets( line, LEN, dat) != NULL ) { sscanf( line "%s, %s, %s", name ,birth, address ); printf("name = %s, address = %s\n", name, address ); } fclose(dat); return 0; }

  • プログラミングの課題です、助けてください。

    C言語のプログラミングの課題で、「以下のプログラムで、引数としてスコア(100等の数字)を与えると、そのスコア以上のエントリだけを検索して、出力するように変更する」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #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プログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • プログラミング教えてください

    プログラミングの問題分かりません教えてください! mcut.c, mpaste.cを参考にしてmcut.cによって 書き込かれたデータの小文字を全て大文字に変換後、共有メモリに 再度書き込むプログラムを作成してください。関数toupper()を使用する。 mcut.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *head; char in_data[4096], *in_ptr; char *pos; int i, in_tmp, shmid; key_t shmkey; shmkey=ftok("mcut",'a'); shmid=shmget(shmkey,sizeof(in_data),IPC_CREAT|0666); head=pos=shmat(shmid,0,0); in_ptr=in_data; for (i=0; i<sizeof(in_data)-1; i++) { if ((in_tmp=getchar())==EOF) { break; } *in_ptr=in_tmp; in_ptr++; } *in_ptr=(char)NULL; in_ptr=in_data; strncpy(pos,in_ptr,sizeof(in_data)); shmdt(head); return EXIT_SUCCESS; } mpaste.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *head; char out_data[4096], *out_ptr; char *pos; int shmid; key_t shmkey; shmkey=ftok("mcut",'a'); shmid=shmget(shmkey,sizeof(out_data),IPC_CREAT|0666); head=pos=shmat(shmid,0,0); out_ptr=out_data; strncpy(out_ptr,pos,sizeof(out_data)); printf("%s",out_data); fflush(stdout); return EXIT_SUCCESS; }

  • c言語  2つのファイルを行ごとに読み込むプログラミング

    c言語  2つのファイルを行ごとに読み込むプログラミング 0.txt と 1.txt という2つのテキストフォルダがあり 0.txt の中身は a a b b 1.txt の中身は c c d d というものとします。 これら2つのフォルダを読み込むとき まず1つのフォルダの1行目(a a)を表示し 他方の1行目(c c) 2行目(d d)を表示させて 続いて1つのフォルダの2行目(b b)を表示し 他方の1行目(c c) 2行目(d d)を表示させたいのです。 つまり実行結果が a a c c a a d d b b  ←理想の実行結果です c c b b d d となるようにしたいのですが #include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int main(void) { FILE *fp, *fp2; int i, j, k; char buf[STR_MAX]; char buf2[STR_MAX]; fp = fopen("0.txt", "r"); fp2 = fopen("1.txt", "r"); if (fp == NULL && fp2 == NULL){ printf("\n"); } while(fgets(buf, STR_MAX, fp) != NULL){ while(fgets(buf2, STR_MAX, fp2) != NULL){ printf("%s%s", buf,buf2); } printf("\n"); } fclose(fp); fclose(fp2); return 0; } このプログラミングの実行結果は a a c c a a d d となり、0.txtの2行目(b b)は表示されません。 おそらく while 文 を2重にすることで 不具合が起きているのだと思うのですが 色々と調べた結果、これ以外に プログラミングが思いつきません。 私の理想の実行結果にするためには どこを訂正させると良いのでしょうか? 恐れ入りますが ご回答 どうかよろしくお願いいたします。

  • プログラミング<暗号入力プログラム>について

    はじめまして。よろしくお願いします。 現在、大学でプログラミングを習っているhayato2192といいます。 この間、ファイルを開くプログラムというのを習ったのですが、 そのプログラムを利用して何かほかのプログラムが作りたいなぁと思い、 暗号入力するとファイルが開く というプログラムをつくったのですが、 コンパイルはできても一向にファイルが開けないので、 コードをどうかえればいいか、というのを教えてください。 よろしくお願いします。 ちなみに、暗号は文字列が良いです。 コードは以下です ******************************** #include <stdio.h> int main(void) { FILE*fp; char i; int c; printf("START PROGRAM * FP\n"); printf("YOU SHOULD INPUT COAD\n"); scanf(" %s", i); if(i == "fileopen"); { if((fp = fopen("\\PROGRAM\\0123456789100.txt", "r")) == NULL) { printf("YOU CAN'T OPEN"); return 1; } while((c = fgetc(fp)) != EOF) { printf(" %c", c); } } else { printf("YOU CAN'T OPEN"); return 2; } fclose(fp); return 0; } ******************************** オープンするファイルはそんな結滞なもんじゃありません。 よろしくお願いします ただのテキストファイルです。

  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • opencvプログラミング エラー

    C++ opencv2.3.1 visual studio 2008 の環境でプログラミングをしているのですが、 以下のようなエラーが出て解決出来ずに困っています。 ------------------------------------------------------------------ 【エラーが出る箇所のソースコード】 if ((tmp_img = cvLoadImage(jpg_name, CV_LOAD_IMAGE_COLOR)) == 0){ free(jpg_name); return -1; } 「jpg_name」には、パスを含むjpgファイル名が記述されたtxtファイルを引数とし、 そのtxtファイルから読み込んだjpgファイル名を格納してあります。 ------------------------------------------------------------------ 【エラー内容】 「jpg_name」にパスも含めて正しくjpgファイル名が格納されているのに tmp_imgに画像が読み込まれず、 if文内のfree、return -1 が実行され、 プログラムが終了してしまいます。 デバッガのウォッチ上では、 「tmp_img」は<未定義の値>、 「cvLoadImage(jpg_name, CV_LOAD_IMAGE_COLOR)」は 「エラー:マネージEEは式の構文を理解しません」と表示されています。 ------------------------------------------------------------------ 解決方法をご存知の方がおられましたら よろしくお願い致します。

  • Javaのプログラミングで困っています。

    プロフィールを打ち込んで表示するプログラムを書いていました。 プロフィールの打ち込み後に画面に表示するのと同時にテキストファイルに書き出したいと思ったため、書いてみましたが、ファイルに書き込めず知識不足で困っています。 是非教えていただきたく書き込みをさせていただきました。 自分で書いたコードは書きになります。 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Sample extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; static JTextField name; static JTextField birth; static JTextField address; static JTextField mail; static JTextField number; JLabel label; public static void main(String args[]){ Sample frame = new Sample("profile"); frame.setVisible(true); } Sample(String title){ setTitle(title); setBounds(100, 100, 500, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30); JButton button = new JButton("取得"); button.addActionListener(this); label = new JLabel(); p.add(name); p.add(birth); p.add(address); p.add(mail); p.add(number); p.add(button); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); try{ File file = new File("C:Users\\mattun\\Documents\\sample.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); //ファイルに書き込む内容 pw.println("名前:"+name.getText()); pw.println("生年月日:"+birth.getText()); pw.println("住所:"+address.getText()); pw.println("mail:"+mail.getText()); pw.println("電話:"+number.getText()); pw.close();//ファイルを閉じる }else{ System.out.println("ファイルに書き込めません");//書き込み出来ない場合 } }catch(IOException e){ System.out.println(e); } } public void actionPerformed(ActionEvent e){ label.setText("<html>"+"名前:"+name.getText()+"<br>"+"生年月日:"+birth.getText()+"<br>"+"住所:"+address.getText()+ "<br>"+"mail:"+mail.getText()+"<br>"+"電話:"+number.getText()+"</html>"); } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }

    • ベストアンサー
    • Java

専門家に質問してみよう