C语言常见题目

最近在准备考研,专业课是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");

}

尊重原创,转载请注明,谢谢

 

猜你喜欢

转载自blog.csdn.net/weixin_40042248/article/details/93997828
今日推荐