C数组练习

2021-03-31 C数组

函数形参:
void array(int array[]);

查看超出定义部分的参数值

#include<stdio.h>
int main(){
	int array5[3]={1,2,3,4,5};
	printf("array5:%d,%d,sizeof:%d\n",array5[0],array5[5],\
			sizeof(array5));
}

//array5:1,-1225781248,sizeof:12

题1:数组输入输出

#include<stdio.h>
#define LEN 10

void input(int [],int len);
void output(int *,int len);

int main(){
	int array[LEN]={0};
	printf("请输入%d个数",LEN);
	input(array,LEN);
	output(array,LEN);
}

void input(int arr[],int len)
{
	int i;
	for(i=0;i<len;i++){
		//printf("请输入第%d个数字:",i);
		if(scanf("%d",&arr[i])!=1){ 
			printf("not an int\n");
			getchar(); //去掉不合规字符防止无限循环
			i--;
		}//判断输入是否为整数
	}
}

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

/*
请输入10个数:a b c d 1 2 3 4 5 6 7 8 9 0 11 12
not an int
not an int
not an int
not an int
1 2 3 4 5 6 7 8 9 0 
*/

题2:函数输出 输入中仅出现一次的数字

void adj(int arr[],int len)
{
	int i,j,flag;
	for(i=0;i<len;i++){
		flag=0;
		for(j=i;j<len;j++){
		if(arr[j]==arr[i])flag++;
		}
		if(flag==1)printf("%d ",arr[i]);
	}
	printf("\n");
}


题3:数组排序输出,冒泡和选择排序

#include<stdio.h>
#define LEN 10

void swap(int *p1,int *p2);
void out(int*,int len);
void input(int*,int len);
void bubble(int a[],int len);
void select(int a[],int len);

int main(void){
	int arr1[LEN]={0};
	int arr2[LEN]={0};

	printf("请输入%d个数字:",LEN);
	input(arr1,LEN);
	printf("输入的数组为:");
	out(arr1,LEN);
	
	printf("冒泡排序输出为:");
	bubble(arr1,LEN);
	out(arr1,LEN);
	
	printf("\n");
	while(getchar()!='\n');
	printf("请输入%d个数字:",LEN);
	input(arr2,LEN);
	printf("输入的数组为:");
	out(arr2,LEN);
	
	printf("选择排序输出为:");
	select(arr2,LEN);
	out(arr2,LEN);
	
	return 0;
	
}

void out(int a[],int len){
	int i;
	for(i=0;i<len;i++)printf("%d ",a[i]);
	putchar('\n');
}
void input(int a[],int len){
	int i;
	for(i=0;i<len;i++){
		if(scanf("%d",&a[i])!=1){
			getchar();
			i--;
		}
	}putchar('\n');
}

void select(int a[],int len){
	int i,j,pos;
	for(i=0;i<len-1;i++){
		pos=i;
		for(j=i+1;j<len;j++){
			if(a[pos]<a[j])pos=j;
		}
		if(pos!=i)swap(&a[i],&a[pos]);
	}
}
void bubble(int a[],int len){
	int x,y;
	for(y=0;y<len-1;y++){
		for(x=0;x<len-1-y;x++){
			if(a[x]<a[x+1])swap(&a[x],&a[x+1]);
		}
	}
}
void swap(int *p1,int *p2){
	int temp;
	temp=*p1;*p1=*p2;*p2=temp;

}

题4:输入数组,然后删除给定数

  • 第一种方法:将后面的值覆盖需要删除的那个数,并且长度减1
