最近在准备考研,专业课是C语言,这是我学习C语言后整理的一些常见代码,感觉挺适合作为学习的参考代码,发到csdn上和大家分享一下,如有错误,还请大家多多指正。
1.
/*
用pi/4=1-1/3+1/5-1/7+.....公式求pi近似值,直到发现某一项的绝对值小于1*e-6
*/
#include <stdio.h>
#include <math.h>
int main()
{
double sum=0,n=1.0,pi;
int sign=1;
while(fabs(1/n)>=1e-6)
{
sum=sum+sign/n;
sign=-sign;
n=n+2;
}
pi=4*sum;
printf("%lf\n",pi);
return 0;
}
2.
/*
输出1-100以内的素数。
*/
#include <stdio.h>
int main()
{
int i,j;
for(i=2;i<100;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j>=i)
printf("素数=%d\n",i);
}
return 0;
}
/*
筛选法求100以内的素数
*/
#include <stdio.h>
int main()
{
int a[101];
int i,j;
for(i=1;i<=100;i++)
a[i]=i;
a[1]=0;
for(i=1;i<=100;i++)
for(j=2;j<i;j++)
if(a[i]%j==0)
a[i]=0;
for(i=1;i<=100;i++)
if(a[i]!=0)
printf("%d\n",a[i]);
return 0;
}
3.
/*
译密码,A-E,a-e,Z-D,z-d;这种形式
*/
#include <stdio.h>
int main()
{
char c;
while((c=getchar())!='\n')
{
if(c<='z'&&c>='a'||c<='Z'&&c>='A')
if(c>='W'&&c<='Z'||c>='w'&&c<='z')
c=c-22;
else
c=c+4;
printf("%c",c);
}
printf("\n");
return 0;
}
4.
/*
求最大公约数和最大公倍数:
相减法
*/
#include <stdio.h>
int main()
{
int m,n,c,a,b;
printf("please enter:");
scanf("%d,%d",&m,&n);
a=m;
b=n;
while(m!=n)
if(m>n)
m=m-n;
else
n=n-m;
c=a*b/m;
printf("最大公约数:%d\n",m);
printf("最大公倍数:%d\n",c);
return 0;
}
#include <stdio.h>
#include <math.h>
/*
* 最大公约数的递归:
* 1、若a可以整除b,则最大公约数是b
* 2、如果1不成立,最大公约数便是b与a%b的最大公约数
* 示例:求(140,21)
* 140%21 = 14
* 21%14 = 7
* 14%7 = 0
* 返回7
* */
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int main(void)
{
int a=10,b=8;
scanf("%d %d",&a,&b);
printf("GCD: A=>%d, B=>%d (A,B)=%d (A,B**)=%d\n",a,b,gcd(a,b),a*b/gcd(a,b));
return 0;
}
5.
/*
求完数
*/
#include <stdio.h>
int main()
{
int i,j,s;
for(i=1;i<1000;i++)
{
s=0; //注意s=0,不能声明全局变量
for(j=1;j<i;j++)
if(i%j==0)
s=s+j;
if(s==i)
{
printf("%d its factors are ",s);
for(j=1;j<i;j++)
if(i%j==0)
printf("%d,",j);
printf("\n"); //注意换行
}
}
return 0;
}
6.
/*
打印
*
***
*****
*******
*****
***
*
*/
#include <stdio.h>
int main()
{
int i,j,k;
for(i=1;i<=4;i++)
{
for(j=0;j<4-i;j++)
printf(" ");
for(k=0;k<2*i-1;k++)
printf("*");
printf("\n");
}
for(i=1;i<=3;i++)
{
for(j=0;j<i;j++)
printf(" ");
for(k=0;k<7-2*i;k++)
printf("*");
printf("\n");
}
return 0;
}
7.
/*
冒泡法对10个数进行排序
*/
#include <stdio.h>
int main()
{
int t,i,j,k;
int a[10];
printf("please enter:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(j=0;j<9;j++)
{
for(k=0;k<9-j;k++)
{
if(a[k]>a[k+1])
{
t=a[k];
a[k]=a[k+1];
a[k+1]=t;
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
/*
选择法进行排序
*/
#include <stdio.h>
int main()
{
int t,i,j,k,min;
int a[10];
printf("please enter:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(j=0;j<9;j++)
{
min=j;
for(k=j+1;k<10;k++)
{
if(a[min]>a[k])
{min=k;
t=a[j];
a[j]=a[min];
a[min]=t;
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
8.
/*
输出3阶矩阵的对角线的和
*/
#include <stdio.h>
int main()
{
int a[3][3];
int i,j,sum=0;
printf("please enter:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf(" %d",a[i][j]);
printf("\n");
}
for(i=0;i<3;i++)
sum=sum+a[i][i];
printf("对角线和为:%d\n",sum);
return 0;
}
9.
/*
在一个排序完成的数组中,插入一个数,排序的顺序不变
*/
#include <stdio.h>
int main()
{
int number,i,j,t1,t2;
int a[11]={1,4,23,26,34,45,67,78,86,91};
printf("The old line:");
for(i=0;i<10;i++)
printf(" %d",a[i]);
printf("\n");
printf("please enter:");
scanf("%d",&number);
printf("\n");
if(number>=a[9])
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)
{
t1=a[i];
a[i]=number;
for(j=i+1;j<11;j++)
{
t2=a[j];
a[j]=t1;
t1=t2;
}
break;
}
}
}
printf("The new line:");
for(i=0;i<11;i++)
{
printf(" %d",a[i]);
}
printf("\n");
return 0;
}
10.
/*
数组做实参,求出10个数中的最大值
*/
#include <stdio.h>
int main()
{
int max(int x,int y);
int a[10];
int i,n=0;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
int m=a[0];
printf("\n");
for(i=1;i<10;i++)
{
if(max(m,a[i])>m)
{
m=a[i];
n=i+1;
}
}
printf("max=%d\nlocation=%d\n",m,n);
return 0;
}
int max(int x,int y)
{
return x>y?x:y;
}
11.
/*
递归调用求n的阶乘
*/
#include <stdio.h>
int main()
{
int fac(int x);
int n,y;
scanf("%d",&n);
y=fac(n);
printf("%d\n",y);
return 0;
}
int fac(int x)
{
int f;
if(x==0||x==1)
f=1;
else
f=x*fac(x-1);
return f;
}
12.
/*
输入10个员工的姓名和工号,工号排序后输出,输入工号输出对应的员工姓名和工号。
*/
#include <stdio.h>
#include <string.h>
int main()
{
int num[10],a;
char nam[10][10];
void input_xx(int number[10],char name[10][10]);
void sort(int number[10],char name[10][10]);
void find(int a,int number[10],char name[10][10]);
input_xx(num,nam);
sort(num,nam);
printf("please enter number:");
scanf("%d",&a);
find(a,num,nam);
return 0;
}
void input_xx(int number[10],char name[10][10])
{
int i;
printf("please enter name and number:\n");
for(i=0;i<10;i++)
{
printf("Num:");
scanf("%d",&number[i]);
printf("Name:");
getchar();
gets(name[i]);
}
printf("\n");
}
void sort(int number[10],char name[10][10])
{
int i,j,t1;
char t2[10];
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
{
if(number[j]>number[j+1])
{
t1=number[j];
number[j]=number[j+1];
number[j+1]=t1;
strcpy(t2,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],t2);
}
}
for(i=0;i<10;i++)
{
printf("Num:%d ",number[i]);
printf("Name:");
puts(name[i]);
}
printf("\n");
}
void find(int a,int number[10],char name[10][10])
{
int n;
for(int i=0;i<10;i++)
{
if(a==number[i])
{
n=i;
break;
}
}
printf("Num:%d ",number[n]);
printf("Name:");
puts(name[n]);
}
13.
/*
折半查找法
*/
#include <stdio.h>
int main()
{
int a[10],m,n,flag,mid,low=0,high=9;
printf("please enter a[10]:");
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
printf("please enter number:");
scanf("%d",&n);
printf("\n");
while(low<=high)
{
mid=(low+high)/2;
printf("low=%d,mid=%d,high=%d\n",low,mid,high);
if(n<a[mid])
high=mid-1;
if(n>a[mid])
low=mid+1;
if(n==a[mid])
{
flag=1;
m=mid;
break;
}
}
if(flag==1)
{
printf("%d\n",a[m]);
}
return 0;
}
14.
/*
对3*3矩阵进行转置后输出
*/
#include <stdio.h>
int main()
{
int inverse(int a[3][3],int b[3][3]);
int a[3][3]={ {1,2,3},{4,5,6},{7,8,9}};
int b[3][3];
inverse(a,b);
for(int c=0;c<3;c++)
{
for(int d=0;d<3;d++)
printf(" %d",b[c][d]);
printf("\n");
}
return 0;
}
int inverse(int a[3][3],int b[3][3])
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
b[j][i]=a[i][j];
return b[3][3];
}
15.
/*
用递归法将一个整数n转换为字符串
*/
#include<stdio.h>
void convert(int n)
{
int i;
if ((i = n / 10) != 0)
convert(i);
putchar(n%10+48);
putchar(' ');
}
int main()
{
int num;
scanf("%d", &num);
if (num < 0) {
printf("-");
num = -num;
}
convert(num);
printf("\n");
return 0;
}
16.
/*
试图将a,b按照由大到小的顺序输出,但是实参—>形参只能单向值传递,不能试图改变
形参的值去影响实参。
Eg:输入:3,5
输出:3,5
*/
#include <stdio.h>
void change(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
if(a<b)
change(a,b);
printf("%d %d\n",a,b);
return 0;
}
/*
试图将a,b按照由大到小的顺序输出,但是实参—>形参只能单向值传递,不能试图改变
形参的值去影响实参。
Eg:输入:3,5
输出:3,5
*/
#include <stdio.h>
void change(int *x,int *y)
{
int *t;
t=x;
x=y;
y=t;
}
int main()
{
int *p1,*p2;
int a,b;
scanf("%d %d",&a,&b);
p1=&a;p2=&b;
if(a<b)
change(p1,p2);
printf("%d %d\n",*p1,*p2);
return 0;
}
/*
通过指针改变了a,b的大小输出顺序。
这个程序并不是由形参-à实参的值传递,而是将指针变量p1,p2的所指向地址的值改变l
也就是改变a,b的地址中的值。
Eg:输入:3,6
输出:6,3
*/
#include <stdio.h>
void change(int *x,int *y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
int main()
{
int *p1,*p2;
int a,b;
scanf("%d %d",&a,&b);
p1=&a;p2=&b;
if(a<b)
change(p1,p2);
printf("%d %d\n",*p1,*p2);
return 0;
}
17.
/*
通过指针对10个数组元素按倒序输出,指针变量做实参
用数组变量做实参,只需要将over(pa,10);改为over(arr,10);
实质上数组也是地址,arr就是数组首元素的地址。
注意:
循环结束后,指针要重新指向数组的首元素的地址(即p=arr),否者,指针指向的是数组末元素的后一个元素的地址,也就是arr[10]。
*/
#include <stdio.h>
int main()
{
void over(int *p,int n);
int arr[10],*pa;
/*让指针变量pa指向arr数组首元素的地址,在循环中pa小于末尾元素后一个地址*/
for(pa=arr;pa<(arr+10);pa++)
{
scanf("%d",pa);
}
printf("\n");
pa=arr; //一定要注意在循环结束后,指针重新指向数组的首元素的地址
over(pa,10); //倒序函数,目的是使数组的元素按照倒序输出
for(pa=arr;pa<(arr+10);pa++)
{
printf("%d ",*pa);
}
printf("\n");
return 0;
}
void over(int *p,int n)
{
int *x,*i,t,m;
m=(n-1)/2;
x=p+n-1;
i=p; //注意此步不可省略
for(;i<=(p+m);i++,x--) //不能将其写为for(;p<=(p+m);p++,x--)
{
t=*i;
*i=*x;
*x=t;
}
}
/*
用冒泡法,指针做实参,对数组的10个元素由大到小输出。
*/
#include <stdio.h>
int main()
{
void sort(int *p,int n);
int arr[10],*pa;
for(pa=arr;pa<(arr+10);pa++)
{
scanf("%d",pa);
}
printf("\n");
pa=arr;
printf("bbbb\n");
sort(pa,10);
printf("aaaaa\n");
for(pa=arr;pa<(arr+10);pa++)
{
printf("%d ",*pa);
}
printf("\n");
return 0;
}
void sort(int *p,int n)
{
int *a,*b,i,j,m,t;
m=n-1;
for(i=0;i<m;i++)
for(j=0;j<m-i;j++)
{
a=p+j;
b=p+j+1;
if(*a<*b) //指针指向的地址的原素值的大小比较。
{
t=*a;
*a=*b;
*b=t;
}
}
}
18.
/*
1.指针指向二维数组;
2.输入二维数组的值
3.用指针形式输出值
4.解释:
二维数组实际上是数组中的数组,在数组中数组,即a[i][j],实际上是[i]中存放[j]的地址
eg:*(*(p+2)+3)
p+2是指第二行首元素的地址,即&a[2]
*(p+2)是取值,取得是第二行首元素的地址,即a[2][0]的地址
*(*(p+2))是取地址所指向的值,即a[2][0]的值
*(p+2)+3指的是a[2][3]的地址,即&a[2][3]
*(*(p+2)+3)取值,取得是a[2][3]所指的地址所指向的值,即a[2][3]的值
*/
#include <stdio.h>
int main()
{
int a[3][4];
int (*p)[4]; //定义二维数组指针变量的格式
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",*(p+i)+j); //将i行j列的值输入到指针指向的i行j列的地址中
p=a; //将指针重新指向二维数组的首行首列的地址
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d ",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}
19.
/*
字符型指针变量做形参和实参;
复制一串字符给b,并输出b
*/
#include <stdio.h>
int main()
{
void fuzhi(char *p1,char *p2);
char *x="I am a student.";
char b[20],*y;
y=b;
fuzhi(x,y);
y=b;
printf("%s\n",y);
printf("%s\n",b);
}
void fuzhi(char *p1,char *p2)
{
for(;*p1!='\0';*p1++,*p2++)
{
*p2=*p1;
}
*p2='\0';
}
20.
/*
指向函数的指针使用
实质:指针指向的永远都是地址,每一个语句(包括函数)在电脑执行是都会有一个地址,
用指针指向函数入口地址,即为指向函数的指针。
*/
#include <stdio.h>
int main()
{
int max(int a,int b);
int min(int c,int d);
int (*p)(int,int); //指向函数的指针的定义格式
int x,y,z,mode;
printf("please enter 2 numbers:");
scanf("%d %d",&x,&y);
printf("please choose mode:(1-->max,2-->min):");
scanf("%d",&mode);
if(mode==1)
{
p=max; //指针指向函数max()的入口地址
z=(*p)(x,y); //通过对函数入口地址的调用从而调用函数
printf("max=%d\n",z);
}
if(mode==2)
{
p=min;
z=(*p)(x,y);
printf("min=%d\n",z);
}
return 0;
}
int max(int a,int b)
{
return a>b?a:b;
}
int min(int c,int d)
{
return c<d?c:d;
}
21.
/*
指向函数的指针做函数的参数;
选择模式1,输出两个数的大的值
选择模式2,输出两个数的小的值
选择模式3,输出两个数的和
*/
#include <stdio.h>
int main()
{
int max(int,int);
int min(int,int);
int sum(int,int);
void fun(int m,int z,int (*p)(int,int));
int x,y,m;
printf("please enter 2 numbers:");
scanf("%d %d",&x,&y);
printf("please choose 1,2 or 3:");
scanf("%d",&m);
if(m==1)fun(x,y,max);
if(m==2)fun(x,y,min);
if(m==3)fun(x,y,sum);
return 0;
}
void fun(int m,int n,int (*p)(int,int))
{
int z;
z=(*p)(m,n);
printf("%d\n",z);
}
int max(int a,int b)
{
printf("max=");
return a>b?a:b;
}
int min(int c,int d)
{
printf("min=");
return c<d?c:d;
}
int sum(int e,int f)
{
printf("sum=");
return e+f;
}
22.
/*
输入10个数,最小的数与第一个数对换,最大的数与最后一个对换。
定义:
输入函数
处理函数
输出函数
*/
#include <stdio.h>
int main()
{
int a[10];
int *p;
p=a; //指针指向数组a的首元素的地址
void input(int *p0); //声明输入函数
void sort(int *p1,int n); //声明处理函数
void output(int *p2); //声明输出函数
input(p);
sort(p,10);
output(p);
return 0;
}
void input(int *p0)
{
int *p;
p=p0;
for(;p<(p0+10);p++)
{
scanf("%d",p);
}
}
void sort(int *p1,int n)
{
int max,min,i,t,q,k,l;
max=min=*p1;
for(i=0;i<n;i++)
{
if(max<=*(p1+i)) //<=是因为最后一个为最大值时,交换不出错
{
max=*(p1+i);
k=i; //记录最大值位置
}
if(min>=*(p1+i)) //>=是因为第一个为最小值时,交换不出错
{
min=*(p1+i);
l=i; //记录最小值位置
}
}
printf("max=%d min=%d\n",max,min);
t=*(p1+9);*(p1+9)=*(p1+k);*(p1+k)=t; //交换值
q=*p1;*p1=*(p1+l);*(p1+l)=q;
}
void output(int *p2)
{
int *p;
p=p2;
for(;p<(p2+10);p++)
{
printf("%d ",*p);
}
printf("\n");
}
21.
n个整数,使前面的各个数后移m个位置,最后的m个数变为前面的m个数。
eg:n=7,m=3;1 2 3 4 5 6 7--->5 6 7 1 2 3 4
方法一:递归调用
#include <stdio.h>
int main()
{
void move(int a[20],int m1,int n1);
int m,n;
printf("How many number?");
scanf("%d",&n);
int a[20],*p;
p=a;
printf("Please enter 'n' numbers:\n");
for(;p<(a+n);p++)
scanf("%d",p);
p=a;
printf("How many place you want move?");
scanf("%d",&m);
move(p,m,n);
p=a;
printf("The new sort is:\n");
for(;p<(a+n);p++)
printf("%d ",*p);
printf("\n");
return 0;
}
void move(int b[20],int m1,int n1)
{
int *a,arr;
arr=*(b+n1-1);
a=b+n1-1; //让a指向数组最后一个元素地址
for(;a>b;a--)
{
*a=*(a-1); //将前一个地址的值赋给后一个
}
m1--;
*b=arr; //让数组b的首元素为最后一个元素的值
printf("\n");
if(m1>0)
move(b,m1,n1);
}
方法2:冒泡
#include <stdio.h>
int main()
{
void move(int *p1,int m1,int n1);
int m,n;
printf("How many number?");
scanf("%d",&n);
int a[20],*p;
p=a;
printf("Please enter 'n' numbers:\n");
for(;p<(a+n);p++)
scanf("%d",p);
p=a;
printf("How many place you want move?");
scanf("%d",&m);
move(p,m,n);
p=a;
printf("The new sort is:\n");
for(;p<(a+n);p++)
printf("%d ",*p);
printf("\n");
return 0;
}
void move(int *p1,int m1,int n1)
{
int i,j,t;
for(i=0;i<n1-1;i++)
{
for(j=0;j<n1-1;j++)
{
t=*(p1+j);
*(p1+j)=*(p1+j+1);
*(p1+j+1)=t;
}
m1--;
if(m1<0)
break;
}
}
22.
/*
要求:有n个人围成一圈,顺序报号。从第一个开始报号(1-3报数),报到3的人出列,问最后列下的是第几号人。
即:假设有7个人,1---1,2---2,3---3(出列),4---1,5---2,6---3(出列),7---1,1---2,2---3(出列)
基本思想:
(1).定义一个一维数组a。(2)将每个人赋值,a[0]=1,a[1]=2......
(3)报数到3的人赋值0。(4)只要出列人数多于1就继续循环
*/
#include <stdio.h>
int main()
{
int a[50],*p;
int n,i,m,k; //n为总人数,m为人数控制变量(即出列一人m加1),k为报数变量(1--3)
p=a;
printf("please enter the number of human:");
scanf("%d",&n);
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1) //只要出列人数多于1就继续循环
{
if(*(p+i)!=0)
k++;
if(k==3)
{
*(p+i)=0; //出列人置0
m++;
k=0;
}
i++;
if(i==n)
i=0; //循环一圈,i重新置0
}
while(*p==0)
p++; //输出所有元素中值不为0的元素的位置
printf("The last one is:%d\n",*p);
return 0;
}
23.
/*
要求:有一个班4个学生,5门课程。定义以下三个函数
(1)求第一门课程平均成绩;
(2)找出有两门以上课程成绩不及格(<60)的学生,输出他们的学号和全部课程成绩
(3)找出平均成绩90分以上的或者全部课程85以上的学生,输出学号。
*/
#include <stdio.h>
int main()
{
void average(int (*score)[5]);
void failure_2(int (*score)[5],int *number);
void success(int (*score)[5],int *number);
int sco[4][5],num[4],(*p_s)[5],*p_n;
int i,j;
p_s=sco;p_n=num;
printf("Please input student's number:");
for(;p_n<(num+4);p_n++)
scanf("%d",p_n);
printf("Please input student's score:\n");
for(i=0;i<4;i++)
for(j=0;j<5;j++)
scanf("%d",*(p_s+i)+j);
p_s=sco;p_n=num;
average(p_s);
failure_2(p_s,p_n);
success(p_s,p_n);
return 0;
}
void average(int (*score)[5])
{
int i,aver,sum=0;
for(i=0;i<4;i++)
sum=sum+*(*(score+i)+0);
aver=sum/4;
printf("The average score of the first course is:%d\n",aver);
}
void failure_2(int (*score)[5],int *number)
{
int i,j,n,k,ave,sum;
for(i=0;i<4;i++)
{
n=0;sum=0;
for(j=0;j<5;j++)
if(*(*(score+i)+j)<60)
n++;
if(n>=2)
{
printf("number:%d,",*(number+i));
printf("score:");
for(k=0;k<5;k++)
{
printf("%d ",*(*(score+i)+k));
sum=sum+*(*(score+i)+k);
}
printf(",");
ave=sum/5;
printf("average:%d\n",ave);
}
}
}
void success(int (*score)[5],int *number)
{
int i,j,n,sum,ave;
for(i=0;i<4;i++)
{
n=0;sum=0;
for(j=0;j<5;j++)
{
if(*(*(score+i)+j)>=85)
n++;
sum=sum+*(*(score+i)+j);
}
ave=sum/5;
if(n==5||ave>=90)
{
printf("excellent score:%d\n",*(number+i));
}
}
}
24.关于预处理命令#define和typedef的区别
1.#define是编译预处理指令,在编译预处理时换,不作正确性检查,不论是否正确只进行带入替换,只有在编译已被展开的源程序时才会发现可能的错误并报错。
2.typedef为C语言的关键字,在编译时处理,有类型检查功能,作用是为一种数据类型定义一个新名字。
区别:使用typedef时是一条语句要加分号。
eg:
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换
typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符
25.#include<>和#include" "的区别
1.引用的头文件不同
#include< >引用的是编译器的类库路径里面的头文件。
#include“ ”引用的是你程序目录的相对路径中的头文件。
2.用法不同
#include< >用来包含标准头文件(例如stdio.h或stdlib.h).
#include“ ”用来包含非标准头文件。
3.调用文件的顺序不同
#include< >编译程序会先到标准函数库中调用文件。
#include“ ”编译程序会先从当前目录中调用文件。
4.预处理程序的指示不同
#include< >指示预处理程序到预定义的缺省路径下寻找文件。
#include“ ”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。
eg:
1、#include< >
#include< > 引用的是编译器的类库路径里面的头文件。
假如你编译器定义的自带头文件引用在 C:\Keil\c51\INC\ 下面,则 #include<stdio.h> 引用的就是 C:\Keil\c51\INC\stdio.h 这个头文件,不管你的项目在什么目录里,C:\Keil\c51\INC\stdio.h 这个路径就定下来了,一般是引用自带的一些头文件。
2、#include" "
#include" " 引用的是你程序目录的相对路径中的头文件。
假如你的项目目录是在 D:\Projects\tmp\ ,则 #include"my.h" 引用的就是 D:\Projects\tmp\my.h 这个头文件,一般是用来引用自己写的一些头文件。如果使用 #include" " ,它是会先在你项目的当前目录查找是否有对应头文件,如果没有,它还是会在对应的引用目录里面查找对应的头文件。例如,使用 #include "stdio.h" 如果在你项目目录里面,没有 stdio.h 这个头文件,它还是会定位到 C:\Keil\c51\INC\stdio.h 这个头文件的。
26.
/*
投票程序,一共10票,输入选的人的姓名,统计得票数
使用结构体,并用指针操作。
注意指针指向结构体时的指针用法
以下三个语句作用相同
设:p=man;
(1)man[i].name;
(2)(*(p+i)).name;
(3)((p+i)->name;
*/
#include <stdio.h>
#include <string.h>
struct Person //声明结构体为Person类型
{
char *name;
int count;
}; //此处可以定义结构体变量,也可以不定义,在main函数定义(即man[3]为结构体数组)
int main()
{
/*定义结构体数组man[3],即为包含三个元素的结构体数组,并赋初值*/
struct Person man[3]={"Wa",0,"Li",0,"Zha",0};
struct Person *m; //定义结构体指针
m=man; //指针指向结构体数组man
int i,j;
char v_name[20];
printf("\t^-^Welcome to Voter station^_^\n");
for(i=0;i<10;i++)
{
printf("Please enter the %d voter:",i+1);
scanf("%s",v_name); //输入所投票的人的姓名
for(j=0;j<3;j++) //一次遍历结构体数组元素
{
if(strcmp(v_name,(*(m+j)).name)==0) //输入的姓名和指针指向的数组元素相同
(*(m+j)).count++;
}
}
printf("\nThis is result\n");
for(i=0;i<3;i++)
{
printf("%5s:%d\n",(*(m+i)).name,(*(m+i)).count);
}
return 0;
}
27.
/*
有三个学生,包含学号,姓名,三科成绩,每个学生平均成绩
输出平均成绩最高的学生的全部信息。
要求:
0.结构体变量的指针做函数实参;
1.定义输入数据和求平均成绩函数input();
2.定义找出平均成绩最高函数max();
3.定义输出函数print(),输出最高成绩学生信息。
思路:
1.首先想到结构体,结构体内包含学生的学号int型,姓名char型数组,三科成绩float型数组,
平均成绩float型数组
2.先定义结构体Student,然后定义三个函数。其中max函数为Student型函数,返回值为Student
变量。在print函数中调用max函数。
*/
#include <stdio.h>
struct Student
{
int num;
char name[10];
float score[3];
float average;
};
int main()
{
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stud);
struct Student stu[3]; //声明结构体数组stu[3]
struct Student *p_s;
p_s=stu; //指针指向结构体变量
input(p_s);
print(max(p_s));
return 0;
}
void input(struct Student stu[])
{
int i;
printf("Please input information of everyone,including,num、name、3 scores:\n");
for(i=0;i<3;i++)
{
scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
}
struct Student max(struct Student stu[])
{
int i,m=0;
for(i=0;i<3;i++)
{
if(stu[i].average>stu[m].average)
m=i;
}
return stu[m];
}
void print(struct Student stud)
{
printf("\n\nThe highest score is:\n");
printf("Number:%d\nName:%s\nScores:%f,%f,%f\nAverage:%f\n",stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.average);
}
28.结构体和共用体区别:
结构体:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。
共用体:共用体变量所占的内存长度等于最长的成员的长度。
eg:union{ struct{
int i; int i;
char ch; char ch;
float f; float f;
}; };
长度=4 长度=4+1+4=9
29.
/*
有若干个人员的信息(为方便计算,此题设为2个),其中包括教师和学生。
学生信息:姓名,学号,性别,职业(student),班级
教师信息:姓名,工号,性别,职业(teacher),职务(professor)
要求:
用同一个表格处理2人的数据。
思路:
首先,学生数据和教师数据只有班级和职务完全不同。
对于这种情况要想到使用联合体。
1.首先定义一个结构体,包含各项信息
2.在结构体内定义联合体,包含学生的班级和职务
注:之所以用联合体,实质想到联合体和结合体的长度区别,虽然联合体内定义了两个信息
但是,在使用是根据条件,一次只使用了一个。
3.通过职业的区别,分别输入和输出学生,教师的信息。
*/
#include <stdio.h>
#include <string.h>
struct T_s
{
char name[10];
int number;
char sex[2];
char job[10];
union J_ts //定义联合体J_ts,包含班级和职务
{
char cls[10];
char position[10];
}catagory;
};
int main()
{
int i;
struct T_s person[2];
char j_s[10]="student",j_t[10]="teacher"; //定义两个数组,方便判断输入输出信息
for(i=0;i<2;i++)
{
printf("Please enter the data of person:\n");
scanf("%s %d %s %s",person[i].name,&person[i].number,person[i].sex,person[i].job);
if(strcmp(person[i].job,j_s)==0)
scanf("%s",person[i].catagory.cls);
else if(strcmp(person[i].job,j_t)==0)
scanf("%s",person[i].catagory.position);
else
printf("Enter error!\a");
}
printf("\n\nNo. name sex job class/position\n");
for(i=0;i<2;i++)
{
if(strcmp(person[i].job,j_s)==0)
printf("%s %d %s %s %s\n",person[i].name,person[i].number,person[i].sex,person[i].job,person[i].catagory.cls);
if(strcmp(person[i].job,j_t)==0)
printf("%s %d %s %s %s\n",person[i].name,person[i].number,person[i].sex,person[i].job,person[i].catagory.position);
}
return 0;
}
30.枚举类型
(1),声明枚举类型用enum
eg:enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday workday,weekend;
其中,enum weekday为枚举类型, workday,weekend为枚举变量。
sun,mon,tue,wed,thu,fri,sat为枚举元素或枚举常量。
注意:枚举元素按赵常量处理,因此称之为枚举常量,是整型数据。
(2),每一个枚举元素都代表一个整数,sun,mon,tue,wed,thu,fri,sat默认值分别为0,1,2,3,4,5,6,7。
如果workday=mon;则workday=1;
也可以人为给枚举元素赋值,
eg:enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};
则没赋值的tue,wed,thu,fri,sat分别为2,3,4,5,6。
31.
/*
要求:口袋中有红,黄,蓝,白,黑5中颜色的若干个。每次从口袋中先后取3个球,问得到3种不同
颜色的球的可能取法,输出每种的排列情况。
思路:想到使用枚举类型更加直观。
1,先定义枚举类型包含red,bule,yellow,white,black,5种颜色。
2,用穷举法取出球
第一次取得球和第二次取得球如果不同才用判别第三次;
当第一次,第二次和第三次的球的颜色均不同时,继续向下执行输出操作。
*/
#include <stdio.h>
int main()
{
enum Color{red,bule,yellow,white,black};
enum Color i,j,k,pri=0;
int n,loop;
n=0;
for(i=red;i<=black;i++) //第一次取球循环
{
for(j=red;j<=black;j++) //第二次取球循环
{
if(i!=j) //只有第一次和第二次取得的球不同时
for(k=red;k<=black;k++) //进行第三次取球操作
{
if(i!=k && j!=k) //三次取球均不同时
{
n++; //排列可能加一
printf("%-4d",n);
//分别进行第一个球,第二个球,第三个球的颜色输出操作,一个循环是一种排列可能。
for(loop=1;loop<=3;loop++)
{
switch(loop)
{
case 1:pri=i;break;
case 2:pri=j;break;
case 3:pri=k;break;
default:break;
}
switch(pri)
{
case red:printf("%-10s","red");break;
case bule:printf("%-10s","bule");break;
case yellow:printf("%-10s","yellow");break;
case white:printf("%-10s","white");break;
case black:printf("%-10s","black");break;
default:break;
}
}
}
}
printf("\n");
}
}
printf("total=%d\n",n);
return 0;
}
32.
/*
要求:
定义结构体变量(年,月,日)。计算该日在本年中是第几天,注意闰年。
*/
#include <stdio.h>
struct date
{
int year;
int mouth;
int day;
};
int main()
{
struct date date_s;
int mouth_l[12]={31,28,31,30,31,30,31,31,30,31,30,31},i,sum_mouth=0,sum_day=0;
printf("Please input year,mouth,day:");
scanf("%d %d %d",&date_s.year,&date_s.mouth,&date_s.day);
if(date_s.year%4==0 && date_s.year%100!=0 || date_s.year%400==0)
{
mouth_l[1]=29;
}
else
{
mouth_l[1]=28;
}
if(date_s.mouth>1)
{
for(i=0;i<date_s.mouth-1;i++)
sum_mouth=sum_mouth+mouth_l[i];
sum_day=sum_mouth+date_s.day;
}
else
sum_day=date_s.day;
printf("\n\n%d-%d-%d is %d's %d day\n",date_s.year,date_s.mouth,date_s.day,date_s.year,sum_day);
return 0;
}
33.文件
根据数据的组织形式,数据文件可以分为ASCII文件和二进制文件。
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式也可以应二进制形式。
二进制文件和ASCII文件的区别:
二进制:
二进制形式输出数值,可以节省外存空间和转换时间,把内存中的存储单元中的内容原封不动的输出到磁盘,此时每一个字节并不一定代表一个字符。
ASCII形式:
ASCII码形式输出时,字节与字符一一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,转换时间长。
34.
/*
要求:
(1)先创造两个文本文件in.txt和out.txt;
(2)先向in.txt输入信息,并将其输出到屏幕;
(3)然后将in.txt中的信息复制给out.txt,并将其输出到屏幕。
思路:
为了方便读和写操作,将文件的使用方式为”W+“(即为读和写建立一个新文件,如果指定文件存在则覆盖,如果不存在则新创建),使用字符型数组,采用字符型getchar和putchar进行的操作(可用其他方式)。
eg:使用gets()输入(即写入字符串型数据)
#include <stdio.h>
int main()
{
FILE *in;
char ch_s[20],in_name[10];
printf("Please enter file_name of read:");
scanf("%s",in_name);
getchar(); //接收回车键
in=fopen(in_name,"w");
gets(ch_s);
fputs(ch_s,in);
fclose(in);
return 0;
}
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *in,*out; //定义FILE类型的指针变量
char ch_s,ch_c,in_name[10],out_name[10];
//*ch_s,ch_c,in_name[10],out_name[10] 分别为输入字符变量,复制过程中间变量,两个文件名称*/
printf("Please enter file_name of read:");
scanf("%s",in_name); //输入in.txt
printf("\nPlease enter file_name of write:");
scanf("%s",out_name); //输入out.txt
in=fopen(in_name,"w+"); //打开in.txt文件
out=fopen(out_name,"w+"); //打开out.txt文件
/*注意:此处一定要有,因为getchar会将回车键也当作字符接收,当你输入文件的名称后,点击回车时,如果没有此步,将会产生错误。*/
ch_s=getchar();
printf("Please enter information when input '#' to end:");
ch_s=getchar(); //接受从键盘输入的首个字符,进入while循环时写入文件
while(ch_s!='#') //‘#’作为输入结束标志,当输入#时,程序判断输入结束
{
fputc(ch_s,in); //向in.txt文件写入键盘输入的信息
putchar(ch_s); //向屏幕输出输入信息
ch_s=getchar();
}
/*将in.txt文件关闭,如果此时不关闭,在接下来的fgetc操作中无法进入循环,指针指向的是in.txt文件的最后一个位置*/
fclose(in);
in=fopen(in_name,"r"); //重新打开in.txt文件,只能读操作
printf("\nThis operate is used to copy in's data in out\n");
//feof(in)是检查in所指向的文件(即in.txt)是否结束,结束为0;!feof(in)也就是未结束。
while(!feof(in))
{
ch_c=fgetc(in); //读取in.txt文件的信息,展示存储到ch_c变量中
fputc(ch_c,out); //向out.txt文件写入数据
putchar(ch_c); //输出到屏幕
}
printf("\n");
fclose(in);
fclose(out);
return 0;
}
35.
/*
要求:
(1)从键盘读入3个字符串,存放到指针数组中,每一维存放一个字符串。
(2)将3个字符串字母顺序排列。将排好序的字符串存入磁盘文件中。
(3)读取文件信息,将三个字符串按顺序显示到屏幕上。
思路:
(1)使用fputs()和fgets()。
(2)字符串排序用冒泡。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s[3][10],temp[10],c[3][10];
char (*p)[10];
int i,j;
p=s; //指针指向二维数组的地址
printf("Please input 3 strings:\n");
for(i=0;i<3;i++)
{
gets(*(p+i)); //从键盘读入字符串信息
}
FILE *in;
char in_name[10]; //文件名
printf("\n\nPlease input in_name:");
scanf("%s",in_name);
in=fopen(in_name,"w"); //以只写方式打开文件
//对字符串进行排序
for(i=0;i<2;i++)
for(j=0;j<2-i;j++)
{
if(strcmp(*(p+j),*(p+j+1))>0)
{
strcpy(temp,*(p+j));
strcpy(*(p+j),*(p+j+1));
strcpy(*(p+j+1),temp);
}
}
printf("\n\nWaiting,inputting.....:\n");
for(i=0;i<3;i++)
{
fputs(*(p+i),in); //向磁盘文件写入数据
fputs("\n",in); //每写入一个字符串 ,在其末尾加上一个换行符
}
/*关闭文件,这里强调一下,有开必有关,为防止错误,每次开一次用一次,用一次关一次*/
fclose(in);
printf("\nThis is consequence that from in.txt:\n");
in=fopen(in_name,"r"); //以只读的方式打开文件
for(i=0;i<3;i++)
{
fgets(c[i],10,in); //读取文件信息,10字节读取一次
printf("%s",c[i]); //之所以不用加换行,是因为写入时已经加入了换行符
}
fclose(in); //关闭文件
printf("\n");
return 0;
}
36.
/*
要求:
(1)从键盘输入3个学生的数据(包括学号,姓名,性别,成绩),将其存入磁盘文件中。
(2)从磁盘读取文件信息显示到屏幕上。
思路:
(1)用结构体定义学生信息
(2)当转存信息为数据块时(如:结构体),需要用到以二进制方式向文件进行读写操作
(3)fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)
buffer:存放从文件读入数据的存储区的地址;
size:要读入的字节
count:读写多少个数据项,每个数据长度即是size
fp:FILE类型指针
*/
#include <stdio.h>
struct stu_date
{
int num;
char name[10];
char sex[4];
int score;
};
int main()
{
void save_read(struct stu_date stu_c[3],struct stu_date stu_cc[3]);
/*定义结构体变量:stu_s[3]存放读入数据,stu_ss[3]从磁盘存放读取的数据*/
struct stu_date stu_s[3],stu_ss[3];
printf("Please enter student's information:\n");
int i;
for(i=0;i<3;i++) //输入三个学生的信息
{
scanf("%d %s %s %d",&stu_s[i].num,stu_s[i].name,stu_s[i].sex,&stu_s[i].score);
}
save_read(stu_s,stu_ss); //存储和读取函数
return 0;
}
void save_read(struct stu_date stu_c[3],struct stu_date stu_cc[3])
{
FILE *data;
char data_name[10]; //定义磁盘文件名称变量
int i;
printf("\n\nplease enter date_name:");
scanf("%s",data_name); //输入磁盘文件名称
printf("\n\nWaittng......\n\n");
data=fopen(data_name,"wb"); //以二进制只写方式打开文件
for(i=0;i<3;i++)
{
/*向磁盘文件写入学生信息,stu_c地址,读入字节为结构体的长度,每次写入一个数据项(即一个学生信息),FILE指针data*/
fwrite(&stu_c[i],sizeof(struct stu_date),1,data);
}
fclose(data);
data=fopen(data_name,"rb"); //以二进制只读方式打开文件
for(i=0;i<3;i++)
{
/*从磁盘文件中读取学生信息,存入stu_cc结构体数组中,读取字节为结构体的长度,每次读取一个数据项(即一个学生信息),FILE指针data*/
fread(&stu_cc[i],sizeof(struct stu_date),1,data);
printf("%6d %-10s %-5s %5d\n",stu_cc[i].num,stu_cc[i].name,stu_cc[i].sex,stu_cc[i].score);
}
fclose(data);
printf("\n\n");
}
尊重原创,转载请注明,谢谢