利用陣列處理批次資料之習題

EricsT發表於2024-10-23

用篩選法求100以內的素數


//用篩選法求100以內的素數

#include <stdio.h>

int main_6__1(void)
{
	int arr[101] = { 0 };

	for (int i = 0; i < 101; i++)//賦值
		arr[i] = i;

	arr[0] = arr[1] = -1;//挖掉

	for (int i = 0; i < 100; i++)
	{
		if (-1 == arr[i])//被挖掉的就不進行下面的操作
			continue;

		for (int j = i + 1; j < 101; j++)
		{
			if (-1 == arr[j])//被挖掉的就不進行下面的操作
				continue;

			if (0 == (arr[j] % arr[i]))//挖掉
				arr[j] = -1;
		}
	}

	for (int i = 0; i < 101; i++)
	{
		if (-1 != arr[i])
			printf("%d\t", arr[i]);
	}

	printf("\n");

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

用選擇法對10個整數排序


//用選擇法對10個整數排序

#include <stdio.h>

int main(void)
{
	int arr[10], iMin, z;

	for (int i = 0; i < 10; i++)
	{
		printf("請輸入arr[%d]的值\n", i);
		scanf("%d", &arr[i]);
	}

	printf("排序前:\n");

	for (int i = 0; i < 10; i++)
		printf("%d\t", arr[i]);
	
	for (int i = 0; i < 9; i++)
	{
		iMin = arr[i];
		z = i;

		for (int j = i + 1; j < 10; j++)
		{
			if (arr[j] < arr[i])
			{
				if (arr[j] < iMin)
				{
					iMin = arr[j];
					z = j;
				}
			}
		}

		arr[z] = arr[i];
		arr[i] = iMin;
	}

	printf("\n\n排序後:\n");

	for (int i = 0; i < 10; i++)
		printf("%d\t", arr[i]);

	return 0;
}

在VS編譯器內會報C4996錯誤,解決見下文:(下同)

C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. - EricsT - 部落格園 (cnblogs.com)

執行結果:

利用陣列處理批次資料之習題

求一個3 * 3 整型矩陣對角線元素之和


//求一個3 * 3 整型矩陣對角線元素之和

#include <stdio.h>

int main(void)
{
	int arr[3][3] = { 0 };

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("請輸入arr[%d][%d]\n", i, j);
			scanf("%d", &arr[i][j]);
		}
	}

	printf("%d\n", arr[0][0] + arr[1][1] + arr[2][2] + arr[2][0] + arr[0][2]);
	
	return 0;
}

執行結果:

利用陣列處理批次資料之習題

有一個已排序好的陣列,要求輸入一個數後,按原來的排序規律將它插入陣列中


//有一個已排序好的陣列,要求輸入一個數後,按原來的排序規律將它插入陣列中

#include <stdio.h>

int main(void)
{
	int arr[10] = { 1, 4, 6, 9, 13, 16, 19, 28, 40, 100 }, temp;

	printf("old arr\n");
	
	for (int i = 0; i < 10; i++)
		printf("%d\t", arr[i]);

	printf("\n\n請輸入需要插入的數\n");
	scanf("%d", &temp);
	printf("\nnew arr\n");

	char isInsert = 0;

	for (int i = 0; i < 10; i++)
	{
		if (isInsert)
		{
			printf("%d\t", arr[i]);
			continue;
		}

		if (temp > arr[i])
		{
			printf("%d\t", arr[i]);
			continue;
		}

		printf("%d\t", temp);
		i--;
		isInsert = 1;
	}

	printf("\n");

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

將一個陣列的值按逆序重新存放。例如:8, 6, 5, 4, 1 -> 1, 4, 5, 6, 8


//將一個陣列的值按逆序重新存放。例如:8, 6, 5, 4, 1 -> 1, 4, 5, 6, 8

#include <stdio.h>

int main(void)
{
	int arr[] = { 8, 6, 5, 4, 1 };

	printf("arr\n");

	for (int i = 0; i < 5; i++)
		printf("%d\t", arr[i]);
	
	printf("\n\nswap arr\n");

	for (int i = 4; i >= 0; i--)
		printf("%d\t", arr[i]);

	printf("\n");

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

利用陣列處理批次資料之習題


#include <stdio.h>

int main(void)
{
	int arr[10][10] = { 0 };

	for (int i = 0; i < 10; i++)
	{
		arr[i][0] = 1;
		arr[i][i] = 1;
	}

	for (int i = 1; i < 9; i++)
	{
		for (int j = 1; j < i; j++)
			arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
	}

	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < i + 1; j++)
			printf("%-3d\t", arr[i][j]);

		printf("\n");
	}

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

找出一個二維陣列中的鞍點。即該位置上的元素在該行上最大、在該列上最小。也可能沒有鞍點。


//找出一個二維陣列中的鞍點。即該位置上的元素在該行上最大、在該列上最小。也可能沒有鞍點。

#include <stdio.h>

int main(void)
{
	int arr[4][5] = { 0 };

	for (int i = 0; i < 4; i++)//輸入陣列
	{
		for (int j = 0; j < 5; j++)
		{
			printf("請輸入arr[%d][%d]的值\n", i, j);
			scanf("%d", &arr[i][j]);
		}
	}

	printf("arr:\n");

	for (int i = 0; i < 4; i++)//列印陣列
	{
		for (int j = 0; j < 5; j++)
			printf("%d\t", arr[i][j]);

		printf("\n");
	}

	char isSaddlePoint = 0;//預設無鞍點

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			int iCheak = arr[i][j];//一個一個檢查

			char isCol = 1;//預設列符合條件

			for (int z = 0; z < 4; z++)//檢查列
			{
				if (iCheak > arr[z][j])
				{
					isCol = 0;//不符合退出迴圈
					break;
				}
			}

			if (!isCol)//列不符合條件,跳出檢查繼續檢查下一個
				continue;

			char isRow = 1;//預設行符合條件

			for (int z = 0; z < 5; z++)
			{
				if (iCheak < arr[i][z])
				{
					isRow = 0;//不符合退出迴圈
					break;
				}
			}

			if (!isRow)//行不符合條件,跳出檢查繼續檢查下一個
				continue;

			//符合條件,列印鞍點,並使鞍點數量+1
			isSaddlePoint++;
			printf("Saddle Point:%d\n", iCheak);
		}
	}

	if (!isSaddlePoint)//無鞍點,提示
		printf("not exist\n");
	else
		printf("\n");

	return 0;
}

