函数部分

引用最简单的sinx函数库

#include<stdio.h>
#include<math.h>
int main(){
     
	int n;
	scanf("%d",&n);
	printf("sin(%d)=%f",n,sin(n));
return 0;
}

##这次因为有函数所有必须加上#include相当于引用函数库,而且后面编译的时候不能使用gcc+文件名,必须gcc+文件名然后再加上 -lm代表编译的时候加上c语言的算术动态库都加进来(一般提示.text就是确实代码库导致的错误)
##因为在编程语言中所有的都是弧度值,而不是角度值,所以需要设置参数让输入弧度值

#include<stdio.h>
#include<math.h>
int main(){
     
	int n;
	scanf("%d",&n);
	printf("sin(%d)=%f",n,sin(n*M_PI/180));
return 0;
}

##可以看到M_PI就是变量π,n*M_PI/180实现变量的转换
输入直角三角形斜边c,和其中一个锐角alpha,求两外两条直角边a,b。

#include<stdio.h>
#include<math.h>
int	main(){
     
	float a,b,c,d,alpha;
	scanf("%f %f",&c,&alpha);
	d=alpha*M_PI/180;
	a=c*sin(d);
	b=c*cos(d);
	printf("%f %f",a,b);
return 0;
}

在这里插入图片描述
分别代表开根号,次方,还有绝对值

已知三条边长度分别为a、b、c,实现一个计算三角型周长的函数。(定义函数)

#include<stdio.h>
int length(int a,int b,int c){
     //这只是个定义,a,b,c代换成其他的任何字母都行
	return a+b+c;
}
int main(){
     
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	int res=length(a,b,c);
	printf("length=%d\n",res);
}

已知圆的半径r,实现一个计算圆的面积的函数。

#include<stdio.h>
#include<math.h>##因为有M_PI所以必须因为math函数,因为是浮点所以面积必须规定为浮点
float square(int a){
     
	return M_PI*a*a;
}
int main(){
     
	int a;
	scanf("%d",&a);
float hhhh=square(a);
	printf("面积是:%f",hhhh);
}

##分别提示输入体重和身高 计算BMI 根据BMI输出体重级别 如果不在正常范围内输出需要增肥/减肥的最小值。

#include<stdio.h>
#include<math.h>
void  BMI_(float w,float h){
     
	float BMI;
	BMI=w/(h*h);
	printf("%f",BMI);
	
	if(0<BMI<18.5){
     
	printf("过轻");
}else if(18.5<=BMI<=23.9){
     
	printf("正常");
}else if(24<=BMI<28){
     
	printf("超重");
}else if(28<=BMI<32){
     
	printf("肥胖");
}else
	printf("非常肥胖");
}
void suggestion(float w,float h){
     
	float BMI,m;
	if(BMI<18.5){
     
	BMI=18.5;
	m=BMI*h*h;
	printf("要增加的体重%f",m-w);
}
	if(BMI>23.9){
     
	BMI=23.9;
	m=BMI*h*h;
	printf("要减少的体重%f",w-m);
}
}
int main(void){
     
	float h,w;
	scanf("%f %f",&w,&h);
	BMI_(w,h);
	suggestion(w,h);
	return 0;
}

在这里插入图片描述

##定义指针P并且给他赋值n的地址,然后scanf直接选择p,和平常习惯性的scanf("%d",&n是一样的)

指针

#include<stdio.h>
int main(){
     
	int n;
	int*p=&n;
	scanf("%d",p);##类似于上面说的输入&n一个结果
	printf("%d\n",n);##打印出的普通变量名
	printf("%p\n",p);##打印出他的地址变量
	printf("%d\n",*p);##打印出他的解引用后的变量,结果是普通变量
}

##这是输入是10,其他的都是输出。
在这里插入图片描述

#include<stdio.h>
	int func(int n){
     
	n=100;
}
int main(){
     
	int n=10;
	func(n);
	printf("%d",n);
}

