第六章 利用数组处理批量数据
文章目录
- 第六章 利用数组处理批量数据
- 习题
- 1.筛选法求100以内的素数
- 2.选择法对10个整数进行排序
- 3.求3*3的整形矩阵对角线元素之和
- 4.有一个已排好序的数组,要求输入一个数后,按原来顺序的规律插入
- 5.将数组元素按逆序重新存放
- 6.输出杨辉三角形(10行)
- 7.输出魔方阵
- 8.找出一个二维数组中的鞍点,即该位置上元素在该行最大,该行最小,也有可能没有鞍点
- 9.有15个数按从大到小存放到数组,输入一个数,折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出无此数
- 10.有一篇文章,共有3行文字,每行80个字符,统计英文大小写字母、数组、空格和其他字符数
- 11.输出图案
- 12.电文加密
- 13连接两个字符串,不用strcat
- 14 比较两字符串s1、s2,s1>s2输出一个正数;相等输出0;s1<s2输出负数
- 15.将字符数组s2中的全部字符复制到s1中
例6.1 对10个数组元素依次赋值为0,1,2,3…,9并逆序输出
#include<stdio.h>
int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
int i;
for(int i=9;i>=0;i--){
printf("%d ",a[i]);
}
return 0;
}
例6.2 用数组处理Fibonacci数列问题
#include<stdio.h>
int main(){
int i;
int f[20]={1,1}; //对f[]前两个数赋值f0和f1
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++){
if(i%5==0) printf("\n"); //每五个数换行
printf("%12d",f[i]);
}
return 0;
}
例6.3 有10个地区的面积,要求对它们按照从小到大顺序排序
#include<stdio.h>
int main(){
int a[10];
int i,j,t=0;
printf("input 10 nums:\n");
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
printf("\n");
for(j=0;j<9;j++){
for(i=0;i<9-j;i++){
if(a[i]>a[i+1])
t=a[i],a[i]=a[i+1],a[i+1]=t;
}
}
printf("the sorted nums:\n");
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
例6.4 将一个二维数组行和列互换存到零一个二维数组中
a=[1 2 3\n4 5 6] b=[1 4 \n 2 5 \n 3 6]
#include<stdio.h>
int main(){
int m,n; //行数列数
scanf("%d,%d",&m,&n);
int a[m][n],b[n][m];
int i,j,t;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
b[j][i]=a[i][j]; //转置
}
printf("\n");
}
for(i=0;i<n;i++) {
for(j=0;j<m;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
例6.5 有一个3*4的矩阵,求最大值并求所在行列号
打擂台算法
#include<stdio.h>
int main(){
int a[3][4];
int i,j,max,m,n;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",&a[i][j]);
}
}
max=a[0][0];
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if(max<a[i][j])
{
max=a[i][j],m=i,n=j; //记录数值和行列号
}
}
}
printf("max=a[%d][%d]=%d",m+1,n+1,max);
return 0;
}
例6.6 输出一个已知字符串
#include<stdio.h>
int main(){
char c[15]={'1','9','3','6','s','x','y','s','h','z'};
int i;
for(i=0;i<15;i++){
printf("%c ",c[i]);
}
return 0;
}
例6.7 输出一个菱形图
#include<stdio.h>
int main(){
char diam[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
int i,j;
for(i=0;i<15;i++){
for(j=0;j<5;j++){
printf("%c",diam[i][j]);
}
printf("\n");
}
return 0;
}
例6.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开
问题的关键:如何确定“出现一个新单词”
从第一个字符开始逐个字符检查,判断是否是新单词的开头,如果是,就用num的值加一
#include<stdio.h>
int main(){
char str[81];
int i,num=0,word=0;
char c;
gets(str);
for(i=0;(c=str[i])!='\0';i++)
if(c==' ') word=0; //如果是空格,置为0
else if(word==0){
word=1;
num++;
}
printf("%d",num);
return 0;
}
例6.9 有三个字符找出最大者
解题思路:str[0]、str[1]、str[2]看做3个一维字符数组(各有20个元素),视为一维数组处理。用gets函数读入,赋给三个一维字符数组。经过三次两两比较,可得到最大者,然后把他放在string
#include<stdio.h>
#include<string.h>
int main(){
char str[3][20];
char string[20];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nthe largest string is:\n%s\n",string);
return 0;
}
习题
1.筛选法求100以内的素数
#include <stdio.h>
#include <stdbool.h>
#define MAX 100
int main() {
bool isPrime[MAX + 1]; // 用于标记是否为素数
for (int i = 0; i <= MAX; i++) {
isPrime[i] = true; // 初始化数组,假设所有数都是素数
}
// 埃拉托斯特尼筛法
for (int p = 2; p * p <= MAX; p++) {
if (isPrime[p] == true) { // 如果当前数是素数
for (int i = p * p; i <= MAX; i += p) {
isPrime[i] = false; // 将所有p的倍数标记为非素数
}
}
}
// 打印所有素数
printf("Prime numbers up to %d are:\n", MAX);
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
2.选择法对10个整数进行排序
#include <stdio.h>
int main() {
int arr[10] = {29, 10, 14, 37, 13, 40, 23, 34, 42, 31}; // 初始化数组
int n = 10; // 数组长度
// 选择排序算法
for (int i = 0; i < n - 1; i++) {
int minIndex = i; // 假设当前元素是最小值
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 找到更小的值
}
}
if (minIndex != i) {
// 交换位置
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
// 打印排序后的数组
printf("Sorted array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
3.求3*3的整形矩阵对角线元素之和
#include <stdio.h>
int main() {
int matrix[3][3] = { // 初始化3x3矩阵
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int sum = 0; // 用于存储对角线元素的和
// 计算主对角线和副对角线的元素和
for (int i = 0; i < 3; i++) {
sum += matrix[i][i]; // 主对角线元素
sum += matrix[i][2 - i]; // 副对角线元素
}
// 如果是3x3矩阵, 两条对角线交点的元素被加了两次, 需要减去重复加的那个元素
sum -= matrix[1][1]; // 减去中间元素(它被加了两次)
printf("Sum of diagonal elements: %d\n", sum);
return 0;
}
4.有一个已排好序的数组,要求输入一个数后,按原来顺序的规律插入
#include <stdio.h>
int main() {
int arr[11] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; // 初始化已排好序的数组
int n = 10; // 数组中的元素数量
int num;
printf("Enter a number to insert: ");
scanf("%d", &num); // 输入要插入的数
// 找到要插入的位置
int i;
for (i = n - 1; i >= 0 && arr[i] > num; i--) {
arr[i + 1] = arr[i]; // 将元素向右移动
}
arr[i + 1] = num; // 插入元素
// 打印插入后的数组
printf("Array after insertion:\n");
for (int j = 0; j <= n; j++) {
printf("%d ", arr[j]);
}
printf("\n");
return 0;
}
5.将数组元素按逆序重新存放
例:原来顺序8,6,5,4,1 改为:1,4,5,6,8
#include <stdio.h>
int main() {
int arr[5] = {8, 6, 5, 4, 1}; // 初始化数组
int n = 5;
// 交换数组元素,前后对调
for (int i = 0; i < n / 2; i++) {
int temp = arr[i];
arr[i] = arr[n - 1 - i];
arr[n - 1 - i] = temp;
}
// 打印逆序后的数组
printf("Reversed array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
6.输出杨辉三角形(10行)
#include <stdio.h>
int main() {
int rows = 10; // 杨辉三角的行数
int triangle[10][10] = {0}; // 初始化三角形数组
// 生成杨辉三角
for (int i = 0; i < rows; i++) {
triangle[i][0] = 1; // 每行第一个元素为1
triangle[i][i] = 1; // 每行最后一个元素为1
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; // 计算其他元素
}
}
// 打印杨辉三角
for (int i = 0; i < rows; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", triangle[i][j]);
}
printf("\n");
}
return 0;
}
7.输出魔方阵
魔方阵:每一行每一列和对角线之和均相等
例如 8 1 6 \n 3 5 7 \n 4 9 2
#include <stdio.h>
int main() {
int n = 3; // 魔方阵的大小(n x n)
int magic[3][3] = {0}; // 初始化魔方阵
int i = 0, j = n / 2; // 从第一行中间开始
for (int num = 1; num <= n * n; num++) {
magic[i][j] = num; // 将数字放入当前位置
i--;
j++;
if (num % n == 0) { // 如果是n的倍数,向下移动
i += 2;
j--;
} else {
if (j == n) j = 0; // 列超出范围
else if (i < 0) i = n - 1; // 行超出范围
}
}
// 打印魔方阵
printf("Magic Square:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%2d ", magic[i][j]);
}
printf("\n");
}
return 0;
}
8.找出一个二维数组中的鞍点,即该位置上元素在该行最大,该行最小,也有可能没有鞍点
#include <stdio.h>
void find_saddle_point(int matrix[3][3], int rows, int cols) {
int i, j;
int saddle_point_exists = 0;
// 遍历每一行
for (i = 0; i < rows; i++) {
int row_max = matrix[i][0];
int col_index = 0;
// 找到该行的最大值及其所在列
for (j = 1; j < cols; j++) {
if (matrix[i][j] > row_max) {
row_max = matrix[i][j];
col_index = j;
}
}
// 检查该最大值是否是其所在列的最小值
int is_saddle_point = 1;
for (j = 0; j < rows; j++) {
if (matrix[j][col_index] < row_max) {
is_saddle_point = 0;
break;
}
}
// 如果找到鞍点,输出位置和值
if (is_saddle_point) {
printf("Saddle point found at row %d, column %d with value %d\n", i, col_index, row_max);
saddle_point_exists = 1;
}
}
if (!saddle_point_exists) {
printf("No saddle point found.\n");
}
}
int main() {
int matrix[3][3] = {
{1, 2, 3},
{3, 4, 6},
{2, 5, 7}
};
find_saddle_point(matrix, 3, 3);
return 0;
}
9.有15个数按从大到小存放到数组,输入一个数,折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出无此数
#include <stdio.h>
int binary_search(int arr[], int size, int target) {
int left = 0, right = size - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] == target) {
return middle + 1; // 返回元素在数组中的位置,从1开始计数
}
else if (arr[middle] > target) {
left = middle + 1;
}
else {
right = middle - 1;
}
}
return -1; // 找不到元素
}
int main() {
int arr[15] = {99, 88, 77, 66, 55, 44, 33, 22, 20, 18, 17, 16, 15, 10, 5};
int target;
printf("Enter the number you want to search for: ");
scanf("%d", &target);
int result = binary_search(arr, 15, target);
if (result != -1) {
printf("The number is at position %d.\n", result);
} else {
printf("Number not found.\n");
}
return 0;
}
10.有一篇文章,共有3行文字,每行80个字符,统计英文大小写字母、数组、空格和其他字符数
#include <stdio.h>
#include <ctype.h>
int main() {
char text[3][81] = {
"This is a line of text, containing letters A-Z, a-z, numbers 0-9, spaces and other characters!",
"Another line with some TEXT and 12345 numbers, symbols like @#$% and spaces.",
"Last line with a mix of everything: letters, NUMBERS, and symbols!"
};
int upper_case = 0, lower_case = 0, digits = 0, spaces = 0, others = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 80; j++) {
char ch = text[i][j];
if (ch == '\0') break;
if (isupper(ch)) {
upper_case++;
} else if (islower(ch)) {
lower_case++;
} else if (isdigit(ch)) {
digits++;
} else if (isspace(ch)) {
spaces++;
} else {
others++;
}
}
}
printf("大写字母: %d\n", upper_case);
printf("小写字母: %d\n", lower_case);
printf("数字: %d\n", digits);
printf("空格: %d\n", spaces);
printf("其他字符: %d\n", others);
return 0;
}
11.输出图案
#include <stdio.h>
int main() {
int n = 5;
int t;
for (int i = 1; i <= n; i++) {
t=i;
while(t--)
printf(" ");
for (int j = 1; j <= n; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
12.电文加密
A->Z a->z
B->Y b->y
C->X c->x
…
第一个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母字符不变,要求编程序译回原文,并输出密码和原文
#include <stdio.h>
#include <ctype.h>
void encrypt_decrypt(char str[]) {
for (int i = 0; str[i] != '\0'; i++) {
if (isalpha(str[i])) {
if (isupper(str[i])) {
str[i] = 'Z' - (str[i] - 'A');
} else if (islower(str[i])) {
str[i] = 'z' - (str[i] - 'a');
}
}
}
}
int main() {
char text[] = "Hello World!";
printf("原文: %s\n", text);
encrypt_decrypt(text);
printf("编码: %s\n", text);
encrypt_decrypt(text);
printf("解码: %s\n", text);
return 0;
}
13连接两个字符串,不用strcat
#include <stdio.h>
void string_concat(char s1[], char s2[]) {
int i = 0, j = 0;
// 找到s1的末尾
while (s1[i] != '\0') {
i++;
}
// 连接s2到s1
while (s2[j] != '\0') {
s1[i] = s2[j];
i++;
j++;
}
s1[i] = '\0'; // 添加结束符
}
int main() {
char s1[100] = "Hello, ";
char s2[] = "World!";
string_concat(s1, s2);
printf("连接后字符: %s\n", s1);
return 0;
}
14 比较两字符串s1、s2,s1>s2输出一个正数;相等输出0;s1<s2输出负数
不要用strcpy函数,输入用gets读入,输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码差值
例:A和C相比,因为A<C所以应输出负数,AC的ASCII码差值为2,应输出-2
And和Aid 相比 第二个字符n比i大,应输出5
#include <stdio.h>
int compare_strings(char s1[], char s2[]) {
int i = 0;
while (s1[i] != '\0' && s2[i] != '\0') {
if (s1[i] != s2[i]) {
return s1[i] - s2[i];
}
i++;
}
// 比较长度不同的情况
return s1[i] - s2[i];
}
int main() {
char s1[100], s2[100];
printf("输入第一个字符串: ");
gets(s1);
printf("输入第二个字符串: ");
gets(s2);
int result = compare_strings(s1, s2);
if (result > 0) {
printf("s1 > s2, difference: %d\n", result);
} else if (result < 0) {
printf("s1 < s2, difference: %d\n", result);
} else {
printf("s1 == s2\n");
}
return 0;
}
15.将字符数组s2中的全部字符复制到s1中
不用strcpy函数,复制时’\0’也要复制过去,'\0’后的字符不复制
#include <stdio.h>
void string_copy(char s1[], char s2[]) {
int i = 0;
// 复制字符,直到'\0'
while ((s1[i] = s2[i]) != '\0') {
i++;
}
}
int main() {
char s1[100];
char s2[] = "Hello, World!";
string_copy(s1, s2);
printf("复制后字符: %s\n", s1);
return 0;
}
标签:include,int,s1,++,谭浩强,数组,printf,习题,例题
From: https://blog.csdn.net/m0_62328922/article/details/141475863