嵌入式工程师学习day7——函数

        终于来到了函数的学习,由于是刚接触,老师讲了很多概念性的东西,都是需要记的,包括三种函数定义格式,参数如何传递,传递数组时该怎么考虑等。值得重点注意的是地址传递,地址传递数组的时,参数的改变也会引起原数据的改变。下面是今天的学习脑图:

 课堂练习:

1.自定义函数,实现计算器

void add(int num1,int num2)
            {
                printf("%d+%d=%d\n",num1,num2,num1+num2);
            }void sub(int num1,int num2)
            {
                printf("%d-%d=%d\n",num1,num2,num1-num2);
            }
            void mul(int num1,int num2)
            {
                printf("%d*%d=%d\n",num1,num2,num1*num2);
            }
            void div(int num1,int num2)
            {
                if(num2==0)
                    printf("除数不能为0\n");
                else
                    printf("%d/%d=%.2f\n",num1,num2,(float)num1/num2);
            }
            int main(int argc, const char *argv[])
            {
                int num1,num2;
                char ch;
                printf("请输入一个表达式:");
                scanf("%d%c%d",&num1,&ch,&num2);
                switch(ch)
                {
                    case '+':add(num1,num2);  break;

                    case '-':sub(num1,num2);  break;
                    case '*':mul(num1,num2);  break;
                    case '/':div(num1,num2);  break;
                }
                return 0;
            }

2.实现字符串拷贝函数的封装【非函数】

void MyStrcpy(char str[],char str1[])
			void MyStrcpy(char str[],char str1[])
            {
                int i;
                for( i=0;str1[i]!='\0';i++)
                {
                    str[i]=str1[i];
                }
                str[i]='\0';
                puts(str);
            }
            int main(int argc, const char *argv[])
            {

                char str[10]="",str1[10]="";
                gets(str1);
                MyStrcpy(str,str1);
            //	puts(str);
                return 0;
            }

3.使用函数实现排序【在自定义函数中排序】

void Sort(float arr[],int n)
        {
            int i,j;
            float t;
            for(i=1;i<n;i++)
            {
                for(j=0;j<n-i;j++)
                {
                    if(arr[j] < arr[j+1])
                    {
                        t=arr[j];arr[j]=arr[j+1];arr[j+1]=t;
                    }
                }
            }
        }
        void Show(float arr[],int n)
        {
            int i;
            for(i=0;i<n;i++)
            {
                printf("%.1f\t",arr[i]);
            }
        }
        int main(int argc, const char *argv[])
        {
            float arr[]={4.2,52.3,3.2,6.2,8.5};
            int n=sizeof(arr)/sizeof(arr[0]);

            Sort(arr,n);

            //输出使用函数
            Show(arr,n);
            return 0;
        }

4.计算二维字符数组的最大值【自己封装函数】

#include <stdio.h>
        #include <string.h>
        void StrMax(char str[][20],int n,char max[])
        {
            int i;
            for(i=0;i<n;i++)
            {
                if(i==0) //第一次循环
                    strcpy(max,str[i]);
                //比较
                if(strcmp(max,str[i])<0)
                    strcpy(max,str[i]);
            }
        }
        int main(int argc, const char *argv[])
        {
            char str[][20]={"hello","hi","word"};
            int n=sizeof(str)/sizeof(str[0]);
            char max[20];
            StrMax(str,n,max);
            puts(max);
            return 0;
        }

5.计算二维数组中素数的个数

#include <stdio.h>
        void Prime(int arr[][3],int line,int row)
        {
            int i,j,count,k;
            //判断1-本身之间有2个约数
            //7: 1--7   
            //6:1-6
            for(i=0;i<line;i++)
            {
                for(j=0;j<row;j++)
                {
                    count=0;
                    //判断arr[i][j]是否是素数
                    for(k=1;k<=arr[i][j];k++) 
                    {
                        if(arr[i][j]%k==0)
                        {
                            count++;//计算约数的个数
                        }
                    }
                    if(count==2)
                        printf("%d\t",arr[i][j]);
                }
            }
        }
        int main(int argc, const char *argv[])
        {

            int arr[][3]={11,12,23,7,43};
            int line=sizeof(arr)/sizeof(arr[0]);
            int row=sizeof(arr[0])/sizeof(arr[0][0]);
            Prime(arr,line,row);
            return 0;
        }

作业:

1.输出一维数组的回文数字

>函数格式:void Palindrome(int arr[],int n)

#include <stdio.h> 
#include <string.h>

void Palindrome(int arr[],int n);

int main(int argc, const char *argv[])
{
	int a[10] = {121,326,69896,789412,1221,548,52125,78514,321123,52};
	int n = sizeof(a)/sizeof(int);
	Palindrome(a,n);
	return 0;
}

void Palindrome(int arr[],int n){
	int count = 1;
	for(int i = 0; i < n; i ++ ){
		int n2 = 0;
		int mid = arr[i];
		while(mid > 0){
			n2 ++;
			mid /= 10;
		}
		int nizhi = 0;
		int mid2 = arr[i];
		for(int j = 0; j < n2; j ++){
			nizhi = nizhi * 10 + mid2 % 10;
			mid2 /= 10;
		}
		if(nizhi == arr[i]){
			printf("该数组第%d个回文数字为%d\n",count,arr[i]);
			count ++;
		}
	}
}

结果如下:

 2.实现字符串匹配

>例如:char str[]=”ababcabcdabcde” char str1[]=”abca”

>输出子串在主串的下标2出现

>函数格式:void  BF(char str[],char str1[]) //str是主串  str1是子串

#include <stdio.h> 
#include <string.h>

void BF(char str[],char str1[]);

int main(int argc, const char *argv[])
{
	char str[] = "ababcabcdabcde";
	char str1[] = "abca";
	BF(str,str1);
	return 0;
}

void BF(char str[],char str1[]){
	int n = strlen(str);
	int n2 = strlen(str1);
	int type = 0;
	for(int i = 0;i < n - n2; i ++){
		for(int j = 0; j < n2; j ++){
			if(str[j+i] == str1[j]){
				type ++;
			}
		}
		if(type == n2){
			printf("子串在下标%d出现\n",i);
			break;
		}
		type = 0;
	}
}

结果如下:

 3.实现字符串逆置

>函数格式:void  MyStrrev( char str[] )

#include <stdio.h> 
#include <string.h>

void MyStrrev(char str[]);

int main(int argc, const char *argv[])
{
	char a[20] = "qwedfhguyjkio";
	MyStrrev(a);
	printf("逆置后的结果为:\n%s\n",a);
	return 0;
}

void MyStrrev(char str[]){
	int n = strlen(str);
	int left = 0;
	int right = n -1;
	while(left < right){
		char c = str[left];
		str[left] = str[right];
		str[right] = c;
		left ++;
		right --;
	}
}

结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值