##这个代码是构建函数func,将n的值改为100,然后构建的的main里面的n=10,然后引用构建的函数func,查看输出到底是100还是10,但是结果是10,为什么呢

#include<stdio.h>
	int func(int n){
     
printf("1.n=%d\n",n);
	n=100;
printf("2.n=%d\n",n);
}
int main(){
     
	int n=10;
	func(n);
	printf("3.n=%d\n",n);
}

##给每一步都加上一个输出可以看到输出为
1.n=10
2.n=100
3.n=10
为什么会出现这样的结果,因为n不相同,查看下他的不同的n的地址一样不?

#include<stdio.h>
	int func(int n){
     
printf("&n=%p\n",&n);
printf("1.n=%d\n",n);
	n=100;
printf("2.n=%d\n",n);
}
int main(){
     
	int n=10;
	func(n);
	printf("&n=%p\n",&n);
	printf("3.n=%d\n",n);
}

##查看地址后发现确实不一样,
&n=0x7ffc7de44dec
1.n=10
2.n=100
&n=0x7ffc7de44e0c
3.n=10
因此他们不是同一个n,只是名字恰好相等,因此函数func只是传递了n所代表的数值,并不是变量n
在这里插入图片描述
##传进去的是n=10的这个数值10,因此函数func里面先对n=10进行接受,但是在函数里面修改n的数值,并不能修改输出,因为传递的是数字10,而不是n。这种传递叫做值传递

#include<stdio.h>
int func(int* n){
     
    *n = 100;
}

int main(){
     
   int n = 10;
   func(&n);
   printf("n = %d\n",n);
}

##输出为100了,和上面不同的是func(&n)是对地址进行变量调用,因为地址是n的地址不是数值10或者100的地址,因此他会随着变量的变化而变化
&n=0x7fff97a2321c
n=0x7fff97a2321c
n = 100
##因此指针进行操作,和变量的操作不一样

#实现函数swap()交换两个变量的值。

#include<stdio.h>
void swap(int a,int b){
     
	int t=a;
	a=b;
	b=t;
}

int main(){
     
	int a,b;
	scanf("%d %d",&a,&b);
	printf("a=%d b=%d\n",a,b);
	swap(a,b);
	printf("a=%d b=%d\n",a,b);
	return 0;
}

在这里插入图片描述
##输出并没有变,因为我们使用的是普通变量,他在使用函数传输的时候只是传输的数值而不是变量,因此必须使用指针

#include<stdio.h>
void swap(int *a,int *b){
     
	int t=*a;
	*a=*b;
	*b=t;
}

int main(){
     
	int a,b;
	scanf("%d %d",&a,&b);
	printf("a=%d b=%d\n",a,b);
	swap(&a,&b);
	printf("a=%d b=%d\n",a,b);
	return 0;
}

在这里插入图片描述
##使用指针后发现已经可以完成修改
divmod()输入参数a和b,同时获取a与b的商和余数。(这个也是利用了指针进行编辑)

#include<stdio.h>
int divmod(int a,int b,int* mod){
     
	*mod=a%b;
	return a/b;
}
int main(){
     
	int a,b;
	scanf("%d %d",&a,&b);
	int mod;
	int res=divmod(a,b,&mod);
	printf("%d %d\n 商%d\n 余%d\n",a,b,res,mod);
	return 0;
}

使用数组输入5个数字,逆序打印出这5个数字。


#include<stdio.h>
	int main(){
     
	int day[5]={
     1,2,3,4,5};
	scanf("%d %d %d %d %d",&day[0],&day[1],&day[2],&day[3],&day[4]);
	printf("%d %d %d %d %d",day[4],day[3],day[2],day[1],day[0]);
}

如果是50个字符,单独写出来太多了,如何解决