#include<stdio.h>
#define LEN 10
int dele(int*,int len,int dele_num);
void out(int*,int len);
void input(int*,int len);
int main(void){
	int arr[LEN]={0};
	int dele_num,dele_len;
	printf("请输入%d个数字:",LEN);
	input(arr,LEN);
	printf("输入的数组为:\n");
	out(arr,LEN);
	
	while(getchar()!='\n');
	printf("需要删除的数为:\n");
	scanf("%d",&dele_num);

	dele_len=dele(arr,LEN,dele_num);
	if(dele_len==LEN){printf("该数不存在数组中!\n");return 0;}
	printf("删除后输出为:\n");
	out(arr,dele_len);

	return 0;
}
int dele(int a[],int len,int num){
	int i=0,j=0,not_del=LEN;
	for(i=0;i<len;i++){
	while((a[i]==num)&&(len-i)){ //(len-i)为了防止重复读取最后一个数进入死循环
			len--;
			for(j=i;j<len;j++)a[j]=a[j+1];
		}//删除等于将后面的值覆盖需要删除的那个数,并且长度减1
	}
	return len;
}
void out(int a[],int len){
	int i;
	for(i=0;i<len;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
}
void input(int a[],int len){
	int i;
	for(i=0;i<len;i++){
		if(scanf("%d",&a[i])!=1){
			getchar();
			i--;
	putchar('\n');
}}}

  • 第二种方法:指针运算
#include<stdio.h>
#define LEN 10

int dele(int*newarr,int*oldarr,int len,int dele_num);
void out(int*,int len);
void input(int*,int len);

int main(void){
	int arr[LEN]={0};
	int arr2[LEN]={0};
	int dele_num,dele_len;

	printf("请输入%d个数字:",LEN);
	input(arr,LEN);
	printf("输入的数组为:\n");
	out(arr,LEN);
	
	while(getchar()!='\n');//删除多余数字,防止后面scanf误读
	while(1){
		printf("需要删除的数为:\n");
		scanf("%d",&dele_num);
		dele_len=dele(arr2,arr,LEN,dele_num);
		if(dele_len==LEN){printf("删除失败!该数不在数组中!\n");continue;}
		printf("删除后输出为:\n");
		out(arr2,dele_len);
		return 0;
	}//遇到错误循环输入
}
int dele(int *p,int a[],int len,int num){
/*使用指针,将需要删除的数以外的数复制给另一个新的数组*/
	int i=0,len1=0;
	for(i=0;i<len;i++){
	if(a[i]!=num){*p++=a[i];len1++;}
	}
	return len1;
}
void out(int a[],int len){
	int i;
	for(i=0;i<len;i++)printf("%d ",a[i]);
	printf("\n");
}
void input(int a[],int len){
	int i;
	for(i=0;i<len;i++){
		if(scanf("%d",&a[i])!=1){
			getchar();
			i--;
		}
	}putchar('\n');//在末尾添加符号,为删除多余数字准备
}



/*
请输入10个数字:1 a b 2 3 4 5 6 7 8 9 10 11 12 13 14

输入的数组为:
1 2 3 4 5 6 7 8 9 10 
需要删除的数为:
12
删除失败!该数不在数组中!
需要删除的数为:
10
删除后输出为:
1 2 3 4 5 6 7 8 9 
*/

题5:输出k个比整数m大的素数

#include<stdio.h>
#define LEN 30

int sushu(int);
void out(int*,int len);
void printPrime(int m,int k,int a[]);//

int main(void){
	int m,k,error;
	int arr[LEN]={0};
	
	while(1){
		error=0;
		printf("请输入一个整数和大于它的素数的个数(不超过%d):",LEN);
		if(scanf("%d%d",&m,&k)!=2){printf("input error\n");error=1;}
		else if(k>LEN){printf("超出限定个数!请重试\n");error=1;}
		if(error){while(getchar()!='\n');continue;}
		else break;}
		
	printPrime(m,k,arr);
	printf("大于%d的%d个素数为:\t",m,k);
	out(arr,k);
	return 0;
}
void printPrime(int m,int k,int a[]){
	/*将k个大于m的素数进入数组并输出*/
	int i,count=0;
	for(i=m+1;count<k;i++){
		if(sushu(i)){
			a[count]=i;
			count++;
}}}	
void out(int a[],int len){
	int i;
	for(i=0;i<len;i++)printf("%d ",a[i]);
	printf("\n");
}
int sushu(int n){
	int i;
	for(i=2;i<=n/2;i++)if(n%i==0)return 0;
	return n;
}

/*
请输入一个整数和大于它的素数的个数(不超过30):a a
input error
请输入一个整数和大于它的素数的个数(不超过30):1 31
超出限定个数!请重试
请输入一个整数和大于它的素数的个数(不超过30):1 10
大于1的10个素数为:	2 3 5 7 11 13 17 19 23 29 
*/

题6:数组的增删改查

#include <stdio.h>

/*输出函数*/
void output(int a[],int len){
	int i;
	printf("数组为:");
	for(i=0;i<len;i++)printf("%d ",a[i]);
	printf("\n");
}

/*输入函数*/
void input(int a[],int len){
	int i;
	//printf("请输入%d个数字:",len);
	for(i=0;i<len;i++){
		printf("请输入第%d个数字:",i);
		if(scanf("%d",&a[i])!=1||a[i]==0){
			while(getchar()!='\n');
			printf("请重新输入:");
			i--;
		}
	}
}

/*增加元素
 * 返回:长度
 * */
int insert(int a[],int len){
	int data;
	printf("请输入要增加的数:");
	scanf("%d",&data);
	int i;
	for(i=0;i<len;i++){
		if(a[i]==0){
			a[i]=data;
			i++;
			break;
			}
	}if(i==len)printf("添加失败!\n");
	return i;
}

/*删除元素
 * 返回:长度
 * 删除:将后面的值覆盖需要删除的那个数,并且长度减1
 * */
#if 0
int dele(int a[],int len){
	
	int data;
	printf("请输入要删除的数:");
	scanf("%d",&data);
	
	int i=0,j=0,not_del=len;
	for(;i<len;i++){
	while(a[i]==data){ 
			for(j=i;j<len-1;j++)a[j]=a[j+1];
			a[j]=0;//最后一项清0
			len--; //长度减1
		}//删除等于将后面的值覆盖需要删除的那个数,并且长度减1
	}
	if(len==not_del)printf("添加失败!\n");//判断有没有做删除,否则该数不存在
	return len; 
}
#endif
#if 1
int dele(int a[],int len){
	
	int data;
	printf("请输入要删除的数:");
	scanf("%d",&data);
	
	int i=0,j=0,not_del=len;
	for(;i<len;i++){
	if(a[i]==data){ //len-i 为了防止重复读取最后一个数进入死循环
			for(j=i;j<len-1;j++)a[j]=a[j+1];
			a[j]=0; //最后一项清0
			i--;    //防止相邻两个数重复
			len--;	//长度减1
		}
	}
	if(len==not_del)printf("添加失败!\n");//判断有没有做删除,否则该数不存在
	return len; 
}
#endif

/*修改元素*/
void update(int a[],int len){
	
	int index,data;
	
	while(1){
		printf("请输入要修改数的下标和修改值:");
		scanf("%d%d",&index,&data);
		if(index>=len){printf("index>len error!");continue;}
		a[index]=data;
		break;
	}
	return;
}

/*查找元素
 * 返回下标值
 * */
int find(int a[],int len){
	
	int data,i;
	
	while(1){
		printf("请输入要查找的数:");
		scanf("%d",&data);
		
		for(i=0;i<len;i++){
			if(a[i]==data){
				printf("该数的下标为:%d \n",i);
				return i;
				break;
			}
		}
		printf("未查到%d,查找失败",data);continue;
	}
	return -1; //返回错误标志
}

#include <stdio.h>
#include "array_func.h"
#define MAX_SIZE 100
#define LEN 5

int main(int argc, char **argv)
{	
	int len;
	int arr[100]={0};
	
	input(arr,LEN);
	
	output(arr,LEN);
	
	len=insert(arr,MAX_SIZE);
	output(arr,len);
	
	len=dele(arr,len);
	output(arr,len);
	
	update(arr,len);
	output(arr,len);
	
	find(arr,len);
	
	return 0;
}

/*
请输入第0个数字:1
请输入第1个数字:2
请输入第2个数字:3
请输入第3个数字:4
请输入第4个数字:5
数组为:1 2 3 4 5 
请输入要增加的数:11
数组为:1 2 3 4 5 11 
请输入要删除的数:11
数组为:1 2 3 4 5 
请输入要修改数的下标和修改值:0 6
数组为:6 2 3 4 5 
请输入要查找的数:5
该数的下标为:4 

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值