C语言实验-数组、字符串以及指针

一:

求一个N×N矩阵主、次对角线上所有元素之和。矩阵输入、矩阵输出、矩阵对角线求和分别用三个子函数实现。(N的值由用户从键盘输入)

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void print(int(*arr)[3], int N)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%d ", *(arr[i] + j));
		}
		printf("\n");
	}
	printf("\n");
}

void input(int(*arr)[3], int N)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			scanf("%d", (arr[i] + j));
		}
	}
}

int fun(int (*arr)[3], int N)//指针数组的形式传参
{
	int ret = 0;
	for (int i = 0; i < N; i++)
	{
		ret += *(arr[i] + i);
	}
	return ret;
}

int main()
{
	printf("输入数组行列数:\n");
	int N = 0;
	scanf("%d", &N);
	int(*arr)[3] = (int(*)[3])malloc(sizeof(int) * N * N);//数组指针,[3]中的3没有任何意义,但是不能去掉
	printf("输入数组:\n");
	input(arr, N);
	print(arr, N);

	printf("对角线之和为%d", fun(arr, N));

	return 0;
}

二: 

编写程序,将一个数列实现循环右移一位。

例如:  输入数列的长度:6

输入原始数列:1  2  3  4  5  6

循环右移一位后变为:6  1  2  3  4  5

数列输入、数列输出、数列右移分别用三个子函数实现。(数列的个数由用户从键盘输入)

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void print(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void input(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}
}

void fun(int* arr, int N)
{
	int* arr2 = (int*)malloc(sizeof(int) * N);
	for (int i = 1; i < N; i++)
	{
		arr2[i] = arr[i - 1];
	}
	arr2[0] = arr[N - 1];
	print(arr2, N);
}

int main()
{
	printf("请输入数组长度:");
	int N = 0;
	scanf("%d", &N);
	int* arr = (int*)malloc(sizeof(int) * N);//动态开辟空间
	input(arr, N);
	fun(arr, N);

	return 0;
}

三:

在2题的基础上,改写程序,实现数列右移n位。数列输入、数列输出、数列右移分别用三个子函数实现。(数列的个数、右移的位数由用户从键盘输入)

例如:  输入数列的长度:6

输入原始数列:1  2  3  4  5  6

        输入右移的位数:3

循环右移3位后变为:4  5  6  1  2  3 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void print(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void input(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}
}

void fun(int* arr, int N, int a)
{
	int* arr2 = (int*)malloc(sizeof(int) * N);
	for (int i = a; i < N; i++)
	{
		arr2[i] = arr[i - a];
	}
	for (int i = 0; i < a; i++)
	{
		arr2[i] = arr[N - a + i];
	}
	print(arr2, N);
}

int main()
{
	printf("请输入数组长度:");
	int N = 0;
	scanf("%d", &N);
	int* arr = (int*)malloc(sizeof(int) * N);
	input(arr, N);
	printf("右移的位数:");
	int a = 0;
	scanf("%d", &a);
	fun(arr, N, a);


	return 0;
}

四: 

编写程序,删除数列中的某个数。数列输入、数列输出、数列删除分别用三个子函数实现。(数列、要删除的数值都由用户从键盘输入,有则删除——所谓删除就是后序的元素往前覆盖,无则提示“该数不存在。”)

例如:  输入数列的长度:11

输入原始数列:1  2  3  4  5  6  2  8  -5  2  7

        输入要删除的数: 2

删除以后的数列长度:8

删除以后的数列:1  3  4  5  6  8  -5  7

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void print(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void input(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}
}

void fun(int* arr, int N, int a)//N位数组长度 a为要删除元素
{
	int num = N;
	int* arr2 = (int*)malloc(sizeof(int) * N);
	int j = 0;
	int i = 0;
	while (j < N)
	{
		if (arr[j] == a)
		{
			j++;
			num--;
		}
		arr2[i++] = arr[j++];
	}
	printf("删除以后的数列长度:%d\n", num);
	print(arr2, num);
}

int main()
{
	printf("输入数组长度:");
	int N = 0;
	scanf("%d", &N);
	int* arr = (int*)malloc(sizeof(int) * N);
	input(arr, N);
	printf("输入要删除的数:");
	int a = 0;
	scanf("%d", &a);
	fun(arr, N, a);

	return 0;
}

五:

编写程序,将数列中大于平均值的元素往前放,小于平均值的数往后放。数列输入、数列输出、数列求平均值、数列重排分别用四个子函数实现。(数列长度由用户从键盘输入)

例如:  输入数列的长度:10

输入原始数列:1  5  15  23  7  9  19  10  -5  22

其平均值为:10.6

重排以后的数列:15  23  19  22  1  5  7  9  10  -5

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void print(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{


		printf("%d ", arr[i]);
	}
	printf("\n");
}

void input(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}
}

double average(int* arr, int N)
{
	int ret = 0;
	double sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += arr[i];
	}
	return sum / N;
}

void fun(int* arr, int N)
{
	int ave = average(arr, N);
	int i = 0;
	int j = N;
	while (j > i)//当i位置的数小于平均值,j位置的值大于平均值,交换i 和j指向的值
	{
		while (arr[j] < ave)
		{
			j--;
		}
		while (arr[i] > ave)
		{
			i++;
		}
		if (j > i)
		{
			int tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
		}
	}
}