#include<stdio.h>
	int main(){
     
	int day[5]={
     1,2,3,4,5};
	int i;
	for(i=0;i<5;++i){
     
	scanf("%d",&day[i]);
}
	for(i=4;i>=0;--i){
     
	
	printf("%d",day[i]);
}
	printf("\n");
}

##也可以加上for循环来进行输入和输出来达到批量的目的,50个数字同理,只要修改初始化的数组个数5为50,然后数值赋值到50,然后修改for循环的i就可以实现

#include<stdio.h>
	int main(){
     
	int n;
	scanf("%d",&n);
	int day[n];
	int i;
	for(i=0;i<n;++i){
     
	scanf("%d",&day[i]);
}
	for(i=n-1;i>=0;--i){
     
	
	printf("%d",day[i]);

	printf("\n");
}
}

##先输入n的具体数值,然后再输入它对应的数组数值

如果访问数组索引大于数组大小会怎样?
如果访问数组索引等于数组大小会怎样?
声明一个长度为0的数组会怎样?
声明一个长度为负数的数组会怎样?
函数部分_第1张图片
##按顺序打印月份与对应的天数(使用数组)

#include<stdio.h>
int main(){
     
int days[]={
     31,28,31,30,31,30,31,31,30,31,30,31};
	int i;
	for(i=0;i<12;++i){
     
	printf("%d月有%d天\n",i+1,days[i]);
}
}

##前面最早的输入月份出现他的月份的天数,这里使用数组进行设置

#include<stdio.h>
int main(){
     
int days[]={
     31,28,31,30,31,30,31,31,30,31,30,31};
	int i;
	scanf("%d",&i);
	printf("%d月有%d天\n",i,days[i-1]);
}

输入年份,打印当前年份所有月份的天数。(注意:闰年替换二月份天数)

 #include<stdio.h>
