1.实现strlen,strcpy,strcmp函数
#include <stdio.h>
int strlen(char *str) {
int i=0;
while(str[i]!='\0')
i++;
return i;
}
void strcpy(char *str,char *flag) {
int i=0;
while(str[i]!='\0') {
flag[i]=str[i];
i++;
}
falg[i]='\0';
}
int strcmp(char *str,char *flag) {
int i=0;
while(str[i]!='\0'&&flag[i]!='\0') {
if(str[i]>flag[i])
return 1;
else if(str[i]<flag[i])
return -1;
else
i++;
}
if(str[i]=='\0'&&flag[i]=='\0')
return 0;
else if(str[i]=='\0')
return -1;
else
return 1;
}
int main() {
char str[100];
char flag[100];
scanf("%s",&str);
printf("%d\n",strlen(str));
strcpy(str,flag);
printf("%s\n",flag);
printf("%d\n",strcmp(str,flag));
}
2.编写函数,对n个字符串按字典顺序排序,限定函数名void sort(char st[][10],int n)
#include <stdio.h>
int strcmp(char *str,char *flag) {
int i=0;
while(str[i]!='\0'&&flag[i]!='\0') {
if(str[i]>flag[i])
return 1;
else if(str[i]<flag[i])
return -1;
else
i++;
}
if(str[i]=='\0'&&flag[i]=='\0')
return 0;
else if(str[i]=='\0')
return -1;
else
return 1;
}
void strcpy(char *flag,char *str) {
int i=0;
while(str[i]!='\0') {
flag[i]=str[i];
i++;
}
flag[i]='\0';
}
void sort(char st[][10], int n) {
char temp[10];
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n-i-1; j++)
if (strcmp(st[j], st[j+1]) > 0) {
strcpy(temp, st[j]);
strcpy(st[j], st[j+1]);
strcpy(st[j+1], temp);
}
}
int main() {
char st[][10] = {"hello", "world", "python", "C", "java", "R"};
int n = 6;
sort(st, n);
for (int i = 0; i < n; i++)
printf("%s ", st[i]);
printf("\n");
return 0;
}
3.设有N个非负数存放于一维数组中,要求将其中的0移动到后面,非0的数保持原次序
#include <stdio.h>
#define N 7
int main() {
int list[10] = {1, 0, 0, 5, 4, 0, 16};
int j = 1;
for (int i = 0; i < N; i++) {
if (list[i] == 0) {
while (list[j] == 0 && j < N) {
j++;
}
if (j < N) {
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
for (int i = 0; i < N; i++)
printf("%d ", list[i]);
return 0;
}
4.编写一个函数,从给定的向量A中删除元素值在x到y之间的所有元素
#include <stdio.h>
int del(int A[],int n,int x,int y) {
int count=0;
for(int i=0; i<n; i++)
if(A[i] >= x && A[i] <= y) {
for (int j = i; j < n - 1; j++)
A[j] = A[j + 1];
count++;
i--;
}
return count;
}
int main() {
int list[10] = {1, 0, 0, 5, 4, 0, 16};
int count = del(list,7,0,1);
for (int i = 0; i < 7-count; i++)
printf("%d ", list[i]);
return 0;
}
5.编写函数把整数数组中值相同的元素删除的只剩一个,并把剩余元素全部转移到前面
#include <stdio.h>
int del(int A[], int n) {
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (A[i] == A[j]) {
for (int k = j; k < n - 1; k++)
A[k] = A[k + 1];
j--;
n--;
}
return n;
}
int main() {
int list[10] = {1, 0, 0, 5, 4, 0, 16};
int count = del(list,7);
for (int i = 0; i < count; i++)
printf("%d ", list[i]);
return 0;
}
6.二维数组A的每行的最大元素构成向量B,每列的最小元素构成向量C,求B*C
#include <stdio.h>
int getnum(int arr[10][10]) {
int a[10] = {0};
int b[10] = {0};
int sum=0;
for (int i = 0; i < 10; i++) {
int max = 0;
int min = 999;
for (int j = 0; j < 10; j++) {
if (arr[i][j] > max)
max = arr[i][j];
if (arr[j][i] < min)
min = arr[j][i];
}
a[i] = max;
b[i] = min;
}
for(int i=0; i<10; i++)
sum+=a[i]*b[i];
return sum;
}
int main() {
int arr[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
arr[i][j] = rand() % 100;
printf("%d ",arr[i][j]);
}
printf("\n");
}
printf("%d",getnum(arr));
return 0;
}
7.编写函数,判断给定的整数数组a[n]中是否含有元素a[i],等于其前边的所有元素之和,即a[i]=a[0]+a[1]+...+a[i-1]
#include <stdio.h>
int findnum(int *arr,int n) {
for(int i=0; i<n; i++) {
int sum=0;
for(int j=0; j<i; j++) {
sum+=arr[j];
}
if(arr[i]==sum)
return 1;
}
return 0;
}
int main() {
int arr[10] = {1,2,1,1,1,6,6,7};
findnum(arr,8);
printf("%d",findnum(arr,8));
return 0;
}
8.编写函数int delarr(int a[],int n),删除n个元素的正整型数组a中所有素数,要求:
数组a中剩余元素保持原来的次序
将处理后的数组输出
函数返回剩余元素的个数
不能定义额外的新数组
#include <stdio.h>
#include <math.h>
int isprime(int n) {
if(n==1)
return 0;
for(int i=2; i<sqrt(n); i++)
if(n%i==0)
return 0;
return 1;
}
int del(int *arr,int n) {
int k=0;
for(int i=0; i<n; i++)
if(!isprime(arr[i]))
arr[k++]=arr[i];
return k;
}
int main() {
int arr[10] = {1,2,1,1,1,6,6,7};
int count = del(arr,8);
for(int i=0; i<count; i++)
printf("%d ",arr[i]);
return 0;
}
9.编写函数,对一个给定字符串中的所有字符,不考虑默认结束符’0‘,进行排序,使得排序后的字符串满足从左到右为ASCII码递增的字符串序列
#include <stdio.h>
void sort(char *arr,int n) {
for(int i=0; i<n-1; i++)
for(int j=0; j<n-1-i; j++)
if(arr[j]>arr[j+1]) {
char temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
int main() {
char arr[10] = {'a','p','o','i','u','n','d','s'};
sort(arr,8);
for(int i=0; i<8; i++)
printf("%c ",arr[i]);
return 0;
}
10.编写函数int mergearr(int a[],int m,int b[],int n),将两个严格增序数组a和b合并后存储在a中,并保证处理后的数组仍然严格增序,函数值返回合并后数组a中元素个数,不能定义额外的新数组
#include <stdio.h>
void sort(int *arr,int n) {
for(int i=0; i<n-1; i++)
for(int j=0; j<n-1-i; j++)
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
int merge(int a[], int m, int b[], int n) {
int count = 0;
for (int i = 0; i < n; i++) {
int found = 0;
for (int j = 0; j < m; j++)
if (b[i] == a[j]) {
found = 1;
break;
}
if (!found) {
a[m + count] = b[i];
count++;
}
}
sort(a, m + count);
return m + count;
}
int main() {
int arr1[20] = {1,3,5,7,9};
int arr2[20] = {1,3,4,6,8,10};
int count = merge(arr1,5,arr2,6);
for(int i=0; i<count; i++)
printf("%d ",arr1[i]);
return 0;
}
11.使用数组精确计算M/N的各小数位的值,如果M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置
#include <stdio.h>
int main() {
int a[100],b[100];
int m,n,i=0,s=0;
scanf("%d",&m);
scanf("%d",&n);
if(m>n){
s=m/n;
m=m%n;
}
while(m!=0){
m=m*10;
a[i]=m/n;
m=m%n;
b[i]=m;
for(int h=0;h<i;h++)
if(b[h]==m){
printf("begin from %d to %d over\n",h+1,i);
m=0;
break;
}
i++;
}
printf("%d.",s);
for(int j=0;j<i;j++)
printf("%d",a[j]);
return 0;
}
12.已知长度为n的线性表A采用顺序存储结构,写一个算法,删除该线性表中所有值为item的数据元素
#include <stdio.h>
int del(int *arr,int n,int item) {
int k=0;
for(int i=0; i<n; i++)
if(arr[i]!=item)
arr[k++]=arr[i];
return k;
}
int main() {
int arr[10] = {1,2,1,1,1,6,6,7};
int count = del(arr,8,1);
for(int i=0; i<count; i++)
printf("%d ",arr[i]);
return 0;
}
13.求一个3*3的整型矩阵对角线元素之和
#include <stdio.h>
int sum(int arr[3][3]){
int sum=0;
for(int i=0;i<3;i++)
sum+=arr[i][i];
return sum;
}
int main() {
int arr[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
scanf("%d",&arr[i][j]);
int sumc = sum(arr);
printf("%d ",sumc);
return 0;
}
14.螺旋矩阵是整数的一种排列方式,例如5*5的螺旋矩阵如下,请编写10*10的螺旋矩阵
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main() {
int a[10][10]= {0};
int nums=1;
for(int i=0; i<=N/2; i++) {
for(int j=i; j<=N-i-1; j++)
a[i][j]=nums++;
for(int k=i+1; k<N-i-1; k++)
a[k][N-i-1]=nums++;
for(int j=N-i-1; j>i; j--)
a[N-i-1][j]=nums++;
for(int k=N-i-1; k>i; k--)
a[k][i]=nums++;
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
15.排序问题,给定一个10*10的矩阵a,编写程序,对a进行排序,要求
a[i1][j1]<a[i2][j2],若j1<j2,a[i1][j1]<=a[i2][j2],若i1<i2
#include <stdio.h>
void sort(int *arr,int n) {
for(int i=0; i<n-1; i++)
for(int j=0; j<n-1-i; j++)
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
int main() {
int arr[10][10];
int list[1000];
int k=0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
arr[i][j] = rand() % 100;
printf("%d ",arr[i][j]);
list[k++] = arr[i][j];
}
printf("\n");
}
sort(list,100);
for(int i=0; i<100; i++)
printf("%d",list[i]);
}