C language _ function encapsulation, the scope of variables

Offer arrives, dig friends to pick up! I am participating in the 2022 Spring Recruitment Check-In Event, click to view the event details . This article introduces C language function encapsulation and practical exercises related to variable scope and strings. Convert strings to integers, integers to strings, floating-point numbers to strings, strings to floating-point numbers, judging common years and leap years, technical string lengths, etc.

1. For loop example

 #include <stdio.h>
 int main()
 {
     int i,j;
     int len=4;
     for(i=len; i>=1; i--)
     {
         for(j=len; j>i; j--)printf(" "); //打印空格
         for(j=1; j<=i; j++)printf("%d",j); //打印前半部分
         for(j=i-1; j>=1; j--)printf("%d",j); //打印后半部分
         printf("\n");
     }
     return 0;
 }
复制代码

2. Simulate the implementation of the voting system. switch

 比如: 有10张票,3个候选人。 进行投票,最终得出票数。
 #include <stdio.h>
 int main()
 {
     int i;
     int val; //获取键盘上输入的值
     int cnt1=0,cnt2=0,cnt3=0,cnt4=0;
     for(i=1; i<=10; i++)
     {
         printf("请输入投票的编号(1~3,4表示无效票) 剩余票数(%d) :",10-i);
         scanf("%d",&val);
         switch(val)
         {
         case 1:
             cnt1++;
             break;
         case 2:
             cnt2++;
             break;
         case 3:
             cnt3++;
             break;
         default:
             cnt4++;
             break;
         }
     }
     printf("1号选手:%d\n",cnt1);
     printf("2号选手:%d\n",cnt2);
     printf("3号选手:%d\n",cnt3);
     printf("无效票数:%d\n",cnt4);
     return 0;
 }
复制代码

3. Calculate the amount of data such as string spaces, numbers, etc.

 1.从键盘上输入一个字符串
 计算字符串里有多少个空格、小写字母、大写字母、数字。
 scanf("%s",buff);
     /*
     scanf 函数依靠  \n和空格代表结束符号
     */
 #include <stdio.h>
 int main()
 {
     char buff[100];
     int i=0;
     int cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0;
     printf("请输入字符串:");
     gets(buff);
 ​
     while(buff[i]!='\0')
     {
         if(buff[i]==' ')
         {
             cnt1++;
         }
         else if(buff[i]>='a'&& buff[i]<='z')
         {
             cnt2++;
         }
         else if(buff[i]>='A'&& buff[i]<='Z')
         {
             cnt3++;
         }
         else if(buff[i]>='0'&& buff[i]<='9')
         {
             cnt4++;
         }
         else
         {
             cnt5++;
         }
         i++;
     }
     printf("空格:%d\n",cnt1);
     printf("小写:%d\n",cnt2);
     printf("大写:%d\n",cnt3);
     printf("数字:%d\n",cnt4);
     printf("其他:%d\n",cnt5);
     return 0;
 }
复制代码

4. Convert string to integer.

 2.字符串转整数。 
 从键盘上输入一个字符串”12345”,  int data=12345;
 #include <stdio.h>
 //"1234"
 int main()
 {
     char buff[100];
     int i=0,value=0;
     printf("输入数字字符串(0~9):");
     scanf("%s",buff);
 ​
     while(buff[i]>='0' && buff[i]<='9')  //实现字符串转整数
     {
         value=value*10; //0 10 120 1230
         value=value+(buff[i]-'0'); //1 12 123  1234
         i++;
     }
 ​
     if(buff[i]!='\0') //转换失败
     {
         printf("警告:转换不完整。 得到的值:%d\n",value);
     }
     else
     {
         printf("转换成功! 正确值=%d\n",value);
     }
     return 0;
 }
复制代码

5. Integer to String

 3.整数转字符串
 ​
 #include <stdio.h>
 //1234
 int main()
 {
     char buff[100];
     char str[100];
     unsigned int i=0,val=0,j;
     printf("请输入一个整数:");
     scanf("%d",&val);
     
     while(val)
     {
         buff[i]=val%10+'0'; //"4321"
         val=val/10;
         i++;
     }
     for(j=0; j<i; j++)
     {
         str[j]=buff[i-j-1]; //倒序
     }
     str[j]='\0';
 ​
     printf("转换之后字符串: %s\n",str);
     return 0;
 }
 ​
