C言語ポインタ問題2


質問です。


配列ダイナミックパーティション


本題は三つの部分からなっている
(1)整数配列の奇数と偶数の個数を統計する機能を持つ関数CountEvensAndOddsを作成します.この関数には4つのパラメータ、整数配列、配列の長さ、および2つのポインタ(奇数、偶数の個数を返すために使用されます)があります.
(2)(1)のCountEvensAndOdds関数を用いて,1つの整数配列に与えられたすべての奇数と偶数を探し出し,それぞれ2つの新しい動的に開かれた整数配列に保存するPartition関数を記述する.(ヒント:奇数と偶数の数が定まらないため、スペースを節約するためには、必要に応じてスペースを割り当てる必要があります.つまり、奇数が何個あるかによって、複数の奇数配列が割り当てられ、C言語のライブラリ関数malloc関数で動的に配列を作成できます).そして、この2つの新しい配列とその長さを返します.この関数のパラメータは6つあり、整数配列、配列長さ、奇数配列とその長さ、偶数配列とその長さです.
(3)主関数を記述するには、まず整数型の元の配列の大きさを入力し、その後、その元の配列の空間を動的に生成し、その配列を乱数で初期化することができることが要求される.そして(2)中関数Partition()を呼び出し、上記元の配列を分割し、その後、主関数で元の配列、奇数配列、偶数配列をそれぞれ出力する.
要件:各配列のサイズが不定で、動的に生成する必要があります.ポインタとマルチレベルポインタは関数パラメータとして使用されます.
#include<stdio.h>
#include<stdlib.h>
void CountEvensAndOdds(int arr[], int n,int *even,int *odd) {
	for (int i = 0; i < n; i++) {
		if (arr[i] % 2 == 0) *even= *even +1;// *even++ 이런식으로 작성하면 오류난다   이유: *even 주소에값에다가 더하게 되게 때문이다.
		else *odd= *odd +1;
	}

}
void Partition(int arr[], int n, int *evens, int* even, int *odds, int* odd) {
	int e = 0, o = 0;
	for (int i = 0; i < n; i++) {
		if (arr[i] % 2 == 0) {
			evens[e]=arr[i];
			e++;
		}
		else {
			odds[o] = arr[i];
			o++;
		}
	}

}

int main(void) {
	int n,even=0,odd=0;
	int* arr,*evens,*odds;
	printf("input n:");
	scanf_s("%d", &n);
	arr = malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++) arr[i] = rand() % 100;
	CountEvensAndOdds(arr, n, &even, &odd);
	evens = malloc(sizeof(int) * even);
	odds = malloc(sizeof(int) * odd);
	Partition(arr, n, evens, &even, odds, &odd);
	printf("even:");
	for (int i = 0; i < even; i++) printf("%d ", evens[i]);
	printf("odd:");
	for (int i = 0; i < odd; i++) printf("%d ",odds[i]);
	free(evens);
	free(odds);
	free(arr);
	return 0;
}
実行結果

質問です。


最も長い共通単語


2つの文字列の最長の単語を求めるプログラムを作成し、単語がスペース間隔であると仮定します.
指定された2つの文字列は、次のようになります.
This is C Programming text
This is a text for C Programming
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void) {
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	fgets(str1, 100, stdin);
	fflush(stdin);
	fgets(str2, 100, stdin);
	fflush(stdin);
	int l1 = strlen(str1)-1;
	int l2 = strlen(str2)-1;
	int words=0,sub_words=0;
	char word1[50][20] = { 0,0 };
	char word2[50][20] = { 0,0 };
	int i1 = 0, i2 = 0,k=0;
	for (int i=0; i < l1; i++) {
		if (str1[i] != ' ') word1[i1][k] = str1[i],k++;
		else k = 0,i1++;
	}
	k = 0;
	for (int i=0; i < l2; i++) {
		if (str2[i] != ' ') word2[i2][k] = str2[i],k++;
		else k = 0,i2++;
	}
	if (i1 > i2) words = i1+1, sub_words = i2+1;
	else words = i2+1,sub_words=i1+1;
	int maxl = 0;
	char answer[20] = { 0 };



	for (int i = 0; i < words; i++) {
		for (int j = 0; j < sub_words; j++) {
			
			if (words == i1) {
				//printf("%s %s", word1[i], word2[j]);
				if (!strcmp(word1[i], word2[j])) {
					if (maxl < strlen(word1[i]) ) {
						maxl = strlen(word1[i]) ;
						strcpy_s(answer, 20, word1[i]);
					}
				}
			}
			else {
				//printf("%s %s", word2[i], word1[j]);
				if (!strcmp(word2[i], word1[j])) {
					if (maxl < strlen(word1[i]) ) {
						maxl = strlen(word1[i]) ;
						strcpy_s(answer, 20, word1[i]);
					}
				}

			}
		}
	}


	printf("%s", answer);
	


	return 0;
}
実行画面

10番目


最長共通サブストリング


3つの文字列の最長共通サブストリングを求めるプログラムを作成します.
指定された3つの文字列は、次のようになります.
What is local bus
Name some local bus
A local bus is high speed I/O bus close to the processor.
この問題は実現しにくく,コードもきれいではないので,改善が必要である.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	char str3[100] = { 0 };

	fgets(str1, 100, stdin);
	fflush(stdin);
	fgets(str2, 100, stdin);
	fflush(stdin);
	fgets(str3, 100, stdin);
	fflush(stdin);

	int l1 = strlen(str1)-1;
	int l2 = strlen(str2)-1;
	int l3 = strlen(str3) - 1;
	//int words=0,sub_words=0;

	char word1[50][25] = { 0,0 };
	char word2[50][25] = { 0,0 };
	char word3[50][25] = { 0,0 };
	int i1 = 0, i2 = 0,i3=0,k=0;


	for (int i=0; i < l1; i++) {
		if (str1[i] != ' ') word1[i1][k] = str1[i],k++;
		else k = 0,i1++;
	}
	k = 0;
	for (int i=0; i < l2; i++) {
		if (str2[i] != ' ') word2[i2][k] = str2[i],k++;
		else k = 0,i2++;
	}
	k = 0;
	for (int i = 0; i < l3; i++) {
		if (str3[i] != ' ') word3[i3][k] = str3[i], k++;
		else k = 0, i3++;
	}


	//if (i1 > i2) words = i1+1, sub_words = i2+1;
	//else words = i2+1,sub_words=i1+1;
	char answer2[25] = { 0 };
	int maxl = 0;
	char answer[25] = { 0 };
	char space[2] = " ";

	for (int i = 0; i < i1; i++) {
		for (int j = 0; j < i2; j++) {
			if (!strcmp(word1[i], word2[j])) {
				for (int k = 0; k < i3; k++) {
					if (!strcmp(word1[i], word3[k])) {
						int t = 1;
						strcpy_s(answer2, 25, word1[i]);
						while ((!strcmp(word1[i + t], word3[k + t])) &&
							(!strcmp(word1[i + t], word2[j + t]))
							) {
							strcat_s(answer2, 25, space);
							strcat_s(answer2, 25, word1[i + t]);
							t++;
							if ((i + t > i1) || (k + t > i3) || (j + t > i2)) break;

						}
						if (maxl < strlen(answer2)) {
							maxl = strlen(answer2);
							strcpy_s(answer, 25, answer2);
						}
					}
				}
			}
		}
	}

		printf("%s", answer);



		return 0;
	
}
実行結果