一:
求一个N×N矩阵主、次对角线上所有元素之和。矩阵输入、矩阵输出、矩阵对角线求和分别用三个子函数实现。(N的值由用户从键盘输入)
cpp
#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
数列输入、数列输出、数列右移分别用三个子函数实现。(数列的个数由用户从键盘输入)
cpp
#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
cpp
#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
cpp
#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
cpp
#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
cpp
#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
cpp
#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
cpp
#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型变量)
cpp
#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个整数)
cpp
#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;
}