复制代码

6. Convert float to string

 浮点数转字符串
 //以下例子代码实现将浮点数分解成两个整数
 #include <stdio.h>
 //1234
 int main()
 {
     float data=123.456789;
     int data1,data2;
     data1=data; //得到整数部分
     data2=(data-data1)*1000000;
 ​
     printf("%d.%d\n",data1,data2);
     return 0;
 }
复制代码

7. Convert String to Float

 从键盘上输入一个字符串”123.45”,  float data=123.45;
 printf("%d\n",0);   //0
 printf("%d\n",'0'); //48
复制代码

8. Features and usage of functions

 C语言是靠函数组成。
 函数的特性:
 1.函数就相当于封装一个工具。
 2.函数可以重复调用。
 3.函数的功能尽可能的单一。  比如:判断闰年和平年
 4.我们自己的写的函数,(除了main函数之外)  子函数。
 5.一般情况下,子函数的代码都在main函数的下面。
 6.在调用任何子函数之前,都需要声明。
 ​
 函数的定义:
 <函数返回值类型>  函数的名称(形参1,形参2…….)
 {
 函数的代码……
 return <返回值值>;  //如何函数有返回值才需要返回
 }
 ​
 函数的模型:
 void func1(void);  //函数声明
 int func1(int data1,int data2 /*,......*/);  //函数声明
 ​
 //函数原型
 void func1(void)
 {
 ​
 }
 ​
 //函数原型
 int func1(int data1,int data2 /*,......*/)
 {
     return 100;
 }
 ​
 函数示例(计算和):
 #include <stdio.h>
 int sum(int a,int b);  //函数声明
 int main()
 {
     int data;
     data=sum(100,200); ///调用sum函数,并且接收返回值
     printf("data=%d\n",data);
 ​
     data=sum(300,500); ///调用sum函数,并且接收返回值
     printf("data=%d\n",data);
     return 0;
 }
 ​
 /*
 函数功能: 计算a+b之和
 */
 int sum(int a,int b)
 {
     int c=a+b;
     return c;
 }
复制代码

9. Determining common years and leap years

 判断平年和闰年
 #include <stdio.h>
 int GetYear(int year);  //函数声明
 int main()
 {
     int i;
     for(i=2001; i<2018; i++)
     {
         if(GetYear(i))printf("%d 是闰年.\n",i);
         else printf("%d 是平年.\n",i);
     }
     return 0;
 }
 ​
 ​
 /*
 函数功能  : 判断平年和闰年
 函数返回值:  0表示平年 1表示闰年
 */
 int GetYear(int year)
 {
     if((year%4==0&&year%100!=0)||(year%400==0))
     {
         return 1;
     }
     else
     {
         return 0;
     }
 }
复制代码

10. Use arrays as function parameters

 #include <stdio.h>
 void print(char buff[]);
 ​
 int main()
 {
     char buff[]="34534r4gyhtrvfvfdvdf";
     print(buff);
     print(buff);
     print(buff);
     print(buff);
     return 0;
 }
 ​
 void print(char buff[])
 {
     printf("buff=%s\n",buff);
 }
复制代码

11. Calculate string length

 函数示例: 封装函数,计算字符串长度
 #include <stdio.h>
 int my_strlen(char buff[]);
 ​
 int main()
 {
     char buff[100];
     scanf("%s",buff);
 ​
     printf("字符串长度:%d\n",my_strlen(buff));
     return 0;
 }
 ​
 /*
 函数功能: 计算字符串长度
 返回值  : 字符串的长度
 */
 int my_strlen(char buff[])
 {
     int len=0;
     while(buff[len]!='\0')
     {
         len++;
     }
     return len;
 }
复制代码

