学习笔记-C语言2(一维数组与函数初步)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010420283/article/details/83450691

小贴士:

变量名在运行时候不占用内存,在编译的时候要占用内存(编译器要理解字符串文本,需要存储占用内存;翻译成机器码之后是对内存的操作,变量名代表的是一个地址了,就不占内存)

1. 数组的初始化

注:如果声明了数组后,最好先给赋个初值,否则系统会给这个数组随机分配数值。

#include <stdio.h>
int value[5]; #声明一个含5个元素的数组
int main(){
    int i;
    //方法1
    double value[5]={1.1,2.35,6.0,7.8,9.2};//直接赋初值
    //方法2
    double value[5]={1.1,2.35,6.0};//给前3个赋初值,后面的自动赋值为0
    //方法3     
    double value[5]={0};//直接给数组的所有元素赋值为0

    //打印输出
    for(i=0;i<5;i++){
        printf("%2lf",value[i]);
    }
    printf("\n");
    return 0;
}

2. 最长平台问题

给定一个长度为n的数组,数组中连续相等的元素构成的子序列成为平台,求出数组中最长平台的长度。如数组为{1 1 2 2 4 5 7 7 7 7 7 3 3 9},输出:5

求解思路:

  • 从头到尾遍历数组,找出最长的连续相同元素组成的平台。
  • 遍历过程要记录的数据:1)current_length:遍历数组时,记录当前元素为结尾的连续的相同元素组成的平台长度;2)max_length:遍历数组时,记录遍历到当前元素时最长的平台长度。
  • 核心算法:

        使用变量 i 从头至尾遍历数组

        如果当前数组元素array[i]==array[i-1]:

        current_length++;

        否则:

        current_length=1;#以当前元素为结尾成为一个新的平台

  • 边界条件

        从数组的第二个元素开始遍历,初始时current_length=1;max_length=1;

代码实现:

#include<stdio.h>
#define MAX_ARRAY_LEN 1000

int main(){
	int array[MAX_ARRAY_LEN]={0};
	int n;
	int current_length=1;
	int max_length=1;
	int i;
	scanf("%d",&n);
	for (i=0;i<n;i++){
		scanf("%d",&array[i]);
	}
	for (i=1;i<n;i++){
		if (array[i]=array[i-1]){
			current_length++;
		}
		else{
			current_length=1;
		}
		if(current_length>max_length){
			max_length=current_length;
		}
			
	}
	printf("%d\n",max_length);
	return 0; 
}

3. 基于交换的排序

给定一个长度为n的整数数组,对该数组进行从小到达的排序。输入:首先输入一个整数n,代数组元素的个数,n的范围是[1,1000]。然后是n个整数,每个整数的取值范围是int型范围。输出这n个数从小到大的排序结果占一行。

思考:

1)若要对数组排序,至少需要几层循环

2)若使用2层循环,外层循环做什么,内层循环做什么

核心算法:

使用变量 i 遍历数组,对于数组中的每一个元素a[i],利用变量 j,遍历a[i]houmian (i+1,i+2,...n-1)的元素a[j],若a[i]>a[j],则交换a[i]和a[j]两元素的位置。即使用冒泡排序法。

#include<stdio.h>
#define MAX_ARRAY_LEN 1000

int main(){
	int array[MAX_ARRAY_LEN]={0};
	int n;
	int i
	int j;
	scanf("%d",&n);
	for (i=0;i<n;i++){
		scanf("%d",&array[i]);
	}
	for (i=0;i<n;i++){
		for (j=i+1;j<n;j++){
			if (array[i]>array[j]){
				temp=array[i];
				array[i]=array[j];
				array[j]=temp;
			}
		}		
	}
	for (i=0;i<n;i++){
		printf("%d",array[i]);
	}
	printf("\n");
	return 0; 
}

4. 函数初步

函数定义时候,需要指定函数的名称函数参数函数返回值的类型

  • 函数名称规则遵循变量的命名规则;
  • 参数是一列变量名称与他们的类型,函数参数之间用逗号分隔,函数也可以没有参数;
  • 函数返回值类型即函数调用完成后,返回给调用代码一个该类型的值,任何合法的变量类型都可以作为函数返回值的类型,函数也可以没有返回值,即void。函数返回时,使用return语句,return后紧跟一个与函数返回值类型相同的值。

5. 无重复数字

已知正整数a、b满足a<=b。你的任务是求出区间[a,b]内,所以满足以下条件的整数:1)该整数由1-n这 n 个数字组成;2)整数中各个位上的数字不相同。输入a,b,n,输出满足条件的整数,每隔5个打印。

求解思路:

  • 整体算法,遍历区间范围内的数字,对每个数字是否满足条件进行判断,设置count计数器记录满足条件的数字个数,对每个满足条件的数字进行输出,每输出5个元素即打印一个换行符。
  • 设计函数,int is_the_digit_ok(int num,int n):

    (输入)num:待判断的整数

    (输入)n:判断整数num中的各个数字是否在1-n之间

     返回值:若num满足条件:1)该整数由1-n这n个数字组成;2)整数中各个位上的数字不相同两个条件,则返回1,否则返回       0。

函数实现:

#include <stdio.h>
int is_digit_ok(int num,int n){
	int mark[10]=0;
	while(num){
		int digit=num%10;
		if(digit>n||digit<1||mark[digit]){
			return 0;
		}
		mark[digit]=1;
		num=num/10;
	}
	return 1;
}

int main(){
	int a;
	int b;
	int n;
	scanf("%d%d%d",&a,&b,&n);
	int i;
	int count=0;
	for(i=a;i<b;i++){
		if(is_digit_ok(i,n){
			printf("%d",i);
			count++;
			if (count%5==0){
				printf("\n");
			}
			else{
				printf("\t");
			}
		}
	}
	if (count==0){
		printf("There is no proper number in the interval.\n");
	}
	printf("\n");
	return 0; 
}

6. 数组作为参数的函数

函数的参数不仅可以是普通的变量,也可以以数组作为函数的参数,当需要把数组作为参数传递给函数时,必须传递一个额外变量,即数组的长度。没有该参数,函数就无法知道数组中有多少个元素可以使用了。(防止数组越界的问题)

7. 函数的声明:函数原型

子函数一般放在main函数之前,若先放main函数代码,后摆放子函数的实现代码,需要预先声明函数,即函数原型;否则会出现未定义函数错误。

函数原型是定义函数基本特性的语句,包括函数的名称、函数的参数列表、函数的返回值,即使只声明函数原型,不给出实现,C程序也可以编译通过,但会发生链接错误。

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/83450691