C语言编程学习
1 运算符练习
1.1输出不同类型字符
#include<stdio.h>
main()
{
int a=33,b=12,c;
char d='a';
c=a+b;/*c=33+12*/
printf("line1-c的值是%dn",c);
c=a-b;/*c=33-12*/
printf("line2-c的值是%dn",c);
c=a/b;/*c=33/12*/
printf("line3-c的值是%dn",c);
c=a*b;/*c=33*12*/
printf("line4-c的值是%dn",c);
c=a%b;/*c=33除12余9*/
printf("line5-c的值是%dn",c);
c=a++;/*c=a+1=33,a赋值34*/
printf("line6-c的值是%dn",c);
c=a--;/*c=34,a赋值33*/
printf("line7-c的值是%dn",c);
c=++a;/*先增1再赋值,a=34,c=34*/
printf("line8-c的值是%dn",c);
a+=3;/*等同于a=a+3=37*/
printf("line9-a的值是%dn",a);
a+=3+5;/*先3+5再加上a,再赋值给a=45*/
printf("line10-a的值是%dn",a);
a+=b-=5;/*从右向左,b=b-5=7,a=45+b=52*/
printf("line11-a的值是%dn",a);
a+=a-=a/=a*=a;/*a=0*/
printf("line12-a的值是%dn",a);
a++,b=a++,c=++b;/*a=0+1=1,b=a=1,a=a+1=2,b=b+1=2,c=b=2*/
printf("line13的值是a=%d,b=%d,c=%d,d=%dn",a,b,c,d);
}
1.2比较两个数大小
#include"stdio.h"
main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=a>b?a:b;
printf("a=%d,b=%d,c=%d,n",a,b,c);
}
1.3方与圆面积计算
#include<stdio.h>
main()
{
float x,y,z,a,b;
scanf("%f%f",&x,&a);
y=3.14*x*2;
z=3.14*x*x;
b=a*a;
printf("圆的半径是%f,n圆的周长是%f,n圆的面积是%f,n正方形的面积是%f,n",x,y,z,b);
}
2 常用语句学习
2.1小写字母转大写,并输出ASCii码
#include"stdio.h"
void main()
{
char c1,c2,c3,c4;
scanf("%c,%c,%c,%c",&c1,&c2,&c3,&c4);
c1-=32;
c2-=32;
c3-=32;
c4-=32;
printf("%c,%5dn",c1,c1);
printf("%c,%5dn",c2,c3);
printf("%c,%5dn",c3,c3);
printf("%c,%5dns",c4,c4);
}
2.2计算1+2+…+n之和
方法1(while)
#include"stdio.h"
main()
{
int a=0;
long n;
printf("请输入一个正整数n");
scanf("%ld",&n);
while(n>0)
{a+=n;
n--;
}
printf("连加等于%ldn",a);
}
方法2(do while)
#include"stdio.h"
void main()
{
int n,sum=0;
printf("请输入n的值n");
scanf("%d",&n);
do
{
sum+=n;
n--;
}
while(n>0);
printf("sum=%dn",sum);
}
方法3(for)
#include"stdio.h"
void main()
{
int n,sum=0;
printf("请输入n的值n");
scanf("%d",&n);
for(;n>0;n--) sum+=n;
printf("sum=%dn",sum);
}
2.3计算1*2*…*n之积(阶乘算法)
方法1(while)
#include"stdio.h"
main()
{
int a=1;
long n;
printf("请输入一个正整数n");
scanf("%ld",&n);
while(n>0)
{a*=n;
n--;
}
printf("阶乘等于%ldn",a);
}
方法2(for)
#include"stdio.h"
void main()
{
int n,sum=1;
printf("请输入n的值n");
scanf("%d",&n);
for(;n>0;n--) sum*=n;
printf("sum=%dn",sum);
}
方法3(for省略循环体)
#include"stdio.h"
void main()
{
int n,sum;
printf("请输入n的值n");
scanf("%d",&n);
for(sum=1;n>0;sum*=n,n--);
printf("sum=%dn",sum);
}
2.4计算1*1+2*2…n*n之和(while)
#include"stdio.h"
main()
{
int a=0;
long n;
printf("请输入一个正整数n");
scanf("%ld",&n);
while(n>0)
{a=a+n*n;
n--;
}
printf("平方之和等于%ldn",a);
}
2.5求得一个正整数是几位数(while)
#include<stdio.h>
main()
{
long a=0,n;
printf("请输入一个正整数n");
scanf("%ld",&n);
while(n>0)
{
n=n/10;
a++;
}
printf("这个数是%ld位数n",a);
}
2.6求圆周率π的近似值(for)
描述:求4*(1-1/3+1/5-1/7+…+/(2n-1))
#include<stdio.h>
main()
{
float x=1,y=1,z=1,sum=0;
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=x;
y+=2;
z*=-1;
x=z/y;
}
printf("%fn",sum*4);
}
2.7输入成绩,求平均成绩,输出合格人数(for)
#include<stdio.h>
main()
{
float x,avg,sum=0;
int i,n,count=0;
printf("请输入学生总人数n");
scanf("%d",&n);
printf("请依次录入学生成绩n");
for(i=0;i<n;i++)
{
scanf("%f",&x);
if(x>=60)count++;
sum+=x;
}
avg=sum/n;
printf("共有%d个学生,平均成绩avg=%f,及格人数count=%dn",n,avg,count);
}
2.8判断一个数是不是素数(for枚举求余),不是素数输出最小因数值
方法1:
#include<stdio.h>
main()
{
int x,i;
scanf("%d",&x);
for(i=2;i<x;i++)
if(x%i==0)
{
printf("最小因数为%dn",i);break;
}
if(i<x)printf("%d不是素数,最小公因数为%dn",x,i);
else printf("%d是素数n",x);
}
方法2:
#include"stdio.h"
#include"math.h"
void main()
{
int m,i,k;
printf("请输入一个整数n");
scanf("%d",&m);
for(i=2,k=sqrt(m);i<=k;i++)
if(m%i==0)break;
if(k+1==i)
printf("%d是素数n",m);
else
printf("%d不是素数,最小公因数是%dn",m,i);
}
2.9罗列任意两个数以内全部素数
#include<stdio.h>
main()
{
int x,i,m,n;
printf("请输入取值范围n");
scanf("%d %d",&m,&n);
for(x=m;x<=n;x++)
{
for(i=2;i<x;i++)
if(x%i==0)break;
if(i>=x)printf("%d ",x);
}
printf("n",x);
}
2.10求任意两个数的最大公约数
#include<stdio.h>
main()
{
int x,y,gcd;
printf("请输入两个数n");
scanf("%d %d",&x,&y);
for(gcd=x;gcd>=1;gcd--)
if(x%gcd==0 && y%gcd==0)break;
printf("%d和%d的最大公约数是%dn",x,y,gcd);
}
2.11百m元钱买百n只鸡问题:公鸡5元,母鸡3元,小鸡0.5元。
X+y+z=n;
5x+3y+0.5z=m;
#include<stdio.h>
void main()
{
int x,y,z,m,n;
printf("请分别输入钱数和鸡数n");
scanf("%d %d",&m,&n);
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
{
z=n-x-y;
if(5*x+3*y+0.5*z==m)
printf("%d只公鸡,%d只母鸡,%d只小鸡n",x,y,z);
}
}
2.12判断if else语句嵌套练习:工龄与工资结算
#include"stdio.h"
void main()
{
int year;
float s0,s;
printf("依次输入工龄,工资n");
scanf("%d,%f",&year,&s0);
if(year>=20)
{
if(s0>2000)
s=s0+200;
else s=s0+180;
}
else
{
if(s0>1500)
s=s0+150;
else s=s0+120;
}
printf("s=%fn",s);
}
2.13判断并选择switch语句:星期的大写输出
#include"stdio.h"
void main()
{
int day;
printf("请输入1-7的数字n");
scanf("%d",&day);
switch(day)
{
case 1:printf("Mondayn");break;
case 2:printf("Tuesdayn");break;
case 3:printf("Wednesdayn");break;
case 4:printf("Thursdayn");break;
case 5:printf("Fridayn");break;
case 6:printf("Saturdayn");break;
case 7:printf("Sundayn");break;
default:printf("输入有误!n");
}
}
2.14根据输入的三角形三边长,判断是否构成三角形,并计算三角形面积。
#include"stdio.h"
#include"math.h"
void main()
{
float a,b,c,p,s;
printf("请输入三角形边长n");
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));/*平方根函数,海伦公式:假设有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=√[p(p-a)(p-b)(p-c)] 而公式里的p为半周长:p=(a+b+c)/2 */
printf("s=%.2fn",s);
}
else
printf("这三条边无法构成三角形n");
}
2.15输入一个数字年月日,输出这是今年的第几天
#include"stdio.h"
main()
{
int year,month,day,sum;
printf("请输入年,月,日n");
scanf("%d,%d,%d",&year,&month,&day);
sum=day;
switch(month-1)
{
case 11:sum+=30;
case 10:sum+=31;
case 9:sum+=30;
case 8:sum+=31;
case 7:sum+=31;
case 6:sum+=30;
case 5:sum+=31;
case 4:sum+=30;
case 3:sum+=31;
case 2:if((year%4==0&&year%100!=0)||year%400==0)sum+=29;/*判断闰年的公式:四年一闰,百年不闰,四百年再闰*/
else sum+=28;
case 1:sum+=31;
}
printf("这是今年的第%d天n",sum);
}
2.16输入一行字符串,分别统计字母和数字个数
#include"stdio.h"
void main()
{
char ch;
int inum=0,ilet=0;
while((ch=getchar())!='n')/*getchar()输入单个字符*/
{
putchar(ch);
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') ilet++;
if(ch>='0'&&ch<='9') inum++;
}
printf("中字母有%d个,数字有%d个n",ilet,inum);
}
2.17编写函数,输出乘法口诀表
#include"stdio.h"
void main()
{
int i,j,k;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%2d ",j,i,i*j);
putchar('n');
}
}
2.18兔子繁殖计算Fibonacci数列
开始1对兔子,3个月后每个月都会生1对兔子,求每个月兔子总数。
#include"stdio.h"
void main()
{
int i,f1=1,f2=1,f,iMon;
printf("请输入整数月n");
scanf("%d",&iMon);
for(i=3;i<=iMon;i++)
{
f=f1+f2;
f1=f2;
f2=f;
}
printf("第%d个月时共有%d对%d只兔子!n",iMon,f,2*f);
}
2.19用公式计算π的近似值,π/4=1-1/3+1/5-1/7+...直到最后一项的绝对值小于10的-6次方。
#include"stdio.h"
#include"math.h"
void main()/*π/4=1-1/3+1/5-1/7+...*/
{
int s;
float n,t,pi=0;
for(n=1.0,t=1,s=1;fabs(t)>1e-6;n+=2,s=-s,t=s/n)pi+=t;
pi=pi*4;
printf("pi=%.6fn",pi);
}
2.20输入两个数m,n,求最大公约数和最小公倍数
#include"stdio.h"
#include"math.h"
void main()/*π/4=1-1/3+1/5-1/7+...*/
{
int m,n,k,a,b;
printf("请输入两个整数m,nn");
scanf("%d,%d",&m,&n);
a=m;
b=n;
while(k=m%n)/*辗转相除法*/
{
m=n;
n=k;
}
printf("%d和%d最大公约数为%dn",a,b,n);
printf("%d和%d最小公倍数为%dn",a,b,a*b/n);
}
2.21随机输入学生成绩,负数时结束。统计学生人数,最高成绩,最低成绩,计算平均成绩。
方法1(for循环)
#include<stdio.h>
void main()
{
int i;
float x,max,min,sum=0;
printf("请输入学生成绩n");
scanf("%f",&x);
max=min=x;
sum+=x;
for(i=1;x>0;i++)
{
scanf("%f",&x);
if(x<0)break;
sum+=x;
if(x>max)max=x;
if(x<min)min=x;
}
printf("学生总人数%d,最高成绩是%f,最低成绩是%f,平均成绩是%fn",i,max,min,sum/i);
}
方法2(while循环)
#include<stdio.h>
void main()
{
int i=0;
float x,max,min,sum=0;
printf("请输入成绩n");
scanf("%f",&x);
i++;
max=min=x;
sum+=x;
while(x>0)
{
if(x>max)max=x;
if(x<min)min=x;
scanf("%f",&x);
if(x<0)break;
i++;
sum+=x;
}
printf("总人数%d,最高成绩%f,最低成绩%f,平均成绩%fn",i,max,min,sum/i);
}
2.22若一个3位数等于其各位数的立方和,则该数为水仙花数,求3位数中所有的水仙花数。
#include<stdio.h>
void main()
{
int i,j,k,num;
for(num=100;num<1000;num++)
{
i=num%10;
j=num/10%10;
k=num/100%10;
if(num==i*i*i+j*j*j+k*k*k)printf("%dn",num);
}
}
2.23输入一个整数,逆序输出
#include<stdio.h>
void main()
{
int n,num=0;
printf("请输入整数n");
scanf("%d",&n);
while(n!=0)
{
num=num*10+n%10;/*求余得最低位*/
n/=10;/*除以10进一位*/
}
printf("%dn",num);
}
2.24编程输出三角形
#include<stdio.h>
void main()
{
int i,j,k;
for(i=1;i<=5;i++)
{
for(j=5-i;j>0;j--)
putchar('0');
for(k=i;k>0;k--)
putchar('*');
putchar('n');
}
for(i=4;i>=0;i--)
{
for(j=5-i;j>0;j--)
putchar('0');
for(k=i;k>0;k--)
putchar('*');
putchar('n');
}
}
3 数组学习
2.1两数字交换并输出最大/最小(if)
#include"stdio.h"
main()
{
int a,b,c;
scanf("%d %d",&a,&b);
if(a<b){c=a;a=b;b=c;}
else c=a;
printf("a=%d,b=%d,c=%d,n",a,b,c);
}
#include"stdio.h"
main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=a>b?a:b;
printf("a=%d,b=%d,c=%d,n",a,b,c);
}
#include"stdio.h"
main()
{
int a,b,c;
scanf("%d %d",&a,&b);
if(a>b)c=a;else c=b;
printf("a=%d,b=%d,c=%d,n",a,b,c);
}
3.1 求学生成绩平均值统计高于平均值人数
#include<stdio.h>
main()
{
int i,n,count=0;
float x[100],avg,sum=0;
printf("请输入学生人数n");
scanf("%d",&n);
printf("请分别输入学生成绩n");
for(i=0;i<n;i++)
{
scanf("%f",&x[i]);
sum+=x[i];
}
avg=sum/n;
printf("及格成绩如下:");
for(i=0;i<n;i++)
if(x[i]>avg)
{
count++;
printf("%f ",x[i]);
}
printf("n总成绩%fn平均成绩%fn及格人数%dn",sum,avg,count);
}
3.2数组初始化(fibonacci函数)
Int a[7]={1,2,3,4,5};前5个赋值,其他为0
Int a[ ]={1,2,3,4,5,6};默认6个数组
fibonacci函数:1,1,2,3,5,8,13,21****
求前n个fibonacci函数的值。
#include<stdio.h>
main()
{
int i,n,x[1000]={1,1};
printf("请输入fibonacci函数的数量n");
scanf("%d",&n);
printf("%d %d ",x[0],x[1]);
for(i=2;i<n;i++)
{
x[i]=x[i-1]+x[i-2];
printf("%d ",x[i]);
}
printf("n");
}
3.3求最大数和最小数
#include<stdio.h>
main()
{
int i,n;
float x[100],max,min;
printf("请输入学生人数n");
scanf("%d",&n);
printf("请分别输入学生成绩n");
for(i=0;i<n;i++)
scanf("%f",&x[i]);
max=x[0];
for(i=1;i<n;i++)
{
if(x[i]>max)max=x[i];
}/*找到最大值*/
min=x[0];
for(i=1;i<n;i++)
{
if(x[i]<min)min=x[i];
}/*找到最小值*/
printf("最高成绩为%fn最低成绩%fn",max,min);
更换位置:
min=x[0];
mini=0;
for(i=1;i<n;i++)
{
if(x[i]<min)
{
min=x[i];
mini=i;
}
}
t=x[i];
x[i]=min;
x[mini]=t;
3.4选择排序问题
逐一筛选法:
#include<stdio.h>
main()
{
int i,j,n,mini;
float x[100],max,min,t;
printf("请输入学生人数n");
scanf("%d",&n);
printf("请分别输入学生成绩n");
for(i=0;i<n;i++)
scanf("%f",&x[i]);
max=x[0];
for(i=1;i<n;i++)
{
if(x[i]>max)max=x[i];
}/*找到最大值*/
min=x[0];
for(i=1;i<n;i++)
{
if(x[i]<min)min=x[i];
}/*找到最小值*/
printf("最高成绩为%fn最低成绩%fn",max,min);
for(i=0;i<n-1;i++)
{
min=x[i];
mini=i;
for(j=i+1;j<n;j++)
if(x[j]<min)
{
min=x[j];
mini=j;
}
x[mini]=x[i];
x[i]=min;
}/*按从小到大排序*/
for(i=0;i<n;i++)
printf("%f ",x[i]);/*输出排列后顺序*/
printf("n");
}
3.5冒泡法排序
#include<stdio.h>
main()
{
int i,j,n;
float t,x[100];;
printf("请输入学生人数n");
scanf("%d",&n);
printf("请分别输入学生成绩n");
for(i=0;i<n;i++)
scanf("%f",&x[i]);
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(x[j]>x[j+1])
{
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
printf("从小到大排序为:n");
for(i=0;i<n;i++)
printf("%f ",x[i]);
printf("n");
}
3.6二维数组输入和输出
#include<stdio.h>
main()
{
int i,j,n,m;
int x[100][100];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&x[i][j]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%6d ",x[i][j]);
printf("n");
}
}
3.7二维数组找每一行最小值
#include<stdio.h>
main()
{
int i,j,n,m,mini,minj;
int x[100][100],min;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&x[i][j]);
for(i=0;i<n;i++)
{
min=x[i][0];
for(j=0;j<m;j++)
if(min>x[i][j])
min=x[i][j];
printf("%dn",min);
}
printf("n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%6d ",x[i][j]);
printf("n");
}
}
3.8字符数组与字符串
#include<stdio.h>
main()
{
char x[6]={'a','b','c','d','0'},a[6]="abcd",b[6],d[10],e[]="adcd e";
int c[6]={97,98,99,100},i=0;
scanf("%s",d);
gets(b);
puts(b);
printf("%sn%sn%sn%sn%s%sn",x,a,b,c,d,e);
}
输入:gets(字符数组名);
输出:puts(字符数组名);
字符串复制:strcpy(字符数组1,字符串2);
字符串连接:strcat(字符数组1,字符串2);
字符串比较大小:strcmp(字符串1,字符串2);输出ASCII值.
统计字符数(不含0):Strlen(字符数组);
大写转小写:strlwr(字符串);
小写转大写:strupr(字符串);
4函数
4.1系统标准函数
#include<stdio.h>
4.2自定义函数
函数头
{函数体}
类型标识符 函数名(形参表列)
{声明部分
语句部分}
形参表列:-类型1 形参1,类型2 形参2,.....
类型标识符void表示没有运算结果(没有返回值)
省略代表整形int
实例:
#include<stdio.h>
main()
{
int x,y,c;
scanf("%d%d",&x,&y);
c=x>y?x:y;
printf("%dn",c);
}
4.3比较两个数分大小函数调用
#include<stdio.h>
int max(int a,int b)
{
int c;
c=a>b?a:b;
return c;
}
main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("%dn",max(x,y));
}
4.4圆的面积
方法一:
#include<stdio.h>
float area(float r)
{
float s;
s=3.14*r*r;
return s;
}
main()
{
float x;
scanf("%f",&x);
printf("%fn",area(x));
}
方法二:
#include<stdio.h>
main()
{
float x;
float area(float);
scanf("%f",&x);
printf("%fn",area(x));
}
float area(float r)
{
float s;
s=3.14*r*r;
return s;
}
方法三:
#include<stdio.h>
main()
{
float x;
float area(float);
scanf("%f",&x);
printf("%fn",area(x));
}
#define PI 3.14
float area(float r)
{
float s;
s=PI*r*r;
return s;
}
4.5字符串复制strcpy(char a[],char b[])
#include<stdio.h>
void my_strcpy(char a[],char b[])
{
int i=0;
while(b[i]!='0')
{
a[i]=b[i];
i++;
}
a[i]='0';
}
4.6字符串大小比较strcmp(char a[],char b[])
int my_strcmp(char a[],char b[])
{
int i=0;
while(a[i]==b[i]&&a[i]!='0')i++;
return a[i]-b[i];
}
4.7递归求阶乘n!
#include<stdio.h>
long f(long n)
{
if(n==0)return 1;
return n*f(n-1);
}
main()
{
long n,m;
scanf("%ld",n);
m=f(n);
printf("%ldn",m);
}
4.8递归求f(x)=5-f(x-1)的值
#include<stdio.h>
int f(int x)
{
if(x>0)return 5-f(x-1);
return 0;
}
main()
{
int n;
scanf("%d",&n);
printf("%dn",f(n));
}
5预处理
5.1变量
默认auto局部变量:函数体内使用
全局static全局变量:程序开始至程序结束
register:类似auto,但存储空间在寄存器中
全局变量前加extern声明
举例:
#include<stdio.h>
int f(int i)
{
int c=0;
c+=i;
return c;
}
main()
{
int i,sum;
for(i=0;i<10;i++)sum=f(i);
printf("%dn",sum);
}
5.2宏定义
#define 标识符 字符串
5.2.1宏定义常量
#include<stdio.h>
main()
{
float x;
float area(float);
scanf("%f",&x);
printf("%fn",area(x));
}
#define PI 3.14
float area(float r)
{
float s;
s=PI*r*r;
return s;
}
5.2.2宏定义表达式
#include<stdio.h>
#define x 2
#define y 1+1
main()
{
int a,b;
a=x*4;
b=y*4;
printf("%d,%dn",a,b);
}
5.2.3宏定义变量表达式
#include<stdio.h>
#define x 2
#define y (x+1)
main()
{
int a,b;
a=x*4;
b=y*4;
printf("%d,%dn",a,b);
}
5.2.4宏定义语句
#include<stdio.h>
#define x 2
#define y(a,b) c=a+b;d=a-b;
main()
{
int a,b,c,d;
a=x*4;
b=x+4;
y(a,b);
printf("%d,%d,%d,%dn",a,b,c,d);
}
5.3声明
插入系统文件进行编译:
#include<stdio.h>在option目录下找
或者#include"stdio.h"在option和当前目录
5.4条件编译
#ifdef 标识符
程序段1
#else
程序段2
#endif
6指针
6.1概念
指针变量:
基类型 *指针变量名
例如:Int *p
#include"stdio.h"
main()
{
int a[6]={1,2,3,4},*p,i;
p=a;
for(i=0;i<3;i++)
{
printf("%dn",*p);
p++;
}
}
6.2指针字符串
#include"stdio.h"
main()
{
char a[6]="abcd";
char *p;int i;
p=a;
for(i=0;i<3;i++)
{
printf("%sn",p);/*每次从当前位置开始输出*/
p++;
}
}
*p为内容,*p+1内容+1,*(p+1)为地址+1,*a为a[0]
6.3用指针访问数组元素
#include"stdio.h"
main()
{
int a[5],*p, i;
p=a;
for(i=0;i<5;i++)
scanf("%d",p++);/* scanf("%d",a+i)*/
for(i=0;i<5;i++)
printf("%dn",a[i]);/*a[i]==*(a+i)*/
}
6.4字符串的指针和指向字符串的指针变量
#include"stdio.h"
main()
{
char c='x',*p=&c,*q="abcd",*m;
m="xyz";
printf("%c,%c,%s,%sn",*p,*q,q,q+1);
}
6.5字符(串)指针作为函数参数
#include"stdio.h"
main()
{
char *p,a[10];
scanf("%s",*p);/*p="abc"*/
scanf("%s",a);/*a="abc"*/
printf("%s,%sn",*p,a);
}
6.6二维数组与指针
#include"stdio.h"
main()
{
int *p,*q,a[4]={7,8,9,0},b[2][3]={1,2,3,4,5,6};
p=a+1;
q=b[0];
printf("%d,%d,%d,%dn",*p,*q+1,*a,**b);/*输出8,2,7,1*/
}
6.7指针数组与指针的指针
#include"stdio.h"
main()
{
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[4]={a,a+3,a+6,a+9};
printf("%dn",p[2][2]);/*p[2][2]==*(p[2]+2)输出9*/
}
7结构体和共用体
定义格式:
struct 类型名{ 成员类型1 成员名1;成员类型2 成员名2;};
7.1结构体类型定义
struct t1{int x;float y;}a;/*无名类型*/
7.2结构体变量的定义与赋值
struct t1 a;
7.3成员运算符.
a.x=10;
a.y=20;
7.5指向结构体类型的指针
struct node{int a;float b;}x,*p;p=&x;
x.a等同p->a等同(*p).a
实例:
struct node{int a;int b;}a[10],*p=a;
p->a;p指向a[0]
p++;p指向a[1]
++p->a;先p->a,再对内容自增1
(++p)->a;p指向a[2]
7.6综合练习
#include<stdio.h>
struct s{int x,*y;}*p;
int data[5]={10,20,30,40,50};
struct s
array[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]};
main()
{p=array;
printf("%dn",p->x);/*100*/
printf("%dn",(*p).x);/*100*/
printf("%dn",*p->y);/*10*/
printf("%dn",*(*p).y);/*10*/
printf("%dn",++p->x);/*101*/
printf("%dn",(++p)->x);/*200*/
printf("%dn",p->x++);/*200*/
printf("%dn",p->x);/*201*/
printf("%dn",++(*p->y));/*21*/
printf("%dn",++*p->y);/*22*/
printf("%dn",*++p->y);/*30*/
printf("%dn",p->x);/*201*/
printf("%dn",*(++p)->y);/*30*/
printf("%dn",p->x);/*300*/
printf("%dn",*p->y++);/*30*/
printf("%dn",p->x);/*300*/
printf("%dn",*(p->y)++);/*40*/
printf("%dn",p->x);/*300*/
printf("%dn",*p++->y);/*50*/
printf("%dn",p->x);/*400*/
}
7.4结构体变量初始化
#include<stdio.h>
struct t1
{int x;
float y;};
struct t2
{char c;
struct t1 b;};
struct t1 a={10,1.5}
struct t2 b={'a',10,1.5}
7.5结构体数组
struct t1
{int x[10];
float y;}
struct t1 a,b[5];
例如:
#include<stdio.h>
struct t
{char name[10];
int age;};
main()
{
struct t student[10];
scanf("%s,%d",student[0].name,&student[0].age);
}
7.7共用体
与结构体不同在,选取最大空间。相同都是从头开始。
Union 类型名{成员类型1 成员1;成员类型2 成员2;}
与结构体定义一致。
#include"stdio.h"
union t1
{
int x;
float y;
};
struct t2
{
int x;
float y;
};
main()
{
union t1 a,*p;
a.x=10;
a.y=1.5;
p=&a;
p->x;
p->y;
printf("%dn",a.x);/*输出无效数字*/
struct t2 b,*q;
b.x=10;
b.y=1.5;
q=&b;
q->x;
q->y;
printf("%dn",b.x);/*输出10*/
}
7.8枚举类型
enum 类型名(枚举常量1,枚举常量2,枚举常量3);
Enum 类型名 变量;
变量=枚举常量1;
7.9用typedef定义类型
typedef 已有类型名 新的标识符;
typedef int integer;以后integer就当int用
7.10用typedef定义数组或指针
typedef int A[10];
typedef int *P;
A a,b;P p1,p2;
A、P是类型名,a、b是整形数组,p1、p2是整形指针;
7.11用typedef定义结构体、共用体、枚举等类型
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
8 位运算(&、|、^、~、>>、<<)
& 与 两个位都为1时,结果才为1
| 或 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0例如~5是-(5+1)等于-6;-6取反+(6-1).
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
*=、+=、-=、<<=、>>=、&=等自反运算符