12. Global variables, static variables, local variables, constants

 如何声明常量?  
 示例:  常量和变量的区别测试
 #include <stdio.h>
 int main()
 {
     int data1=123; //默认声明为变量
     const int data2=456;//声明为常量
     //区别:  变量可以改变数据  常量不可改变数据
     data1=789;
     //data2=789;  错误赋值方式
     return 0;
 }
 ​
 全局变量和局部变量区别:
 #include <stdio.h>
 void func(void);
 int data=123; //全局变量,定义在函数之外的变量。  公用变量
 int main(void)
 {
     int data=456; //局部变量,私有变量
     printf("data1=%d\n",data); //当全局变量和局部变量重名的时候,优先使用局部变量
     func(); //调用函数
     return 0;
 }
 ​
 void func(void)
 {
     printf("data2=%d\n",data); //使用全局
 }
 ​
 局部变量传参数示例:  (分析局部变量)
 #include <stdio.h>
 void func(int data);
 ​
 int main(void)
 {
     int data=456; //局部变量,私有变量
     func(data);
     printf("data1=%d\n",data);
     return 0;
 }
 ​
 void func(int data)
 {
     data=9999;
     printf("data2=%d\n",data);
 }
 ​
 函数形参传递数组和传递变量的区别:
 #include <stdio.h>
 void func(int buff[],int data);
 ​
 int main(void)
 {
     int buff[10]={456,123,789}; //局部变量,私有变量
     int data=888;
 ​
     printf("data1的地址=0x%X\n",&data);
     printf("buff1的地址=0x%X\n",buff);
     func(buff,data);                    //传递的是数组的首地址
 ​
     printf("buff1=%d\n",buff[0]); // 9999 ?
     printf("data=%d\n",data); // 888  ?
     return 0;
 }
 ​
 /*
 函数形参传递数组表示是传递地址
 函数形参传递变量表示是传递数据
 */
 void func(int buff[],int data)
 {
     buff[0]=9999;
     data=9999;
 ​
     printf("data2的地址=0x%X\n",&data);
     printf("buff2的地址=0x%X\n",buff);
 }
 ​
 全局变量和静态变量的生命周期与main函数一样长。
 局部变量的声明周期与调用的子函数挂钩,子函数调用完毕,内部所有的局部变量全部释放。
 什么是静态变量?   局部的全局变量
 如何声明?    static 关键字。  示例:  static int data;  //表示声明data是静态变量
 ​
 #include <stdio.h>
 int func(void);
 ​
 int main(void)
 {
     int i;
     int sum=0;
     for(i=0; i<5; i++)
     {
         sum+=func(); //累加
     }
     printf("%d\n",sum);  //  ?
     return 0;
 }
 ​
 int func(void)
 {
     static int data=0;  //声明静态变量,int data=0 只会执行一次。
     data++;
     return data;
 }
复制代码

13. String advanced practice homework

 函数的作业:  
 1.时间转换(秒与标准时间的转换) 
 (1)函数1:  将秒单位时间转为标准时间。  
         237562867493 -----xxxx年xx月xx日xx时xx分xx秒
 (2)函数2:  将标准时间转为秒单位的时间。
        2018年6月1日19点41分23秒----------xxxxxxx秒
   闰年366,平年365。  区分: 每年二月份相差一天
 2.将字符串转整数、整数转字符串、浮点数转字符串、字符串转浮点数 封装为函数。
 3.封装字符串拼接函数:   
            函数功能实现将a和b字符串拼接在一起。   
            比如: char a[100]=”123”;  char b[]=”456”;    调用函数之后:  a[]=”123456”
 4.封装字符串的拷贝函数:    将a字符串拷贝到b字符串。
 5.封装字符串的比较函数:    比较a字符串和b字符串是否相等。 通过返回值进行区分。
 ​
 字符串解析(扩展):
 1.分析GPS卫星返回的数据
 提取最基本的数据:
 (1)UTC时间
 (2)海拔高度
 (3)经纬度
 char gps_data[]=
 {
     "$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F \
     $GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D \
     $GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37 \
     $BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A \
     $GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B \
     $GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C \
     $GPGSV,3,3,10,31,50,287,36,32,66,018,*7F \
     $BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62 \
     $GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D \
     $GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14 \
     $GNZDA,114955.000,06,11,2017,00,00*47 \
     $GPTXT,01,01,01,ANTENNA OK*35"
 };
复制代码

Guess you like

Origin juejin.im/post/7079624515038216222