第14講 配列を引数にして、配列を社員(関数)に送る

第2話 謎の解明に向けて
番号付きの箱の集まりが、配列でした。
社員の箱は、社長といえども勝手に使うことは出来ません。
箱そのものを直接やりとりすることは出来ないのです。
ですが、第13講第9話では、箱のやりとりが出来ているように見えます。
その謎を解明するために、
コードを次のように変更しましょう。
#include<stdio.h>
#include<time.h>
char f(int a,int s[20000]);
int main(){
  int i,cn;
  
int *s=(int *)malloc(sizeof(int)*20000);
  clock_t hj,ow;
  hj=clock();
  cn=0;
  for(i=1;i<200001;i++){
    if(f(i,s)){
      printf("%d ",i);
      s[cn]=i;
      cn++;
      if(cn%10==0)printf("\n");
    }
  }
  printf("\n");
  printf("素数が1から200000の間に%d個ありました。\n",cn);
  ow=clock();
  printf("素数探索にかかった時間は%f秒です。\n",(double)(ow - hj) / CLOCKS_PER_SEC);
  printf("プロジェクト終了\n");
  return(0);
}
char f(int a,int s[20000]){
  int w,i;
  w=sqrt(a);
  if(a==1)return(0);
  if(a==2)return(1);
  if(a%2==0)return(0);
  for(i=0;s[i]<=w;i++){
    if(a%s[i]==0)return(0);
  }
  return(1);
}
実行結果は、
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
              〜

198943 198953 198959 198967 198971 198977 198997 199021 199033 199037
199039 199049 199081 199103 199109 199151 199153 199181 199193 199207
199211 199247 199261 199267 199289 199313 199321 199337 199343 199357
199373 199379 199399 199403 199411 199417 199429 199447 199453 199457
199483 199487 199489 199499 199501 199523 199559 199567 199583 199601
199603 199621 199637 199657 199669 199673 199679 199687 199697 199721
199729 199739 199741 199751 199753 199777 199783 199799 199807 199811
199813 199819 199831 199853 199873 199877 199889 199909 199921 199931
199933 199961 199967 199999
素数が1から200000の間に17984個ありました。
素数探索にかかった時間は0.015000秒です。

とまったく同一です。
変更点は、ただ1つです。
  int s[20000];

  int *s=(int *)malloc(sizeof(int)*20000);
にしただけです。
つまり、配列をポインタに変更しただけです。
おそらく、勘のいい人はすでに気がついたことでしょう。
なるほど、箱をやりとりしているのではなく、
・・・・
だと。
答は、30行下。


























    if(f(i,
s)){
で送っているのは、配列そのものではなく、
配列の先頭アドレスです。
記憶力のいい人は、
「だって、これって1回教わっていない?」
と思ったでしょうね。

実は、久しぶりの講義の再開で、
第7講で説明したことを忘れていました
というのが本当のところです。
ですが、第7講ではポインタを送ったのであって、
配列は送っていません。
(第7講をすべて読み直して確認しました。
そもそも第7講以降の後半が、
本来の後の講で触れる予定だった内容を、
気まぐれで入れてしまったものなのです。
でも、配列は扱っていなかったので良かった(;^_^A アセアセ・・・)

さて、次は2次元配列を送ってみましょう。
2次元配列を送るには、
送る側は、
  int m[10][10];
  h(m);
として、受け取る側は、
void h(int m[10][10])
とします。
これで2次元配列を送れます。
正確には、2次元配列の先頭アドレスを送っているのですが。
では、皆さん実行画面が
001 002 003 004 005 006 007 008 009 010
011 012 013 014 015 016 017 018 019 020
021 022 023 024 025 026 027 028 029 030
031 032 033 034 035 036 037 038 039 040
041 042 043 044 045 046 047 048 049 050
051 052 053 054 055 056 057 058 059 060
061 062 063 064 065 066 067 068 069 070
071 072 073 074 075 076 077 078 079 080
081 082 083 084 085 086 087 088 089 090
091 092 093 094 095 096 097 098 099 100

002 004 006 008 010 012 014 016 018 020
022 024 026 028 030 032 034 036 038 040
042 044 046 048 050 052 054 056 058 060
062 064 066 068 070 072 074 076 078 080
082 084 086 088 090 092 094 096 098 100
102 104 106 108 110 112 114 116 118 120
122 124 126 128 130 132 134 136 138 140
142 144 146 148 150 152 154 156 158 160
162 164 166 168 170 172 174 176 178 180
182 184 186 188 190 192 194 196 198 200
プロジェクト終了

となり、次の条件を満たすようにプログラミングして下さい。
@ 社長(main)は配列を
    int m[10][10];
  と定義する。
A 配列の各箱に1から100まで収納させる仕事を社員fに命じる。
B 表示の仕事を社員hに命じる。
C 配列の各要素を2倍にする仕事を社員gに命じる。
D 社長は、配列を社員f,g,hに渡す。
E 社員の型は、すべてvoid型とする。

 



第1話へ 第3話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