类型强转
#include <stdio.h>
int main(int argc, char const *argv[])
{
//这里的操作是相加后,再把小数点去掉
double a=1.1;
double b=2.6;
printf("%d\n",(int)(a+b));
}
类型转换谁的类型长度长,最终就是按谁的类型进行算,比如3.14默认就是double,3.14f声明了他是浮点型
逻辑判断
#include<stdio.h>
void main()
// {
// //定义变量x
// int x;
// //输入x的值
// scanf("%d",&x);
// //如果x小于5,输出x的值
// if(++x<5)
// printf("%d\n",x);
// //否则输出x的值
// else
// printf("%d\n",x);
// //将x的值减1
// x--;
// //输出x的值
// printf("%d\n",x);
// }
// {
// int x=1,y=2;
// //输出x的值,这里是逻辑判断,如果||只要其中有一个为真就为真,在c中1表示为真,0表示为假
// printf("%d\n",! x||y);
x*=y+1 //x=x*(y+1)
逗号优先级
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=2,b=3,c=4,x,y;
y=((x=a+b),(b+c));
printf("%d\n",y);
//最终答案为5,因为逗号表达式的值为最后一个表达式的值。
//如果想要得到7, y=((x=a+b),(b+c));逗号优先级
return 0;
}
在使用%c格式输入时 空格 tab “专一字符”等键都作为有效字符输入
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i;
//%3d表示只输出3列,输入123456,只会输出123
scanf("%3d",&i);
printf("%d\n",i);
return 0;
}
3.非法输入
floor()and ceil()
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
/* code */
//floor()函数返回不大于x的最大整数值。
//ceil()函数返回不小于x的最小整数值。
double x=3.14;
double mi;
double ma;
ma=floor(x);
mi=ceil(x);
printf("%.2lf\n",ma);
printf("%.2lf",mi);
return 0;
}
计算华氏温度
{
//编程题1 计算华氏温度
double f,c;
scanf("%lf",&f);
c=5*(f-32)/9;
//%.2f表示保留两位小数
printf("%.2f摄氏温度等价于%.2f华氏温度\n",f,c);
return 0;
}
海伦公式计算三角形
{
//编程题2 输入三角形的三条边长,计算它的面积。
//这个计算三角形的公式是海伦公式
int a ,b,c;
double s,area;
printf("请输入三角形的三条边长:");
scanf("%d,%d,%d",&a,&b,&c);
s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的面积为:%.2lf\n",area);
return 0;
}
字母转换
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
//编程题3 输入一个大写字母,将其转换为小写字母输出。ACII编码大写和小写字母相差32
char c;
scanf("%c",&c);
printf("%c",c+32);
return 0;
}
点到直线的距离
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
//已知直线L的方程为Ax+By+C=0,求点P(x0,y0)到直线L的距离。
double A, B, C, x0, y0, d;
printf("请输入直线L的方程的系数A,B,C:");
scanf("%lf,%lf,%lf", &A, &B, &C);
printf("直线L的方程为:%.2lfx%+.2lfy%+.2lf=0\n", A, B, C);
printf("请输入点P的坐标x0,y0:");
scanf("%lf %lf", &x0, &y0);
//fabs()函数用于计算浮点数的绝对值
d = fabs(A * x0 + B * y0 + C) / sqrt(A * A + B * B);
printf("点到直线的距离为:%f", d);
return 0;
}
真假概念
//验证了假为0,正为非0
int a=4,b=5,c=0;
printf("%d,%d,%d\n",!a,!b,!c);
return 0;
短路运算
关系运算不短路,逻辑运算才会短路
//短路运算
int a=1,b=2,c=3,d=4;
int m=1 ,n=1;
//第一括号为真,后面才会运行
printf("%d,%d,%d\n",(m=a>b)&&(n=c>d),m,n);
return 0;
//短路运算
int a=1,b=2,c=3,d=4;
int m=100 ,n=100;
//第一括号为为假,后面才会运行
printf("%d,%d,%d\n",(m=a>b)||(n=c>d),m,n);
return 0;
关于闰年的描述
//闰年计算
int year;
scanf("%d",&year);
//能够被400整除或者能够被4整除但是不能被100整除
if (year%400==0||(year%4==0&&year%100!=0))
{
printf("%d is润年",year);
}
else
{
printf("%d is not a 闰年",year);
}
}
三目运算符
//三目运算符
{
int a=1,b=2,max;
//如果为真就打印a,否则打印b
max=a>b?a:b;
printf("%d",max);
}
输入三个整数,按由大到小的顺序输出。
//输入三个整数,按由大到小的顺序输出。
int a,b,c,t;
printf("Enter two numbers: ");
scanf("%d %d %d",&a,&b,&c);
if(a<b)
{
t=a;
a=b;
b=t;
}
if(a<c)
{
t=a;
a=c;
c=t;
}
if(b<c)
{
t=b;
b=c;
c=t;
}
printf("The numbers in descending order are: %d %d %d\n",a,b,c);
return 0;
统计输入的字符数(while)
{
//统计输入的字符数
char c;
int n=0;
//输入换行符结束
while ((c=getchar())!='\n')
{
/* code */
n++;
}
printf("%d\n",n);
return 0;
}
do while
{
//do while
int i=1,s=0;
do{
s+=i;
i++;
}while (i<=100);
{
printf("s=%d\n",s);
}
}
用于判断一个数是否为素数
#include <stdio.h>
#include <math.h>
// 用于判断一个数是否为素数
int main(int argc, char const *argv[])
{
int i ,k,n;
printf("请输入一个数字:");
scanf("%d",&n);
k=(int)sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0)
break;
}
if(i<=k){
printf("%d不是素数\n",n);
}
else{
printf("%d是素数\n",n);
}
return 0;
}
指针
对于学习 c 语言,最令人头疼的就是指针
首先这个名字就很让人不解,但是对于抽象问题我们就要试着具体化的解释出来
指针的理解:
假设你在邮局里面放了货物,邮局给你一张条子,这张条子记录着你存放货物的地址,你可以通过这张条子去提取你的货物,这张条子就是指针
问题 1:邮局为什么不直接给你货物 (效率问题,直接给你货物,相当于你把值当成参数进行传递,那么计算机就需要 new 一个很大对象,给计算机很大的压力)
问题 2:假如我拿着这个地址去提货发现货物已经被提走了(内存泄漏)
问题 3:假如给的这个地址让我不小心丢失了,那么货物就会一直存在哪里,占用内存
问题 4:假如邮局给错了地址,你拿着这个地址胡乱提
问题一例子:
这个时候传递的就是内存地址,而你拿着地址去去提货而已,未完待续?
#include <stdio.h>
int main(int argc, char const *argv[])
{
/* code */
// 定义两个int变量
int a , b;
// 定义两个指针变量
int *pointer_1,*pointer_2;
// 初始化两个值
a=100; b=10;
// 把a,b的地址赋值给两个指针变量
pointer_1=&a;
pointer_2=&b;
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);
printf("a=%d,b=%d\n",a,b);
printf("&a=%d,&b=%d\n",&a,&b);
printf("*pointer_1=%d,*pointer_2=%d\n",pointer_1,pointer_2);
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 定义变量
int a , b , c;
// 定义指针变量
int *pa=&a ,*pb=&b;
// 定义中间变量
int *t;
a=4;
b=5;
// 打印出对应的值
printf("pa=%d pb=%d\n",pa,pb);
printf("*pa=%d *pb=%d\n",*pa,*pb);
// 进行交换逻辑
t=pa,pa=pb,pb=t;
c=a,a=b,b=c;
// 打印出对应的值
printf("pa=%d pb=%d\n",pa,pb);
// 打印出对应的值
printf("*pa=%d *pb=%d\n",*pa,*pb);
printf("a=%d b=%d",a,b);
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a,b;
int *pa,*pb;
pa=&a;
pb=&b;
a=1,b=2;
printf("a=%d b=%d\n",&a,&b);
printf("pa=%d pb=%d\n",pa,pb);
printf("*pa=%d *pb=%d\n",&pa,&pb);
//这里就说明了pa和pb是指针变量,而&pa和&pb是指针变量的地址,指针变量也是变量,也有地址
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
//通过交换指针变量的值,来交换指针变量所指向的值
int a , b ;
int *pa=&a ,*pb=&b;
scanf("%d %d",&a,&b);
printf("pa=%d pb=%d\n",pa,pb);
int t;
t=pa,pa=pb,pb=t;
printf("pa=%d pb=%d\n",pa,pb);
printf("pa=%d pb=%d\n",*pa,*pb);
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
//数组指针
int a[5]={10,20,30,40,50};
int *p;
p=a;
printf("a[0]=%d\n",*p);
printf("a[1]=%d\n",*(p+1));
p++;
printf("a[1]=%d\n",*p);
p=p+2;
printf("a[4]=%d\n",*p);
return 0;
}
数组
int a[10];
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(int i=0;i<10;i++)
printf("%d",*(a+i));
return 0;
容易考察的点
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5]={10,20,30,40,50};
int *p,i;
for(p=a;p<a+5;p++)
//或者for(p=a,i=0;i<5;i++)
//printf("%d\n",*(p+i));
printf("%d\n",*p);
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
//定义了一个二维数组,然后定义了一个指针变量p,然后用p指向二维数组的第一个元素,然后用p输出二维数组的所有元素
int a[2][3]={1,2,3,4,5,6};
int *p;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
p=&a[i][j];
printf("%d ",*p);
}
printf("\n");
}
return 0;
}
二维数组
#include <stdio.h>
int main(int argc, char const *argv[])
{
//定义了一个二维数组,然后定义了一个指针变量p,然后用p指向二维数组的第一个元素,然后用p输出二维数组的所有元素
int a[2][3]={1,2,3,4,5,6};
int *p;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
p=&a[i][j];
printf("%d ",*p);
}
printf("\n");
}
return 0;
}
第二种写法
#include <stdio.h>
int main(int argc, char const *argv[])
{
//定义了一个二维数组,然后定义了一个指针变量p,然后用p指向二维数组的第一个元素,然后用p输出二维数组的所有元素
int a[2][3]={1,2,3,4,5,6};
int *p;
p=&a[0][0];
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",*p++);
}
printf("\n");
}
return 0;
}
运算符的优先级
字符指针
函数指针
#include <stdio.h>
int main(int argc, char const *argv[])
{
int max(int,int);
int min(int,int);
void process(int,int,int(*p)(int,int));
int a,b;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
printf("max=");
process(a,b,max);
printf("min=") ;
process(a,b,min);
return 0;
}
void process(int x,int y,int(*p)(int,int))
{
int result;
result=(*p)(x,y);
printf("%d\n",result);
}
int max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}
int min(int x,int y){
int z;
if(x<y)
z=x;
else z=y;
return(z);
}
{
char *s = "Hello World";
char a[10]="mn";
strcat(a,s);
puts(a);
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[10],m,n,i;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
printf("\n");
m=a[0];
n=0;
if(max(m,a[i])>m)
{
m=max(m,a[i]);
n=i;
}
}
printf("最大值为:%d\n",m);
printf("最大值的下标为:%d\n",n+1);
}
int max(int x,int y)
{
return(x>y?x:y);
}
文件的打开和关闭
#include <stdio.h>
int main(int argc, char const *argv[])
{
//文件打开和关闭
FILE *fp;
char ch;
fp = fopen("test.txt","w");
if(fp==NULL){
printf("文件打开失败\n");
return -1;
}
while((ch=getchar())!='#'){
fputc(ch,fp);
}
fclose(fp);
return 0;
}
文件复制
#include <stdio.h>
int main(int argc, char const *argv[])
{
//文件复制
FILE *in,*out;
char ch;
in=fopen("test.txt","r");
if(in==NULL)
{
printf("打开文件失败\n");
return -1;
}
out=fopen("testcpy.dat","w");
if(out==NULL)
{
printf("打开文件失败\n");
return -1;
}
while(ch!=EOF)
{
ch=fgetc(in);
fputc(ch,out);
putchar(ch);
}
fclose(in);
fclose(out);
return 0;
}
编程题目
回文数
#include <stdio.h>
int main(int argc, char const *argv[])
{
long ge,shi,bai,qian,wan,x;
printf("请输入一个五位数:");
scanf("%ld",&x);
wan=x/10000;
qian=x%10000/1000;
bai=x%1000/100;
shi=x%100/10;
ge=x%10;
if(ge==wan&&shi==qian){
printf("这是一个回文数\n",x);
}else{
printf("这不是一个回文数\n",x);
}
return 0;
}
循环嵌套输出
#include <stdio.h>
int main(int argc, char const *argv[])
{
int f[20]={1,1};
for (int i=2;i<=20;i++)
//先求出下标0-19的值
f[i]=f[i-2]+f[i-1];
for(int i=0;i<20;i++){
//输出这20个值,每输出五个换行
if(i%5==0)
printf("\n");
printf("%6d",f[i]);
}
printf("\n");
}
使用abs函数进行绝对值的差值计算
#include <stdio.h>
#include <math.h>
int main()
{
//使用abs函数进行绝对值的差值计算
int x,y,z;
scanf("%d,%d",&x,&y);
z=abs(x-y);
printf("z=%d",z);
}
九九乘法表
#include <stdio.h>
int main() {
int i;
int j;
for (i=1;i<=9;i++){
for(j=1;j<=i;j++)
printf("%d*%d=%-3d",i,j,i*j);
printf("\n");
}
}
判断等级
#include <stdio.h>
int main() {
int x;
scanf("%d",&x);
if(x>=90)
printf("成绩等级为A");
else if (x>=80&&x<=89)
{
printf("成绩等级为B");
}
else if (x>=70&&x<=79)
{
printf("成绩等级为C");
}
else if (x>=60&&x<=69)
{
printf("成绩等级为D");
}
else if (x<60)
{
printf("成绩等级为E");
}
}
输入五个字符串,打印出长度最大的那个字符串
#include <stdio.h>
#include <string.h>
int main() {
//输入五个字符串,打印出长度最大的那个字符串
char a[5][20];
int i;
char *sp;
for (i=0;i<5;i++)
gets(a[i]);
sp=a[0];
for(i=1;i<5;i++)
if(strlen(sp)<strlen(a[i]))
sp=a[i];
printf("字符串长度最长的那个是:%s",sp);
return 0;
}