练习
1.输入字符和数字,分别统计个数
方法1:
#include"stdio.h"
main()
{
int count1=0,count2=0;
char c;
while((c=getchar())!='n')
if(c>='a'&&c<='z'||c>='A'&&c<='Z')count1++;
else if(c>='0'&&c<='9')count2++;
printf("%d个字母,%d个数字n",count1,count2);
}
方法2:
#include"stdio.h"
main()
{
int count1=0,count2=0,i=0;
char c[100];
gets(c);
while(c[i]!='0')
{
if(c[i]>='a'&&c[i]<='z'||c[i]>='A'&&c[i]<='Z')count1++;
else if(c[i]>='0'&&c[i]<='9')count2++;
i++;
}
printf("%d个字母,%d个数字n",count1,count2);
}
2.strcat函数的编写
#include"stdio.h"
main()
{
int i=0,j=0;
char a[100],b[100];
gets(a);
gets(b);
while(a[i]!='0')i++;
while(b[j]!='0')
{
a[i]=b[j];
i++;
j++;
}
a[i]='0';
puts(a);
}
3.从键盘输入10个证整数,输出最小值
方法1:
#include"stdio.h"
main()
{
int i,a[10],min;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
min=a[0];
for(i=0;i<10;i++)
if(min>a[i])
min=a[i];
printf("%dn",min);
}
方法2:
#include"stdio.h"
main()
{
int i,x,min;
scanf("%d",&x);
min=x;
for(i=0;i<9;i++)
{
scanf("%d",&x);
if(min>x)
min=x;
}
printf("%dn",min);
}
4.从键盘输入10个字符,然后相反次序输出
#include"stdio.h"
main()
{
char a[10],i;
for(i=0;i<10;i++)
scanf("%c",&a[i]);
for(i=9;i>=0;i--)
printf("%c",a[i]);
printf("n");
}
5.键盘输入10个整数,求他们的平均值和整数个数
#include"stdio.h"
main()
{
int i,x,sum,count,agv;
sum=count=agv=0;
for(i=0;i<10;i++)
{
scanf("%d",&x);
sum+=x;
if(x>0)count++;
}
agv=sum/10.0;
printf("%d,%dn",agv,count);
}
韩国全2020-11-25学习完毕