C 语言 _ 函数封装、变量的作用域
作者:DS小龙哥
- 2022 年 5 月 10 日
本文字数:4342 字
阅读完需:约 14 分钟
这篇文章介绍 C 语言函数封装以及变量作用域、字符串的相关实战练习。字符串转整数、整数转字符串、浮点数转字符串、字符串转浮点数、判断平年闰年、技术字符串长度等等。
1. for 循环示例
#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. 模拟实现投票系统。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. 计算字符串空格、数字等数据数量
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. 字符串转整数。
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. 整数转字符串
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. 浮点数转字符串
浮点数转字符串
//以下例子代码实现将浮点数分解成两个整数
#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. 字符串转浮点数
从键盘上输入一个字符串”123.45”, float data=123.45;
printf("%d\n",0); //0
printf("%d\n",'0'); //48
复制代码
8. 函数的特性与用法
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. 判断平年和闰年
判断平年和闰年
#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. 将数组当做函数的形参
#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. 计算字符串长度
函数示例: 封装函数,计算字符串长度
#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. 全局变量、静态变量、局部变量、常量
如何声明常量?
示例: 常量和变量的区别测试
#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. 字符串进阶练习作业
函数的作业:
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"
};
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/11b0c918f7e66e6efb2921267】。文章转载请联系作者。
DS小龙哥
关注
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论