C语言-一维数组

Tips:

  1. int a[10]; 定义数组,指定数组包含10个元素

  1. t=[6]; 引用a数组中序号为6的元素

  1. 比较大的数组要定义在函数外面,const int N =1e6+5;int a[N];

例一:对10个数组元素依次赋值0,1,2,3,4,5,6,7,8,9,要求按逆序输出

#include <stdio.h>
int main()
{
    int a[10];//定义数组
    for(int i=0;i<=9;i++){//对数组元素a[0]~a[9]赋值
        a[i]=i;}
//或者这样    int a[10]={0,1,2,3,4,5,6,7,8,9};
    for(int i=9;i>=0;i--)//输出a[9]~a[0]共10个数组元素
    {
        printf("%d ",a[i]);
    }
    return 0;
    
}
例二:输入10个整数存入一维数组,再按逆序重新存放后再输出


#include<stdio.h>
int main()
{
    int a[10];//定义数组
    for(int i=0;i<=9;i++)
{
    scanf("%d",&a[i]);//对数组赋值
}
for(int i=0;i<=4;i++)
{
    int t=a[i];//通过变量t实现a[i]和a[9-i]交换
    a[i]=a[9-i];
    a[9-i] = t;
}
for(int i=0;i<10;i++)//输出a[0]~a[0]十个数组元素
{
    printf("%d ",a[i]);
    
}
return 0;

}
例三:输入n个整数,逆序输出

#include <stdio.h>
int main()
{
    int a[105],n=0;//有时难以精确计算所需要的数组大小,数组声明应该稍大一些
    while(~scanf("%d",&a[n])){
        n++;//用这种方式可以知道数组中元素个数
    }
    for(int i=n-1;i>=0;i--)//实现a[i]到a[0]输出
    {
        printf("%d ",a[i]);
    }
    return 0;
}

👆这样写是错的,想知道个数就得先scanf a[0],而输入数据又需要使用循环(用到n)

*例四*:输入一组数据,判断有无重复,有则输出“Yes”,没有则输出“No”

输入:1 2 3 1

输出:1 2 3


#include <stdio.h>
int main()
{
 int n,a[1005];
 scanf("%d",&n);
 int f=0;
 for(int i=0;i<n;i++){
  scanf("%d",&a[i]);
  for(int i=0;i<n-1;i++){
   for(int j=1;j<n;j++){
   if(a[j]==a[i]){
    f=1;
    break;
   }
  }
 
  }
     
 }
 if(f==0){
      printf("No");
  }
  else{
   printf("Yes");
  }

return 0;
}

原来是👆这样写的 两个错误 一是应该当数据全部输入结束再进行比较(第一个for循环的后一个花括号位置放错了

二是j的初始条件写错了 int j=1的话 当i的值变成了1时 a[i]和a[j]一定相等

应该是和a[i]后一个数字比较 int j= i+1;


#include <stdio.h>
int main()
{
    int n,a[1005];
    scanf("%d",&n);
    int f=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);}
        for(int i=0;i<n-1;i++){
            for(int j=1+i;j<n;j++){
            if(a[j]==a[i]){
                f=1;
                break;
            }
        }
    
        }
        
    
    if(f==0){
            printf("No");
        }
        else{
            printf("Yes");
        }

return 0;
}

查找和排序

(一)查找:

例四:输入一组数据(整数,不多于20个),查找指定的数据项是否存在。

输入:2(个数)1 2 2(最后一个是指定数据项)

输出:Yes


#include<stdio.h>
int main()
{
    int n,a[25],s,i;
    scanf("%d",&n);
    for(i=0;i<=n-1;i++)
    {
        scanf("%d",&a[i]);
    }
    int x;
     scanf("%d",&x);
     int f =0;//为假
     for(int i=0;i<=n-1;i++)//一定要有这一步  才能使x一个一个比对过去
     {
         if(x==a[i])
     {
         f=1;break; }//一定要break 查找到了就不要继续下去了!!!!!!!
}
printf(f?"Yes":"No");//f是否为真

    
     
    return 0;    
}