int main()
{
	printf("输入数组元素个数:");
	int N = 0;
	scanf("%d", &N);
	int* arr = (int*)malloc(sizeof(int) * N * N);
	printf("输入数组:");
	input(arr, N);
	printf("其平均值为:%.1lf\n", average(arr, N));
	fun(arr, N);
	printf("重拍之后的数组:");
	print(arr, N);
	return 0;
}

六: 

编写子函数fun,其功能是将形参数列中小于平均值且最接近平均值的数返回,main函数负责输入、输出。

例如:   输入数列的长度:10

输入数列:46、30、32、40、6、17、45、15、48、26

         数列的平均值:30.50

         小于平均值且最接近平均值的数为:30

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void print(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{


		printf("%d ", arr[i]);
	}
	printf("\n");
}

void input(int* arr, int N)
{
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &arr[i]);
	}
}

double average(int* arr, int N)
{
	double sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += arr[i];
	}
	return sum / N;
}

int fun(int* arr, int N)
{
	double ave = average(arr, N);
	double gap = 0;
	int ret = arr[0];
	for (int i = 1; i < N; i++)
	{
		gap = fabs(arr[i] - ave);
		if (gap < fabs(ret - ave))
		{
			ret = arr[i];
		}
	}

	return ret;

}

int main()
{
	printf("输入数列的长度:");
	int N = 0;
	scanf("%d", &N);
	int* arr = (int*)malloc(sizeof(int) * N * N);
	printf("输入数组:");
	input(arr, N);
	printf("平均值为:%.2lf\n", average(arr, N));
	printf("小于平均值且最接近平均值的数为:%d", fun(arr, N));
	return 0;
}

七: 

编写程序,将用户输入的字符串中从第i个到第j个之间的字符逆序颠倒。(字符串、i、j的值都由用户从键盘输入)

例如: 输入字符串:abcdefgh

       输入i:3

       输入j:7

颠倒以后的字符串为:abgfedch

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void swap(char* ch1, char* ch2)
{
	char tmp = *ch1;
	*ch1 = *ch2;
	*ch2 = tmp;
}

void reverse(char* str, int i, int j)
{
	while (i < j)
	{
		swap(&str[i], &str[j]);
		i++;
		j--;
	}
}

int main()
{
	char str[50] = {0};//长度设为50
	printf("输入字符串:");
	scanf("%s", str);//输入
	int i = 0; int j = 0;
	printf("\n输入i:");
	scanf("%d", &i);
	printf("\n输入j:");
	scanf("%d", &j);
	reverse(str,i-1,j-1);
	printf("\n颠倒以后的字符串为:%s", str);
	return 0;
}

 

 八:

编写程序,删除字符串中的某个字符。(字符串、要删除的字符都由用户从键盘输入,有则删除——所谓删除就是后序的元素往前覆盖,无则提示“该字符不存在。”)

例如:  输入原始字符串:abcebacebaghbf

        输入要删除的字符: b

删除以后的字符串:aceaceaghf

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void fun(char *str,char a)
{
	char str1[50] = "\0";
	int i = 0;
	int j = 0;
	while (str[i] != '\0')
	{
		while(str[i] == a)
		{
			i++;
		}
		str1[j] = str[i];
		i++;
		j++;
	}
	str[++j] = '\n';
	for (int i = 0; i < j; i++)
	{
		str[i] = str1[i];
	}
}

int main()
{
	printf("输入字符串:\n");
	char str[50] = "\0";
	scanf("%s", str);
	getchar();
	char a = '\0';
	printf("输入要删除的字符: ");
	scanf("%c", &a);
	fun(str,a);
	printf("删除以后的字符串:%s",str);	
	return 0;
}

九:

编写程序,将一个数字字符串转换成面值相同的整数输出。(假设全是整数,不需要考虑小数情况)

例如:  输入数字字符串:21459     (这里输入的是一个字符串,放在一个char型数组里。)

        输出整数: 21459     (这里输出的是一个int型变量)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int fun(char *str)
{
	int ret = 0;
	int i = 0;
	while (str[i] != '\0')
	{
		ret = (str[i]-'0') + ret * 10;
		i++;
	}
	return ret;
}

int main()
{
	printf(" 输入数字字符串:\n");
	char str[50] = "\0";
	scanf("%s", str);
	getchar();

	
	printf("输出整数:%d", fun(str));
	return 0;
}

 

十: 

编写程序,将一个字符串中的数字字符串转换成对应的整数输出 (假设全是整数,不需要考虑小数情况)

例如:  输入字符串:abs123efe45sefe89sef

            输出整数:123  45  89       (输出的是3个整数)

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void fun(char* str)
{
	int i = 0;
	printf("输出整数:\n");
	while (str[i] != '\0')
	{
		int ret = 0;
		int flag = 0;
		while (str[i] <= '9' && str[i] >= '0')
		{
			flag = 1;
			ret = str[i] - '0' + ret * 10;
			i++;
		}
		if (flag != 0)
		{
			printf("%d ", ret);
		}
		i++;
	}
}

int main()
{
	printf("输入字符串:\n");
	char str[50] = "\0";
	scanf("%s", str);
	getchar();
	fun(str);


	return 0;
}

取码点赞👍!

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值