Hjx的作业(第六次)
第一题
利用指针变量将一个数组中的数据反向输出
代码:
/*************************************************************************
> File Name: home01.c
> Author: 霍巨鑫
> Description: 利用指针变量将一个数组的数据反向输出
> Created Time: 2024年12月16日 星期一 19时49分22秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
int arr[] = {11,22,33,44,55};
int len = sizeof(arr) / sizeof(arr[0]);
int *p = arr;
for(int i = len - 1;i >= 0;i--)
{
printf("%d\n",*(p+i));
}
return 0;
}
运行结果:
第二题
利用指针变量计算下标为奇数的数组的和
代码:
/*************************************************************************
> File Name: home02.c
> Author: 霍巨鑫
> Description: 利用指针变量计算下标为奇数的数组的和
> Created Time: 2024年12月16日 星期一 20时06分46秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(arr) / sizeof(arr[0]);
int sum = 0;
int *p = arr;
for(int i = 0;i < len;i++)
{
if(*(p+i) % 2 != 0)
{
sum += *(p+i);
}
}
printf("该数组中奇数的和为:%d\n",sum);
return 0;
}
运行结果:
第三题
确认整型,字符型,浮点型指针变量的大小
代码:
/*************************************************************************
> File Name: home03.c
> Author: 霍巨鑫
> Description: 确认整型,字符型,浮点型指针变量的大小
> Created Time: 2024年12月16日 星期一 20时13分52秒
************************************************************************/
#include <stdio.h>
int main(int argc, char *argv[])
{
int *p1;
char *p2;
float *p3;
double *p4;
printf("整型指针变量的大小为: %ld 字节\n", sizeof(p1));
printf("字符型指针变量的大小为: %ld 字节\n", sizeof(p2));
printf("单精度浮点型的指针变量大小为: %ld 字节\n", sizeof(p3));
printf("双精度浮点型指针变量大小为: %ld 字节\n", sizeof(p4));
return 0;
}
运行结果:
第四题
利用指针变量输出字符数组中的所有字符
代码:
/*************************************************************************
> File Name: home04.c
> Author: 霍巨鑫
> Description: 利用指针变量输出字符数组中的所有字符
> Created Time: 2024年12月16日 星期一 20时32分55秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
char arr[] = {'h','j','x'};
int len = sizeof(arr) / sizeof(arr[0]);
char* p = arr;
for(int i = 0;i < len;i++)
{
printf("%c\n",*(p+i));
}
return 0;
}
运行结果:
第五题
编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值
代码:
/*************************************************************************
> File Name: home05.c
> Author: 霍巨鑫
> Description: 编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值
> Created Time: 2024年12月16日 星期一 20时55分59秒
************************************************************************/
#include <stdio.h>
double fun(double *p,int len)
{
double sum = 0.0;
for(int i = 0;i < len;i++)
{
sum += p[i];
}
return sum / len;
}
int main(int argc,char *argv[])
{
double arr[5];
int len = sizeof(arr) / sizeof(arr[0]);
printf("请输入五个浮点型的数:\n");
for(int i = 0;i < len;i++)
{
scanf("%lf",&arr[i]);
}
double result = fun(arr,len);
printf("该浮点型数组元素的平均值为:%.2lf\n",result);
}
运行结果:
第六题
编写函数,要求用指针做形参,分别实现以下功能:
(1)求一个字符串长度
(2)在一个字符串中统计大写字母的个数
(3)在一个字符串中统计数字字符的个数
代码:
/*************************************************************************
> File Name: home06.c
> Author: 霍巨鑫
> Description: 编写函数,要求用指针做形参
> Created Time: 2024年12月17日 星期二 11时32分15秒
************************************************************************/
/**
* 分别实现以下功能:
* (1)求一个字符串长度
* (2)在一个字符串中统计大写字母的个数
* (3)在一个字符串中统计数字字符的个数
*/
#include <stdio.h>
#include <string.h>
int fun1(char* arr_1)
{
return strlen(arr_1);
}
int cap(char* arr_2,int len)
{
int count = 0;
for (int i = 0; i < len; i++)
{
if (arr_2[i] >= 'A' && arr_2[i] <= 'Z')
{
count++;
}
}
return count;
}
int num(char* arr_3,int len)
{
int sum = 0;
for(int j = 0;j < len;j++)
{
if(arr_3[j] >= '0' && arr_3[j] <= '9')
{
sum++;
}
}
return sum;
}
int main(int argc,char *argv[])
{
char arr[] = {"My name is HJX,I am 25 years old!"};
int len = fun1(arr);
printf("这个字符串的长度为:\n%d\n",len);
int str_1 = cap(arr, len);
printf("这个字符串中的大写字母个数为:\n%d\n",str_1);
int str_2 = num(arr,len);
printf("这个字符串中的数字个数为:\n%d\n",str_2);
return 0;
}
运行结果:
第七题
编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换):int(*p)[N]
代码:
/*************************************************************************
> File Name: home07.c
> Author: 霍巨鑫
> Description: 编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换):int(*p)[N]
> Created Time: 2024年12月17日 星期二 19时42分18秒
************************************************************************/
#include <stdio.h>
#define N 3
void fun_1(int (*p)[N], int len)
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
printf("%d", p[i][j]);
}
printf("\n");
}
}
void fun_2(int (*p)[N], int len)
{
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
// 交换元素
int temp;
temp = p[i][j];
p[i][j] = p[j][i];
p[j][i] = temp;
}
}
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
printf("%d", p[i][j]);
}
printf("\n");
}
}
int main(int argc, char *argv[])
{
int arr[N][N] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
int len = sizeof(arr) / sizeof(arr[0]);
printf("源二维数组是:\n");
fun_1(arr, len);
printf("交换后的二维数组是:\n");
fun_2(arr, len);
}
运行结果:
第八题
编写函数,要求用指针做形参,实现统计二维数组上三角中的0 的数量
代码:
/*************************************************************************
> File Name: home08.c
> Author: 霍巨鑫
> Description: 编写函数,要求用指针做形参,实现统计二维数组上三角中的0的数量
> Created Time: 2024年12月17日 星期二 20时23分41秒
************************************************************************/
#include <stdio.h>
#define N 3
int fun_1(int (*p)[N], int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
for (int j = i; j < len; j++)
{
printf("%d", p[i][j]);
if (p[i][j] == 0)
{
sum++;
}
}
printf("\n");
}
return sum;
}
int main(int argc, char *argv[])
{
int arr[N][N] = {
{0, 2, 0},
{4, 0, 6},
{0, 8, 0}};
int len = sizeof(arr) / sizeof(arr[0]);
printf("该二维数组中上三角0的个数是:\n%d\n", fun_1(arr, len));
}
运行结果:
第九题
编写一个指针函数,返回二维数组中最大元素的地址
代码:
/*************************************************************************
> File Name: home09.c
> Author: 霍巨鑫
> Description: 编写一个指针函数,返回二维数组中最大元素的地址
> Created Time: 2024年12月19日 星期四 17时50分21秒
************************************************************************/
#include <stdio.h>
int *find(int arr[][3], int row, int col)
{
int max = arr[0][0];
int *max_add = &arr[0][0]; // 初始化最大元素地址为数组的第一个元素地址
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (arr[i][j] > max)
{
max = arr[i][j];
max_add = &arr[i][j]; // 更新最大元素地址
}
}
}
return max_add; // 返回最大元素的地址
}
int main(int argc, char *argv[])
{
int arr_1[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
// 调用指针函数,获取最大元素的地址
int *max_ment = find(arr_1, 3, 3);
// 打印最大元素的值
printf("这个数组中最大元素为: %d\n", *max_ment);
printf("这个数组中最大元素的地址为:%p\n",max_ment);
return 0;
}
运行结果:
第十题
面试题
1)定义整形变量; // int a;
2)p为指向整形变量的指针变量;int* p = &a;
3)定义整形一维数组p,它有n 个整形元素;// int n = 5;int *p[n];
4)定义一维指针数组p,它有n个指向整形变量的指针元素;// int *p[n];
6)p为返回整形函数值的函数;// int p(){}
7)p为返回一个指针的函数,该指针指向整形数据;// int* p(){}
8)p为指向函数的指针变量,该函数返回一个整形值;// int (*p)(int);
9)p是一个指向整形指针变量的指针变量;// int** p;
第十一题
动态申请⼀个具有10个float类型元素的内存空间,从⼀个已有的数组中拷贝数据,并找出第⼀次出现 12.35 的下标位置,并输出。
代码:
/*************************************************************************
> File Name: home11.c
> Author: 霍巨鑫
> Description: 动态申请⼀个具有10个float类型元素的内存空间
> Created Time: 2024年12月22日 星期日 17时55分42秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
float arr[10] = {1.0, 2.1, 3.2, 4.3, 5.4, 12.35, 8.7, 9.8, 10.9};
int len = sizeof(arr) / sizeof(arr[0]);
// 动态申请内存空间
float *mem_arr = (float *)malloc(10 * sizeof(float));
if (mem_arr == NULL)
{
printf("内存分配失败!\n");
return -1;
}
// 从现有数组中拷贝数据
for (int i = 0; i < 10;i++)
{
mem_arr[i] = arr[i];
}
// 查找出现12.35的位置
int temp = -1; // 初始化下标位置,用来接收找到新的下标位置
for (int i = 0; i < 10; i++)
{
if (mem_arr[i] == 12.35)
{
temp = i;
break;
}
}
// 输出结果
if (temp != -1)
{
printf("出现12.35的下标位置是:%d\n", temp);
}
else
{
printf("数组中没有找到!\n");
}
free(mem_arr);
return 0;
}
运行结果:
第十二题
动态申请⼀个整型数组,并给每个元素赋值,要求删除第3个元素
代码:
/*************************************************************************
> File Name: home11.c
> Author: 霍巨鑫
> Description: 动态申请⼀个整型数组,并给每个元素赋值,要求删除第3个元素
> Created Time: 2024年12月22日 星期日 17时55分42秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 10;
int *array = (int *)malloc(n * sizeof(int));
if (array == NULL)
{
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < n; i++)
{
array[i] = i + 1;
}
printf("源数组为:\n");
for (int i = 0; i < n; i++)
{
printf("%d ", array[i]);
}
printf("\n");
int indexToDelete = 2;
if (indexToDelete >= 0 && indexToDelete < n - 1)
{
// 确保索引有效且不是最后一个元素
for (int i = indexToDelete; i < n - 1; i++)
{
array[i] = array[i + 1]; // 将后续元素向前移动
}
n--; // 更新数组的逻辑大小(注意:内存大小仍然是原来的)
}
else
{
printf("索引无效!\n");
}
// 打印修改后的数组
printf("模拟删除索引处元素后的数组:\n");
for (int i = 0; i < n; i++)
{
printf("%d ", array[i]);
}
printf("\n");
// 释放动态分配的内存
free(array);
return 0;
}
第十三题
动态申请⼀个整型数组,并给每个元素赋值,要求在第4个元素后插⼊100
代码:
/*************************************************************************
> File Name: home13.c
> Author: 霍巨鑫
> Description: 动态申请⼀个整型数组,并给每个元素赋值,要求在第4个元素后插⼊100
> Created Time: 2024年12月22日 星期日 19时56分07秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int size = 10; // 数组初始大小
int *arr = (int *)malloc(size * sizeof(int)); // 动态分配内存
if (arr == NULL)
{
printf("内存分配失败\n");
return 1;
}
// 初始化数组元素
for (int i = 0; i < size; i++)
{
arr[i] = i + 1; // 数组元素为1, 2, 3, ..., 10
}
// 打印原始数组
printf("原始数组:\n");
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
// 插入位置(第4个元素后,索引3后)
int insertIdx = 3;
// 创建新数组以容纳新元素
int *newarr = (int *)malloc((size + 1) * sizeof(int)); // 数组大小加1
if (newarr == NULL)
{
printf("新数组内存分配失败\n");
free(arr); // 释放旧数组内存
return 1;
}
// 复制旧数组元素到新数组,并插入新元素
for (int i = 0; i < insertIdx; i++)
{
newarr[i] = arr[i];
}
newarr[insertIdx] = 100; // 插入新元素
for (int i = insertIdx; i < size; i++)
{
newarr[i + 1] = arr[i]; // 移动旧数组剩余元素
}
// 更新数组大小和指针
size++;
free(arr); // 释放旧数组内存
arr = newarr; // 更新指针指向新数组
// 打印修改后的数组
printf("在索引3后插入100后的数组:\n");
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
// 释放动态分配的内存
free(arr);// 运行的时候删除掉
return 0;
}
运行结果:
第十四题
控制台输⼊⼀个n,要求创建⼀个n⾏n列的数列,求对⻆线上元素的和,要求使⽤指针实现
代码:
/*************************************************************************
> File Name: home14.c
> Author: 霍巨鑫
> Description:
> Created Time: 2024年12月22日 星期日 20时01分11秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
printf("请输入矩阵的行数(n): ");
scanf("%d", &n);
// 动态分配二维数组的内存
int **matrix = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++)
{
matrix[i] = (int *)malloc(n * sizeof(int));
}
// 初始化二维数组(示例中使用1到n^2的整数进行填充)
int value = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix[i][j] = value++;
}
}
// 计算对角线上元素的和(包括主对角线和副对角线)
int sumMainDiag = 0;
int sumAntiDiag = 0;
for (int i = 0; i < n; i++)
{
sumMainDiag += matrix[i][i]; // 主对角线元素
sumAntiDiag += matrix[i][n - 1 - i]; // 副对角线元素
}
// 如果n为奇数,则中心元素被重复计算,需从副对角线和中减去
if (n % 2 == 1)
{
int mid = n / 2;
sumAntiDiag -= matrix[mid][mid];
}
// 输出对角线上元素的和
printf("主对角线上元素的和: %d\n", sumMainDiag);
printf("副对角线上元素的和: %d\n", sumAntiDiag);
// 释放动态分配的内存
for (int i = 0; i < n; i++)
{
free(matrix[i]);
}
free(matrix);
return 0;
}