【嵌入式学习2】指针数组结构体练习题
1、定义一个函数指针变量ptr,指向无参数、无返回值的函数。然后定义一个函数say_hi,它打印出"Hello, World!",使用函数指针调用该函数。
#include <stdio.h>
// 定义函数指针变量ptr,指向无参数、无返回值的函数
void (*ptr)();
void say_hi()
{
printf("Hello,World!\n");
}
int main()
{
// 将函数指针ptr指向函数say_hi
ptr = say_hi;
// 使用函数指针调用函数say_hi
ptr();
return 0;
}
2、编写一个函数get_res,它接受两个整型参数和一个函数指针opt作为回调函数。get_res函数将调用回调函数对给定的两个整数进行操作,并返回结果。编写两个回调函数max和min,分别返回2个整数的最大值和最小值。在主函数中调用get_res函数来演示这两个回调函数。
#include <stdio.h>
int get_res(int a,int b,int (*opt)(int,int))
{
int res = opt(a,b);
return res;
}
int max(int x,int y)
{
if(x > y)
{
return x;
}
else if (x < y)
{
return y;
}
else
{
printf("equal\n");
return x;// 如果相等,返回任意一个值
}
}
int min(int x,int y)
{
if(x > y)
{
return y;
}
else if (x < y)
{
return x;
}
else
{
printf("equal\n");
return x;// 如果相等,返回任意一个值
}
}
int main()
{
int x,y;
printf("请输入x:");
scanf("%d",&x);
printf("请输入y:");
scanf("%d",&y);
int res1 = get_res(x,y,max);
int res2 = get_res(x,y,min);
printf("max=%d,min=%d",res1,res2);
return 0;
}
3、编写一个程序,要求用户输入5个整数,将它们存储在一个数组中,然后计算并输出这5个整数的平均值。
#include <stdio.h>
double avg(int arr[],int len)
{
int sum =0;
for(int i;i<len;i++)
{
sum += arr[i];
}
return (double)sum/len;
}
int main()
{
printf("请输入五个整数:");
int arr[5];
for(int i=0;i<5;i++)
{
scanf("%d",&arr[i]);
}
int len = sizeof(arr)/sizeof(arr[0]);
double a = avg(arr,len);
printf("arg=%.2f",a);
return 0;
}
如何将上述题目中指定的数组大小修改为用户自定义大小?
#include <stdio.h>
#include <stdlib.h>
double avg(int *arr,int len)
{
int sum =0;
for(int i;i<len;i++)
{
sum += arr[i];
}
return (double)sum/len;
}
int main()
{
int n;
printf("请输入数组大小:");
scanf("%d",&n);
//动态分配数组
int *arr = (int *)malloc(n * sizeof(int));
if(arr == NULL)
{
printf("内存分配失败\n");
return -1;
}
printf("请输入%d个整数:",n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
double a = avg(arr,n);
printf("arg=%.2f",a);
free(arr);
return 0;
}
4、编写一个函数find_index,接受一个整型数组、数组的长度和一个整数作为参数,查找并返回该整数在数组中的索引位置。如果该整数不存在于数组中,则返回-1。在主函数中定义一个包含10个元素的数组,并调用find_index函数查找某个整数的索引位置并输出。
#include <stdio.h>
int find_index(int *arr,int len,int a)
{
for(int i=0;i<len;i++)
{
if(arr[i] == a)
{
return i;
}
}
return -1;
}
int main()
{
int a;
int arr[10] = {1,5,9,7,5,3,8,4,2,6};
printf("请输入查找数字:");
scanf("%d",&a);
int index = find_index(arr,10,a);
if(index != -1)
{
printf("%d index = %d",a,index);
}
else
{
printf("Not Found\n");
}
return 0;
}
5、编写一个程序,接受用户输入的一个字符串,然后统计字符串中数字字符的个数并做正序和倒序输出。
#include <stdio.h>
#include <string.h>
#include <ctype.h>// 用于isdigit函数
int main()
{
char input[100];
int count = 0;// 用于统计数字字符的个数
char digits[100];// 用于存储字符串中的数字字符
printf("请输入字符串:");
fgets(input,sizeof(input),stdin);// 读取用户输入的字符串,包括空格
//fgets 函数读取用户输入的字符串,包括空格。fgets 会读取最多 sizeof(input) - 1 个字符,并自动添加字符串结束符 \0
for (int i = 0; i < strlen(input); i++) {
if (isdigit(input[i])) { // 检查是否是数字字符
digits[count++] = input[i];
}
}
// 输出统计结果
printf("数字字符的个数: %d\n", count);
// 正序输出数字字符
printf("正序输出数字字符: ");
for (int i = 0; i < count; i++) {
printf("%c", digits[i]);
}
printf("\n");
// 倒序输出数字字符
printf("倒序输出数字字符: ");
for (int i = count - 1; i >= 0; i--) {
printf("%c", digits[i]);
}
printf("\n");
return 0;
}
如果输出计算的为字符类型?
#include <stdio.h>
#include <string.h>
int main() {
char input[100]; // 假设用户输入的字符串长度不超过99个字符
int count = 0; // 用于统计字符的个数
printf("请输入一个字符串: ");
fgets(input, sizeof(input), stdin); // 读取用户输入的字符串,包括空格
// 移除换行符(如果存在)
input[strcspn(input, "\n")] = '\0';
// 统计字符个数
count = strlen(input);
// 输出统计结果
printf("字符的个数: %d\n", count);
// 正序输出字符
printf("正序输出字符: ");
for (int i = 0; i < count; i++) {
printf("%c", input[i]);
}
printf("\n");
// 倒序输出字符
printf("倒序输出字符: ");
for (int i = count - 1; i >= 0; i--) {
printf("%c", input[i]);
}
printf("\n");
return 0;
}
6、定义一个结构体Person,包含人的姓名和年龄两个成员变量。编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。
#include <stdio.h>
struct Person
{
char name[20];
int age;
};
int main()
{
struct Person arr[3] = {{"alex",20},{"bob",18},{"cindy",25}};
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("第 %d 个人的信息:", i + 1);
printf("姓名-%s 年龄-%d\n", arr[i].name, arr[i].age);
}
return 0;
}