【問題文】下記の関数 make array(n) を用い,作成した配列を標準出力に出力する.つぎに,下記の関数 unique() に
より,同じ値がある場合は 2 回目以降に出現する同じ値を詰めて更新を行い,更新した配列を標準出力に
出力する.
int *make array(int n) n 個の整数からなる一次元配列を作成し,その配列の先頭アドレスを返値とす
る関数を作成せよ.なお,各配列の要素の値は 0 から 9 の整数値をランダム関数によりランダムに設
定すること.
int unique(int *array, int num)
• 配列 array で格納している整数を調べ,相異なるデータのみを有効とし配列中に先頭から前づめに
して残す、後ろの要素は無効とする.関数の返り値は有効データの入った要素数とする.つまり,
同じ整数を格納している場合は,2 回目以降に出現する同じ整数を無効データとし,配列 array
の格納する整数がすべて異なるように更新する.
• array が NULL の場合は 0 を返り値とすること.
void print array(int *array, int num) 配列 array で格納している整数を添え字の小さい順に標準出力
へ出力する関数を作成せよ.なお,void print array(int *array, int num) では,array が NULL の場
合は ”NULL ”を出力すること.
といった問題を解こうとしています。C言語です。コンパイルは通るのですが全く思い通りに動きません。どこが間違っているでしょうか。(make_array, print_arrayはあっていると思います。)そもそももっと簡単に書ける方法があればぜひ教えていただきたいです。
以下の通りにソースコードを書きました。(Main文まではテンプレートです。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 20
int *make_array(int n);
int unique(int *array, int n);
void print_array(int *array, int num);
int main(void)
{
int *array, num;
int *make_array(int n);
int unique(int *array, int n);
void print_array(int *array, int num);
srandom(time(NULL));
array = make_array(N);
print_array(array, N);
num = unique(array,N);
print_array(array, num);
return 0;
}
【以下、自分が作成】
int *make_array(int n){
int i, *array;
array = (int *)malloc(sizeof(int) * n);
for(i = 0 ; i < n ; i++){
*(array+i) = random() % 10;
}
return array;
}
int unique(int *array, int n){
int i, V;
int sakuzyo(int *ar, int in);
for(i = 0 ; *(array + i) != '\0' ; i++){
V += sakuzyo(array, *(array + i));
}
return V;
}
void print_array(int *array, int num){
int i;
if(array == NULL)printf("NULL\n");
else{
for(i = 0 ; i < num ; i++){
printf("%d ", *(array+i));
}
printf("\n");
}
}
int sakuzyo(int *ar, int in){
int b, c = 0, i = 0, bc = 0, vvv = 0;
b = (int )malloc(sizeof(int));
while((ar + i) != '\0'){
if((ar + i) != in){
*(b + bc) = *(ar + i);
bc++;
}else{
c++;
if(c == 1){
*(b + bc) = *(ar + i);
bc++;
}else{
vvv++;
}
}
i++;
}
ar = b;
return vvv;
}