最后一步不能像下面这样写


 for(i=0;i<=n-1;i++)
     {
         if(x==a[i])
     {
         printf("Yes");
         break; }
         
    else{
        printf("No");//这样写的话 每次查找不到就会输出一个no
    }    

(二)排序:

题目:给4,2,8,5,7,1按从小到大排序输出

  1. 选择排序

举例: 2 3 5 1 6 4

第一次:1 3 5 2 6 4

第二次:1 2 5 3 6 4(而不是1 2 3 5 6 4

第一个数跟后面所有的数比,最小的放在第一个。第二个再跟后面所有的数比,最小的放在第二个。

👇输出最小数的序号


#include <stdio.h>
int main()
{
    int a[]={4,2,8,5,7,1};
    int n= sizeof a / sizeof a[0];//计算数据个数
    int m= 0,i;
    for(i=0;i<n;i++)
    {
         if (a[m]>a[i])//最小的放在初始位置
        {
            m=i;
        }
    }
    printf("%d",m);
}

看n个数,k趟选择排序后的结果:


#include <stdio.h>
int main()
{
    int i,n,k,a[1005];
    scanf("%d %d",&n,&k);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<k;i++)//k趟选择排序
    {
        int m = i;//m记录最小值的下标
        //未排序的数[i+1,n)查找最小值
        for(int j=i+1;j<n;j++)
        {
            if (a[j]<a[m])
            {
                m=j;
            }
        }
        //交换a[m]和a[i]
        if(m!=i)/逆序情况
            {
                 int t=a[m];
                 a[m]=a[i];
                  a[i]=t;    
            }
        }
    
    for(i=0;i<n-1;i++)
    {
        printf("%d ",a[i]);
    }
    if(i==n-1)
    {
        printf("%d",a[i]);
    }

    
    return 0;
}  

完整代码(绝对值比较,并且输入0时数据输入结束)


#include <stdio.h>
#include <math.h>
int main()
{
    int i,n,a[1005];
    while(~scanf("%d",&n)&&n!=0){    
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);}
    for(int i=0;i<n-1;i++){//一定要注意 这里面i的范围 不能和上一步放在一起写!!
    //因为第一个数和后面所有数字比较之后再下一步 一共只需要比较n-1次就够了
        int m=i;
        for(int j=i+1;j<n;j++){
            if(abs(a[m])<abs(a[j])){
                m=j;
            }
        }
        if(m!=i){
            int t=a[i];
            a[i]=a[m];
            a[m]=t;
        }
    }
    
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    
    printf("\n");
}
    return 0;
}

如果是要求输出每趟排序并且排序完成即结束循环

如:

#include <stdio.h>
int main()
{
    int n,a[105];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n-1;i++){
        int m=i;
        for(int j=i+1;j<n;j++){
            if(a[m]>a[j]){
                m=j;
            }
        }
        if(m!=i){
            int t=a[m];
            a[m]=a[i];
            a[i]=t;
        }
        else{
            continue;
        }
        for(int k=0;k<n-1;k++){
            printf("%d ",a[k]);
        }
        printf("%d\n",a[n-1]);
        
    }
return 0;
    }
  1. 冒泡排序