執行結果:

有鞍點:利用陣列處理批次資料之習題  無鞍點:利用陣列處理批次資料之習題

有15個數按由小到大順序放在一個陣列中,輸入一個數,要求用折半查詢法找出該數是陣列中第幾個元素的值。如果該數不在陣列中,則輸出“無此數”


//有15個數按由小到大順序放在一個陣列中,輸入一個數,要求用折半查詢法找出該數是陣列中第幾個元素的值。
//如果該數不在陣列中,則輸出“無此數”

#include <stdio.h>

int main(void)
{
	int arr[15] = { 0 };

	for (int i = 0; i < 15; i++)//輸入陣列
	{
		printf("請輸入arr[%d]的值\n", i);
		scanf("%d", &arr[i]);
	}

	printf("\n\narr:\n");
	
	for (int i = 0; i < 15; i++)//列印陣列
		printf("%d\t", arr[i]);

	int iTemp;
	printf("請輸入待檢查的值\n");//輸出檢查數
	scanf("%d", &iTemp);

	int iMinIndex = 0, iMaxIndex = 14;

	while (iMinIndex < iMaxIndex)
	{
		int iIndex = (iMinIndex + iMaxIndex) / 2;//中間數

		if (arr[iIndex] == iTemp)//相等輸出程式結束
		{
			printf("%d\n", iIndex);
			return 0;
		}

		if (arr[iIndex] > iTemp)//小,找左邊
			iMaxIndex = iIndex - 1;
		else//大,找右邊
			iMinIndex = iIndex + 1;
	}
	
	printf("無此數\n");

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

有一篇文章,共3行文字,每行有80個字元。要求分別統計出其中英文大寫字母、小寫字母、數字、空格以及其他字元的個數


//有一篇文章,共3行文字,每行有80個字元。
//要求分別統計出其中英文大寫字母、小寫字母、數字、空格以及其他字元的個數

#include <stdio.h>

int main(void)
{
	char arr[3][80] = { 0 };

	for (int i = 0; i < 3; i++)
	{
		printf("請輸入第%d行內容\n", i + 1);
		gets(arr[i]);
	}

	int iUpper = 0, iLow = 0, iDig = 0, iSpace = 0, iOther = 0;

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 80; j++)
		{
			char ch = arr[i][j];

			if ('\0' == ch)
				break;

			if ((ch >= 'A') && (ch <= 'Z'))
				iUpper++;
			else if ((ch >= 'a') && (ch <= 'z'))
				iLow++;
			else if ((ch >= '0') && (ch <= '9'))
				iDig++;
			else if (' ' == ch)
				iSpace++;
			else
				iOther++;
		}
	}

	printf("\n\narr\n");

	for (int i = 0; i < 3; i++)
		puts(arr[i]);

	printf("\n");
	printf("大寫字母:%d\n小寫字母:%d\n數字:%d\n空格:%d\n其他:%d\n", 
		iUpper, iLow, iDig, iSpace, iOther);

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

利用陣列處理批次資料之習題


