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 
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个整数存入一维数组,再按逆序重新存放后再输出
C语言-一维数组_第1张图片


#include
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 
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;
}
C语言-一维数组_第2张图片

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

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

输入:1 2 3 1

输出:1 2 3


#include 
int main()
{
 int n,a[1005];
 scanf("%d",&n);
 int f=0;
 for(int i=0;i

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

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

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


#include 
int main()
{
    int n,a[1005];
    scanf("%d",&n);
    int f=0;
    for(int i=0;i

查找和排序

(一)查找:

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

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

输出:Yes


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

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


#include 
int main()
{
    int i,n,k,a[1005];
    scanf("%d %d",&n,&k);
    for(i=0;i

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


#include 
#include 
int main()
{
    int i,n,a[1005];
    while(~scanf("%d",&n)&&n!=0){    
    for(int i=0;i

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

如:C语言-一维数组_第3张图片

#include 
int main()
{
    int n,a[105];
    scanf("%d",&n);
    for(int i=0;ia[j]){
                m=j;
            }
        }
        if(m!=i){
            int t=a[m];
            a[m]=a[i];
            a[i]=t;
        }
        else{
            continue;
        }
        for(int k=0;k
  1. 冒泡排序
C语言-一维数组_第4张图片

第一个数和第二个数比较,若逆序则交换;(前面的数字交换了以后再与下一个数比较,逆序则交换,直到最大的数到了最后一个位置。 例: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
int main()
{
    int a[]={4,2,8,5,7,1};
    int n = sizeof a /sizeof a[0];
    int i;
    for(i=0;ia[j+1])
        {
            int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
        }
    
    for(i=0;i

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

(第二行


for(i=0;ia[j+1])
        {
            int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
            f=1;//说明数据已经换好了
        }
    if(f==0) break;//上一步if不成立 f数值不改变
    
    }

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

C语言-一维数组_第5张图片


#include 
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 
int main()
{
    int i,n=0,a[105];
    while(~scanf("%d",&a[n])){
        n++;//*****very important//主要是这一步 
    }
    for(i=0;i
C语言-一维数组_第6张图片

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

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


#include 
int main()
{
    int i,n,k,a[1005];
    scanf("%d %d",&n,&k);
    for(i=0;ia[j+1])//漏写了这一步!!!!!
            {
                int t=a[j];
            a[j]=a[j+1];
            a[1+j]=t;
            }
            
        }
    }
    for(i=0;i

例五:绝对值排序

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


#include 
#include 
int main()
{
    int a[105],n,i;
    while(~scanf("%d",&n)&&n!=0){//注意这个花括号从哪到哪
        for(i=0;i

例六:排两列

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

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

C语言-一维数组_第7张图片

#include
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

例七:结伴出行

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

C语言-一维数组_第8张图片

#include
int main()
{
    int n,a[55],i;
    scanf("%d",&n);
    for(i=0;i

你可能感兴趣的:(C语言,c语言)