高级语言第六章,数组二

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]);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值