第一个数和第二个数比较,若逆序则交换;(前面的数字交换了以后再与下一个数比较,逆序则交换,直到最大的数到了最后一个位置。 例:4 2 8 5 7 1

比较次数👇 (n-1-i) i初始值为0

第一次:2 4 5 7 1 8      6-1-0次

第二次:2 4 5 1 7 8      6-1-1次

第三次:2 4 1 5 7 8

第四次:2 1 4 5 7 8

第五次:1 2 4 5 7 8


#include<stdio.h>
int main()
{
    int a[]={4,2,8,5,7,1};
    int n = sizeof a /sizeof a[0];
    int i;
    for(i=0;i<n-1;i++)//只需要排列n-1次 (因为i是从0开始的 所以是<而不是<=
    {
        for(int j=0;j<n-1-i;j++)
        
        if(a[j]>a[j+1])
        {
            int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
        }
    
    for(i=0;i<n;i++)
    {    
        printf("%d ",a[i]);
    }
}

在两两交换过程中可能已经排好序了,如何优化呢?

(第二行


for(i=0;i<n-1;i++)//只需要排列n-1次 (因为i是从0开始的 所以是<而不是<=
    {
        int f=0;//作为交换标记
        for(int j=0;j<n-1-i;j++)
        
        if(a[j]>a[j+1])
        {
            int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
            f=1;//说明数据已经换好了
        }
    if(f==0) break;//上一步if不成立 f数值不改变
    
    }

如果要求输出每趟并且排序完立刻结束:


#include <stdio.h>
int main()
{
	int n, a[105];
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	
	for (int i = 0; i < n - 1; i++) {
		int f = 0;
		for (int j = 0; j < n - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				int t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
				f = 1;
			}
		else{
			continue;
		} 	
		}
		
		if(f==0) 
		{
			break;
		}
		for (int k = 0; k < n - 1; k++) {
			printf("%d ", a[k]);
			
		}printf("%d\n", a[n - 1]);
		
		
	}
	return 0;
}

如果是n个数排序呢?


#include <stdio.h>
int main()
{
    int i,n=0,a[105];
    while(~scanf("%d",&a[n])){
        n++;//*****very important//主要是这一步 
    }
    for(i=0;i<n-1;i++){
        int f=0;
        for(int j=0;j<n-i-1;j++){ 
            if(a[j]<a[j+1]){
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
                f=1;
            }
        }
        if(f==0)break;
    }
    
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

右图中的错误就是 没有给i初始值 这样系统会随机给初始值

可以看出循环k次时的数据 (中间输出)


#include <stdio.h>
int main()
{
    int i,n,k,a[1005];
    scanf("%d %d",&n,&k);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=1;i<=k;i++){
        for(int j=0;j<n-i;j++)//
        { 
            if(a[j]>a[j+1])//漏写了这一步!!!!!
            {
                int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
            }
            
        }
    }
    for(i=0;i<n-1;i++)
    {
        printf("%d ",a[i]);
    }
    if(i==n-1)
    {
        printf("%d",a[i]);
    }
    return 0;
}

例五:绝对值排序

要求:输入数据有多组,每组的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,所有的数的绝对值都不相等。


#include <stdio.h>
#include <math.h>
int main()
{
    int a[105],n,i;
    while(~scanf("%d",&n)&&n!=0){//注意这个花括号从哪到哪
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);}
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
                if(abs(a[j])<abs(a[j+1])){//直接在这里用abs函数就OK了 不用之前int 一个m
                    int t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
    
    for (i=0;i<n;i++){
        printf("%d ",a[i]);
        }
        printf("\n");
    }    
        return 0;
            
}

例六:排两列

将一组数据按奇偶分两行输出 如图所示

会发现使用一个数组很难实现先输出奇数行 再换行 再输出偶数行


#include<stdio.h>
int main()
{
    int a[105],n,m=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        if(i%2==1){
            printf("%d ",x);//第奇数个直接输出
        }
        else{
            //第偶数个数输出时 从a[0]开始 第二个数是a[0]第四个数是a[1]
            a[m]=x;
            m++;
        }
    }
    printf("\n");
    for(int i=0;i<m;i++){//注意这里i的范围是小于m而不是n
        printf("%d ",a[i]);
    }
    return 0;
}

例七:结伴出行

输入偶数个数字 第一个和最后一个一起输出 第二个和倒数第二个一起输出


#include<stdio.h>
int main()
{
    int n,a[55],i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
        
    //2.双指针i从前到后 j从后到前
    for(int i=0,j=n-1;i<j;i++,j--){
        printf("%d %d\n",a[i],a[j]);
    }
    return 0;
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值