掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24715

連番の添え字
投稿者---yuki(2005/12/11 22:39:41)


Si様申し訳ありません。ソース間違ってました。

data.txt には0 以上100 未満の整数が10000 個格納されている。これを全て読み込んで
x,x + 1,x + 2 という具合にデータが並んでいる部分を探し,あればx が何番目のデー
タかを返し(一番はじめのデータは1 番目),なければ"no"を出力せよ。複数のデータが条
件を満たす場合には,1 番目のデータに一番近い位置にあるものを出力せよ。
例: 10 11 12 のような並びを探す。この時,10 が740 番目のデータであれば740 を出力
する。
ヒント1: 答えは 7811

という課題が出たんで、以下のようなプログラムを立てたんですが
とんでもない数字が出て困っています。

考え方はNumber[i+1]-Number[i]とNumber[i+2]-Number[i+1]がそれぞれ
1だったら連番ということで、添え字に1プラスしたのを出力すると
考えてみたのですが。

ちなみにこのプログラムはnoを出力する部分は書いてません。
まずは添え字を求める方を作ろうと思ったんで。

#include<stdio.h>

int main(void){
    
    
    FILE  *fp;
    int i,youso;
    int Number[10000];
    
    if((fp = fopen("data.txt","r")) == NULL){
        printf("data file open error");
        return 1;
    }
    
    while( fscanf( fp, "%d", &i ) != EOF ){
        
        
        if(Number[i+1] - Number[i] == 1 && Number[i+2] - Number[i+1] == 1){
            
            youso = i;
            
            
        }
        
    }
    fclose(fp);
    printf("%d\n", youso + 1);
    
    return(0);
}






この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:連番の添え字 24717 まきじ 2005/12/11 22:43:13


No.24717

Re:連番の添え字
投稿者---まきじ(2005/12/11 22:43:13)


>if(Number[i+1] - Number[i] == 1 && Number[i+2] - Number[i+1] == 1){

Number に値が入ってません。


この投稿にコメントする

削除パスワード

No.24718

Re:連番の添え字
投稿者---yuki(2005/12/11 22:56:30)


>>Number に値が入ってません。

while文の前に
for(i = 0;i < 10000;i++){
       fscanf( fp, "%d", &Number[i]);
    }


というのを入れて、 while( fscanf( fp, "%d", &Number[i] ) != EOF )
と変更してみたのですが、駄目でした。

これじゃ読みこんで、配列Numberに格納していることになりませんか??


この投稿にコメントする

削除パスワード

No.24719

Re:連番の添え字
投稿者---まきじ(2005/12/11 23:02:28)


>while文の前に

ファイルには必ず 10000 個のデータがあるのですか?

>これじゃ読みこんで、配列Numberに格納していることになりませんか??

データ読み込みながら、連番を数えるのか?
データは予め配列に読み込んでから、配列を利用して連番を数えるのか?


この投稿にコメントする

削除パスワード

No.24720

Re:連番の添え字
投稿者---まきじ(2005/12/11 23:10:17)


というか

>data.txt には0 以上100 未満の整数が10000 個格納されている。これを全>て読み込んで

と仰ってますね・・

>while( fscanf( fp, "%d", &Number[i] ) != EOF )

データは for(i = 0;i < 10000;i++){・・・} で
Number に格納されているので、もう一回読み込む必要はない。


この投稿にコメントする

削除パスワード

No.24721

Re:連番の添え字
投稿者---yuki(2005/12/11 23:15:32)


>>ファイルには必ず 10000 個のデータがあるのですか?

ファイルにはあらかじめ10000個のデータが用意されてます。

>>データ読み込みながら、連番を数えるのか?
>>データは予め配列に読み込んでから、配列を利用して連番を数えるのか?

一応予め配列に読み込んでから、配列を利用して連番を数えようかと
思ったのですが・・。
すいません(泣)



この投稿にコメントする

削除パスワード

No.24723

Re:連番の添え字
投稿者---yuki(2005/12/11 23:41:47)


皆さんの協力の結果完成できました。
Si様、まきじ様ありがとうございました。

えっと、こんな感じです。

#include<stdio.h>
#include<stdlib.h>
int main(void){
    
    
    FILE  *fp;
    int i,count = 0;
    int Number[10000];
    
    if((fp = fopen("data.txt","r")) == NULL){
        printf("data file open error");
        exit(-1);
    }
    
    for(i = 0;i < 10000;i++){
        fscanf( fp, "%d", &Number[i]);
    }
    for(i = 0;i < 10000;i++){
        if(Number[i+1] - Number[i] == 1 )
            if(Number[i+2] - Number[i] == 2){
                
                printf("%d\n", i + 1);
                
                count++;
            }
            
    }
    if(count == 0){
        printf("no\n");
    }
    fclose(fp);
    
    
    return(0);
}



この投稿にコメントする

削除パスワード

No.24727

Re:連番の添え字
投稿者---まきじ(2005/12/11 23:58:59)


 3 個以上の連番も数える様にしてみました。
/*
compiler : gcc 3.4.2 (mingw-special)
option : -std=iso9899:1999 -pedantic -O2 -Wall
*/

#include <stdio.h>

#define N 10

int main(void){

    int num[N]={2,1,0,3,4,5,6,9,8,7};
    int ret = 0;
    
    for(int i = 0, j; i < N; i = i + (j - i) + 1){
        for(j = i + 1; j < N && num[i] +  (j - i) == num[j]; j++);
        j--;
        if(i != j && num[i] + (j - i) == num[j]){
            ret = 1;
            printf("num[%d] from num[%d] is sequence of number\n",i + (j - i),i);
            for(int k = i; k <= j; k++) printf("%3d",num[k]);
            putchar('\n');
            break;
        }
    }
    if(!ret) puts("not sequence of number");
}
break を外せば全ての連番も表示。



この投稿にコメントする

削除パスワード

No.24729

Re:連番の添え字
投稿者---iijima(2005/12/11 23:59:40)


>   for(i = 0;i < 10000;i++){
>       if(Number[i+1] - Number[i] == 1 ) // ★
>           if(Number[i+2] - Number[i] == 2){ // ★                
>               printf("%d\n", i + 1);
>               count++;
>           }
>   }

これだとiが9998以上になったとき、★のところで配列の添え字10000以上
のところを読もうとします。



この投稿にコメントする

削除パスワード

No.24730

Re:連番の添え字
投稿者---yuki(2005/12/12 00:35:00)



>>これだとiが9998以上になったとき、★のところで配列の添え字10000以>>上のところを読もうとします。</pre>

やってみましたけど、ちゃんとできましたよ。


この投稿にコメントする

削除パスワード

No.24731

Re:連番の添え字
投稿者---まきじ(2005/12/12 01:00:32)


>やってみましたけど、ちゃんとできましたよ。

Number[10000] などの値は不定などで
(Number[10000] - Number[9998]) != 2 とは限らない。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