#include <stdio.h>

int main(void)
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			if (j < i)
				printf(" \t");
			else if (j > i + 4)
				printf(" \t");
			else
				printf("*\t");
		}

		printf("\n");
	}

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

利用陣列處理批次資料之習題

即第1個字母變成第26個字母,第i個字母變成第(26-i+1)個字母,非字母字元不變。要求程式設計序將密碼譯回原文,並輸出密碼和原文


#include <stdio.h>

int main(void)
{
	char str[1024] = { 0 }, strNew[1024] = { 0 };

	printf("請輸入密碼\n");
	gets_s(str);//vs在2015之後不可用gets,但是可以用gets_s代替

	for (int i = 0; i < sizeof(str); i++)
	{
		char ch = str[i];

		if ('0' == ch)
			break;

		if ((ch >= 'A') && (ch <= 'Z'))
			ch = 26 - (ch - 'A' + 1) + 1 + 'A' - 1;
		else if ((ch >= 'a') && (ch <= 'z'))
			ch = 26 - (ch - 'a' + 1) + 1 + 'a' - 1;

		strNew[i] = ch;
	}

	printf("\n\n密碼:\n");
	puts(str);
	printf("原文:\n");
	puts(strNew);

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

編一程式,將兩個字串連線起來,不要用 strcat 函式


//編一程式,將兩個字串連線起來,不要用 strcat 函式

#include<stdio.h>

int main(void)
{
	char str1[1024] = { 0 }, str2[1024] = { 0 }, str3[2048] = { 0 }, j = 0;

	printf("請輸入第一個字串:\n");
	gets_s(str1);//vs在2015之後不可用gets,但是可以用gets_s代替
	printf("請輸入第二個字串:\n");
	gets_s(str2);

	for (int i = 0; i < sizeof(str1); i++, j++)
	{
		if ('\0' == str1[i])
			break;

		str3[j] = str1[i];
	}

	for (int i = 0; i < sizeof(str2); i++, j++)
	{
		if ('\0' == str2[i])
			break;

		str3[j] = str2[i];
	}

	puts(str3);

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

編寫一個程式,將兩個字串 s1 和 s2 比較,若 s1 > s2 輸出一個正數;若 s1 = s2 輸出0;若 s1 < s2 輸出一個負數。不要用 strcpy 函式。兩個字串用 gets 函式讀入。輸出的正數或負數的絕對值應是相比較的兩個字串響應字元的ASCII碼的差值。例如 ‘A’與 ‘C’相比,輸出 -2 。


//編寫一個程式,將兩個字串 s1 和 s2 比較,若 s1 > s2 輸出一個正數;若 s1 = s2 輸出0;若 s1 < s2 輸出一個負數。不要用 strcpy 函式。
// 兩個字串用 gets 函式讀入。輸出的正數或負數的絕對值應是相比較的兩個字串響應字元的ASCII碼的差值。例如 ‘A’與 ‘C’相比,輸出-2 。

#include <stdio.h>

int main(void)
{
	char str1[1024] = { 0 }, str2[1024] = { 0 };
	int iRet;

	printf("請輸入第一個字串\n");
	gets_s(str1);//vs在2015之後不可用gets,但是可以用gets_s代替
	printf("請輸入第二個字串\n");
	gets_s(str2);

	for (int i = 0; i < ((sizeof(str1) > sizeof(str2)) ? sizeof(str1) : sizeof(str2)); i++)
	{
		char ch1 = str1[i], ch2 = str2[i];

		if ((ch1 == ch2) && (ch1 == '\0'))
		{
			printf("0\n");
			return 0;
		}
			

		if (ch1 == ch2)
			continue;

		printf("%d\n", ch1 - ch2);
		break;
	}

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

編寫一個程式,將字元陣列 s2 中的全部字元複製到字元陣列 s1 中,不用 strcpy 函式。複製時,'\0'也要複製過去。'\0'後面的字元不復制。


//編寫一個程式,將字元陣列 s2 中的全部字元複製到字元陣列 s1 中,不用 strcpy 函式。複製時,'\0'也要複製過去。'\0'後面的字元不復制。

#include <stdio.h>

int main(void)
{
	char s1[1024] = { 0 }, s2[1024] = { 0 };

	printf("請輸入需要複製的字串\n");
	gets_s(s2);//vs在2015之後不可用gets,但是可以用gets_s代替

	for (int i = 0; i < ((sizeof(s1) > sizeof(s2)) ? sizeof(s1) : sizeof(s2)); i++)
	{
		char ch = s2[i];

		if ('\0' == ch)
		{
			s1[i] = ch;
			break;
		}

		s1[i] = ch;
	}

	puts(s1);

	return 0;
}

執行結果:

利用陣列處理批次資料之習題

相關文章