int main(){
     
int days[]={
     31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[]={
     31,29,31,30,31,30,31,31,30,31,30,31};
	int n,i;
	scanf("%d",&n);
	if(n%4==0 && n%100!=0 || n%400==0){
     
	for(i=0;i<12;++i){
     
	printf("%d月份有%d天",i+1,dayss[i]);
}	
}else{
     
	for(i=0;i<12;++i){
     
printf("%d月份有%d天",i+1,days[i]);
}
}
}

第一个30天的月份是什么

#include<stdio.h>
int main(){
     
int days[]={
     31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[]={
     31,29,31,30,31,30,31,31,30,31,30,31};
	int i;
	for(i=0;i<12;++i){
     
	if(days[i]==30){
     
	break;
}
}

	printf("%d",i+1);
}

输入年份和起式月份m和终止月份n,求出从m到n之间的天数。

#include<stdio.h>
int main(){
     
int days[]={
     31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[]={
     31,29,31,30,31,30,31,31,30,31,30,31};
	int i,sum,m,n;
	scanf("%d %d",&m,&n);
	for(i=m-1;i<n;++i){
     
	sum = sum+days[i];
}

	printf("%d",sum);
}

利用数组,输入某年某月某日,判断这一天是这一年的第几天?

#include <stdio.h>
int main()
{
     
    int day,month,year,sum,leap;
    int a[]= {
     0,31,59,90,120,151,181,212,243,273,304,334};
    printf("please input year month day(year month day)\n");
    scanf("%d %d %d",&year,&month,&day);  // 格式为:2015 12 10  2015 10 1
    sum=a[month-1]+day; // 再加上某天的天数
    if(year%400==0||(year%4==0&&year%100!=0))  // 判断是不是闰年
        leap=1; // 是则记录为1
    else
        leap=0; // 不是记录为0
    if(leap==1&&month>2)   // *如果是闰年且月份大于2,总天数应该加一天
    {
     
        sum++;
    }
    printf(" %d  ",sum);
    printf("\n");
    return 0;
}

输入一个长度为n的数组,输出他的最大值和最小值。

#include
int main(){
     
	int n,max,i,min;
	float sum=0;
	scanf("%d",&n);
	int day[n];
	for(i=0;i<n;++i){
     
	scanf("%d",&day[i]);
}
	max=min=day[0];//在数组day中求最大值和最小值,用max存储最大值,用min的存储最小值,将max和min的初值赋为day[0],然后再用其他数组和他比较
for(i=0;i<n;++i){
     
	if(max<day[i]){
     
	max=day[i];
}	if(min>day[i]){
     
	min=day[i];
	sum=sum+day[i];
}
}
	printf("max=%d min=%d",max,min);
}

实现一个字符串纵向输出

#include 
int main(){
     
	int i;
    char str[1024];
    printf("请输入字符:");
    scanf("%s",str);
 for ( i=0; '\0' != str[i]; ++i){
     
    printf("%c\n",str[i]);
}
	return 0;
}

##输入字符串s,打印出字符串s的长度(不包含’\0’)。

#include 

int main(){
     
	int i;
    char str[1024];//1024有无都行
    printf("请输入字符字:");
    scanf("%s",str);
 for ( i=0; '\0' != str[i]; ++i){
     
}
    printf("%d\n",i);

	return 0;
}

输入字符串s和字符c,打印出字符c在字符串s中出现的次数。

#include 
int main(){
     
	int i,sum=0;
    char str[1024],c;
    printf("请输入你字符:");
    scanf("%s %c",str,&c);
 for ( i=0; '\0' != str[i]; ++i){
     

   	if(str[i]==c){
     
	++sum;

}
}
	 printf("%d\n",sum);
	return 0;
}

输入字符串s和字符c,打印出c在字符串s中的第一次出现的位置(第一个字符位置为0,s不包含c返回-1)。

#include
	int main(){
     
	int i;
	char s[1024],c;
	scanf("%s %c",s,&c);
	for(i=0;'\0'!=s[i];++i){
     
	if(s[i]==c){
     
	printf("%d",i+1);
	return;//这个return代表出现这个情况后,程序直接返回,不运行了
}	
	if(s[i]!=c){
     
}	
}
	printf("-1");


return 0;
}

##也可以使用break,当sum没有增加,那就代表没有出现相同元素

#include
	int main(){
     
	int i,sum=0;
	char s[1024],c;
	scanf("%s %c",s,&c);
	for(i=0;'\0'!=s[i];++i){
     
	if(s[i]==c){
     
	++sum;
	printf("%d",i+1);
	break;
}
}	
	if(sum==0){
     
	
}
	printf("-1");


return 0;
}

##也可以用bool的方式,设定nofind=ture,然后找到的时候它就自动为false,然后false下面的语句就执行,不然不执行。然后执行下面if(nofind的语句默认是true),如果是ture的那就执行

#include
#include
	int main(){
     
	int i;
	char s[1024],c;
	scanf("%s %c",s,&c);
	bool nofind = true;
	for(i=0;'\0'!=s[i];++i){
     
	if(s[i]==c){
     
	nofind=false;
	printf("%d",i+1);
	break;
}	
}
	if(nofind){
     	
	printf("没有出现");
}
return 0;
}

输入字符串s和字符c,打印出c在字符串s中的最后一次出现的位置(第一个字符位置为0,s不包含c返回-1)。

#include
int main(){
     
	int n;
	scanf("%d",&n);
	int i;
	char s[n],c;
	scanf("%s %c",s,&c);
	for(i=n-1;'\0'!=s[i];--i){
     
	if(s[i]==c){
     
	printf("%d",i+1);
	return;
}
	if(s[i]!=c){
     
}	
}	
	printf("-1");
}

##输入字符串s、数字n和字符c ,用字符c替换字符串s中n位置的字符,打印出替换结果。

#include
	int main(){
     
	int n,i;
	char s[1024],c;
	scanf("%s %d %c",s,&n,&c);
	for(i=0;'\0'!=s[i];++i){
     
	if(i==n-1){
     
	s[n-1]==c;
}
	printf("%s",s);
}
return 0;
}

输入字符串s,打印出字符串s的反序。

#include
	int main(){
     
	int i;
	char s[1024];
	scanf("%s",s);
	for(i=0;'\0'!=s[i];++i){
     
}
	char c[i];
	c[i]='\0';
	int t;
for(t=0;t<i;++t){
     
	c[t]=s[i-1-t];
}
	printf("%s\n",c);
}

##第二种方法,第一个位置和最后一个位置的元素交换,最终实现反序

#include
int main(){
     
	int i;
	char s[1024];
	scanf("%s",s);
	for(i=0;'\0'!=s[i];++i){
     
}
	int p=0;
	int q=i-1;
	while(p<q){
     
	char t=s[p];
	s[p]=s[q];
	s[q]=t;
	++p;
	--q;
}
	printf("%s",s);
}

输入身份证号,打印身份证中出生年月日和性别。

#include
	int main(){
     
	int i;
	char s[18];
	scanf("%s",s);
	for(i=0;'\0'!=s[i];++i){
     
}
	printf("年份为%c%c%c%c 月份为%c%c 日为%c%c",s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13]);
}

##第二种方法

#include 
int main(){
     
	int i;
	char s[18];
	scanf("%s",s);
	for(i=6;i<=13;++i){
     
	printf("%c",s[i]);
}
}

输入身份证号,打印身份证的地区信息。

#include
int  main(){
     
char arr[19];//要验证的身份证号码
int   brr[17]={
     7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,5, 8, 4, 2};//身份证前17位的系数
char  crr[11]={
     1, 0, -1, 9, 8, 7, 6, 5, 4, 3, 2};  //身份证第18位验证码
int sum=0;
int loop=0;
printf("请输入您的身份证号码\n");
scanf("%s",arr);
for(loop;loop<17;loop++)
sum=sum+(arr[loop]-'0')*brr[loop];//-'0'是实现字符到数字的转换
if(sum%11==2){
     
if(arr[17]=='X')
printf("合法\n");
else
printf("不合法\n");
}
else{
     
if((arr[17]-'0')==crr[sum%11])
printf("合法\n");
else
printf("不合法\n");
}
return 0;
} 

输入身份证号,打印身份证的地区信息。

#include
int main(){
     
	char arr[19];
	int i,sum=0;
	scanf("%s",arr);
	for(i=0;i<6;++i){
     
	sum=sum*10+(arr[i]-'0');
}
switch(sum){
     
	case 610101:printf("市辖区");break;
	case 610102:printf("属于新城区\n");break;
  	case 610103:printf("属于碑林区\n");break;
  	case 610104:printf("属于莲湖区\n");break;
  	case 610111:printf("属于灞桥区\n");break;
  	case 610112:printf("属于未央区\n");break;
  	case 610113:printf("属于雁塔区\n");break;
  	case 610114:printf("属于阎良区\n");break;
  	case 610115:printf("属于临潼区\n");break;
  	case 610116:printf("属于长安区\n");break;
  	case 610122:printf("属于蓝田县\n");break;
  	case 610124:printf("属于周至县\n");break;
  	case 610125:printf("属于鄠邑区\n");break;
  	case 610126:printf("属于高陵县\n");break;
  	default:printf("西安以外的我不知道!\n");break;
	}
}

##如何将指针(地址)赋值给整形,编译的时候就会出错,因为

#include
	int main(){
     
	int n=10;
	int* p,q;//p为指针,p为整型,想让q为整型,必须得在q前面加上*
	q=&n;

##前面的反序构建双重for循环的方法之外还有新的方法(自动取字符串的长度)
函数部分_第2张图片
##引入string函数,然后定义整形变量len=strlen(str);来达到取字符串的长度的目的(这个也是取到\0,和上面for循环的取值是一样的)

你可能感兴趣的:(q'we,c++)