C语言(期末复习下)

31.(试商法)【问题描述】素数(Prime Number),又称为质数,是不能被1和它本身以外的其他整数整除的正整数。按照这个定义,负数、0和1都不是素数。17是素数,是因为除了1和17之外,它不能被2~16之间的任何整数整除。
试商法是最简单的判断素数的方法。用i=2~m-1之间的整数去试商,若m能被某个i整除(即余数为0),则m不是素数;若上述范围内的所有整数i都不能整除m,则m是素数。
请编写函数int IsPrime(int m)实现判断m是否是素数。
从键盘任意输入一个整数m,调用函数IsPrime()判断m是否是素数,如果是,则输出yes,否则,输出no。
【样例输入1】17
【样例输出1】yes
【样例输入2】1
【样例输出2】no
【样例输入3】4
【样例输出3】no

#include <stdlib.h>
#include<math.h>
int IsPrime(int n)
{
   int i,k=0;
   if(n!=2)
   {
     for(i=2;i<n;i++)
     {
        if(n%i==0)
        {
           k=0;
           break;
        }
        else
        {
           k=1;
        }
     }
   }
  else
  {
    k=1;
  }
   return k;
}
int main()
{
   int n,k;
   scanf("%d",&n);
   k=IsPrime(n);
   if(k==1)
   {
     printf("yes");
   }
   else
   {
     printf("no");
   }
    return 0;
}

32.(辗转相除法)【问题描述】两个正整数最大公约数(Greatest Common Divisor,GCD)是能够整除这两个整数的最大整数。请采用辗转相除法编写计算最大公约数的函数Gcd(int m,int n),在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大公约数。
辗转相除法:对正整数a,b进行连续求余运算,直到余数为0为止,此时,非0的除数就是最大公约数。设r=a % b,表示a除以b的余数,若r不等于0,则将b作为新的a,作为新的b,即Gcd(a,b)=Gcd(b,r),重复a%d运算,直到r=0为止。此时b为所求的最大公约数。例如,50和15的最大公约数的求解过程可表示为:Gcd(50,15)=Gcd(15,5)=Gcd(5,0)=5
【样例输入1】50 15
【样例输出1】5
【样例输入2】50 -15
【样例输出2】input error!

#include <stdlib.h>
int Gcd(int a,int b)
{
    if(a%b==0)
    {
        return b;
    }
    else
    {
      return Gcd(b,a%b);
    }
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   if(a<0||b<0)
   {
      printf("input error!");
   }
   else
   {
      printf("%d",Gcd(a,b));
   }
    return 0;
}

33.(递归法)【问题描述】两个正整数的最大公约数(Greatest Common Divisor,GCD)是能够整除这两个整数的最大整数。请采用递归函数编写计算最大公约数的函数Gcd(int m,int n),在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大公约数。
递归公式如下:
如果a等于b,则Gcd(a,b)=a=b;
如果a>b,则Gcd(a,b)=Gcd(a-b,b)
如果a<b,则Gcd(a,b)=Gcd(a,b-a)
【样例输入1】 15 50
【样例输出1】5
【样例输入2】-1 2
【样例输出2】input error!

#include<stdlib.h>
int Gcd(int a, int b);
int main()
{
    int a, b, c;
    scanf("%d %d",&a,&b);
    c = Gcd(a,b);
    if (c!=-1)
    {
        printf("%d",c);
    }
    else
    {
        printf("input error!\n");
    }
     return 0;
}
int Gcd(int a, int b)
{
   if (a<=0||b<=0)
   {
       return -1;
   }
   if (a == b)
   {
       return a;
   }
   else if (a > b)
   {
        return Gcd(a-b, b);
   }
   else
   {
       return Gcd(a, b-a);
   }
}

34.(试商法改进)素数(Prime Number),又称为质数,是不能被1和它本身以外的其他整数整除的正整数。按照这个定义,负数、0和1都不是素数。17是素数,是因为除了1和17之外,它不能被2~16之间的任何整数整除。
试商法是最简单的判断素数的方法。用i=2~m-1之间的整数去试商,若m能被某个i整除(即余数为0),则m不是素数;若上述范围内的所有整数i都不能整除m,则m是素数。
用数学方法可以证明,不能被2~sqrt(m)之间的数整除的数,一定不能被1和它本身之外的其它任何整数整除。根据这个性质,编写判断素数的函数int IsPrime(int m)。
从键盘任意输入一个整数m,调用函数IsPrime()判断m是否是素数,如果是,则输出yes,否则,输出no。
【样例输入1】17
【样例输出1】yes
【样例输入2】1
【样例输出2】no
【样例输入3】-1
【样例输出3】no

#include<stdlib.h>
#include<math.h>
int IsPrime(int m)
{
    int t,i;
    t=(int)sqrt(m)+1;
    for(i=2;i<t;i++)
    {
      if(m%i==0)
      {
          break;
      }
    }
   if(i==t)
   {
       return 1;
   }
  return 0;
}
int main()
{
	int n;
	scanf("%d",&n);
    if(IsPrime(n))
  	{
 	  printf("yes");
 	}
 	else
 	{
	  printf("no");
 	}
 	 return 1;

}

35.【问题描述】用递归方法求 。
【样例输入】2
【样例输出】5

#include<stdlib.h>
int F(int n)
{
   int sum=0;
   if(n==1)
   {
     return 1;
   }
   else
   {
      sum=n*n+F(n-1);
   }
    return sum;
}
int main()
{
   int n;
   scanf("%d",&n);
   printf("%d",F(n));
   return 0;
}

36.【问题描述】一个整型数组有10个元素,请将其中的值按逆序重新存放。
【样例输入】1 2 3 4 5 6 7 8 9 10
【样例输出】10 9 8 7 6 5 4 3 2 1

#include<stdlib.h>
#define M 10
int main()
{
    int i,a[M],temp;
    for(i=0;i<M;i++)
    {
      scanf("%d",&a[i]);
    }
    for(i=0;i<M/2;i++)
    {
      temp=a[i];
      a[i]=a[M-i-1];
      a[M-i-1]=temp;
}
    for(i=0;i<M;i++)
    {
      printf("%d ",a[i]);
    }
    return 0;
}

37.【问题描述】有一个3×4的矩阵,要求编程序求出其中最大的那个元素的值,以及其所在的行号和列号。
【样例输入】1 2 3 4 9 8 7 6 -10 100 -5 2
【样例输出】max=100,row=2,colum=1

#include<stdlib.h>
#define M 3
#define N 4
int main()
{
      int a[M][N];
      int i,j,max=0,row=0,colum=0;
      for(i=0;i<M;i++)
      {
        for(j=0;j<N;j++)
        {
          scanf("%d",&a[i][j]);
        }
      }
      for(i=0;i<M;i++)
      {
        for(j=0;j<N;j++)
        {
             if(a[i][j]>max)
             {
               max=a[i][j];
               row=i;
               colum=j;
             }
        }
      }
      printf("max=%d,row=%d,colum=%d",max,row,colum);
       return 0;
}

38.【问题描述】有两个矩阵A,B(均为三行四列),请计算并输出A+B的结果。
【输入形式】
1 2 3 4
5 6 7 8
9 10 11 12

1 2 3 4
5 6 7 8
9 10 11 12
【输出形式】
2 4 6 8
10 12 14 16
18 20 22 24
(输出每列宽为5)

#include<stdlib.h>
#define M 3
#define N 4
int main()
{
    int i,j,sum[M][N],a[M][N],b[M][N];
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
          scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
          scanf("%d",&b[i][j]);
        }
    }
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
          sum[i][j]=a[i][j]+b[i][j];
        }
    }
    for(i=0;i<M;i++)
    {
         for(j=0;j<N;j++)
         {
          printf("%5d",sum[i][j]);
         }
      printf("\n");
    }
    return 0;
}

39.【问题描述】二维数组转置
【输入形式】将二维数组A(两行三列)转置存放在二维数组B(三行两列)中,例如 ,转置后结果为

#include<stdlib.h>
#define M 2
#define N 3
int main()
{
    int i,j,a[M][N],b[N][M];
    for(i=0;i<M;i++)
    {
       for(j=0;j<N;j++)
       {
         scanf("%d",&a[i][j]);
       }
      printf("\n");
    }
   for(j=0;j<N;j++)
   {
      for(i=0;i<M;i++)
      {
        b[j][i]=a[i][j];
        printf("%d ",b[j][i]);
      }
      printf("\n");
   }
   return 0;
}

40.【问题描述】编写一个程序使用户输入10个整数给一个数组,然后利用指针计算数组中大于平均数的元素个数
【输入形式】10个整数
【输出形式】1个整数
【样例输入】1 2 3 4 5 -1 -2 -3 -4 -5
【样例输出】5

#include<stdlib.h>
#define M 10
void fun(int a[],int *sum,int *ave)
{
   int i;
   *sum=0;
   *ave=0;
   for(i=0;i<M;i++)
   {
       *sum+=a[i];
   }
   *ave=*sum/M;
}
int main()
{
   int i,a[M],count=0;
   int sum,ave;
   for(i=0;i<M;i++)
   {
       scanf("%d",&a[i]);
   }
   fun(a,&sum,&ave);
   for(i=0;i<M;i++)
   {
      if(a[i]>ave)
      {
           count++;
      }
   }
    printf("%d",count);
    return 0;
}

41.【问题描述】编写一个程序使用户输入10个整数给一个数组,然后利用指针找出数组中最大值以及对应的最大序号
【输入形式】10个整数
【输出形式】2个整数
【样例输入】1 2 3 4 5 6 7 8 9 -10
【样例输出】max=9 index=8

#include<stdlib.h>
int Max(int a[],int *max)
{
   int i;
   int max_num=0;
    *max=0;
   for(i=0;i<10;i++)
   {
       if(a[i]>*max)
       {
         *max=a[i];
          max_num=i;
       }
   }
    return max_num;
}
int main()
{
    int i;
    int max_num=0,a[10],max;
    for(i=0;i<10;i++)
    {
      scanf("%d",&a[i]);
    }
    max_num=Max(a,&max);
    printf("max=%d index=%d",max,max_num);
    return 0;
}

42.【问题描述】编写一个程序使用户输入10个整数给一个数组,然后利用指针找出数组中的最小元素并输出
【输入形式】10个整数
【输出形式】1个整数
【样例输入】1 2 3 4 5 6 7 8 9 -10
【样例输出】-10

#include<stdlib.h>
void Min(int a[],int *min)
{
   int i;
   *min=0;
   for(i=0;i<10;i++)
   {
      if(a[i]<*min)
      {
          *min=a[i];
      }
   }
}
int main()
{
   int i,a[10],min;
   for(i=0;i<10;i++)
   {
      scanf("%d",&a[i]);
   }
    Min(a,&min);
    printf("%d",min);
    return 0;
}

43.【问题描述】编写一个程序使用户输入10个整数给一个数组,然后利用指针按倒序输出数组中的元素
【输入形式】10个整数
【输出形式】10个整数
【样例输入】1 2 3 4 5 6 7 8 9 10
【样例输出】10 9 8 7 6 5 4 3 2 1

#include<stdlib.h>
#define M 10
void Fun(int a[],int *temp)
{
    int i;
    *temp=0;
    for(i=0;i<M/2;i++)
    {
       *temp=a[i];
       a[i]=a[M-i-1];
       a[M-i-1]=*temp;
   }
}
int main()
{
   int a[M],i,temp;
   for(i=0;i<M;i++)
   {
        scanf("%d",&a[i]);
   }
   Fun(a,&temp);
   for(i=0;i<M;i++)
   {
      printf("%d ",a[i]);
   }
    return 0;
}

44.【问题描述】编写一个程序,利用指针实现将两个整数按大小顺序输出
【输入形式】两个整数
【输出形式】两个整数
【样例输入】11 23
【样例输出】23 11

#include<stdlib.h>
void Swap(int *x,int *y)
{
    int temp;
    if(*x<*y)
    {
      temp=*x;
      *x=*y;
      *y=temp;
    }
}
int main()
{
   int x,y;
   scanf("%d %d",&x,&y);
   Swap(&x,&y);
   printf("%d %d",x,y);
   return 0;
}

45.【问题描述】
删除字符串中的字符。输入一个字符串s,再输入一个字符c,将字符串s中出现的所有字符c删除。要求定义并调用函数delchar(s,c),它的功能是将字符串s中出现的所有c字符删除。
【输入形式】
首先打印提示“Input a string:";然后直接在冒号后面输入字符串,字符串中可以包含空格;字符串以回车结束。
打印提示“Input a char:”;然后直接在冒号后面输入一个字符;回车。
【输出形式】
首先打印“After deleted,the string is:”;紧跟后面输出被删除后的字符串剩余内容;换行。
【运行时的输入输出样例】(下划线部分表示输入)

Input a char:a
After deleted,the string is:hppy new yer
#include <stdio.h>
#include <stdlib.h>
void delchar(char s[],char c)
{
   int i,j,len;
   for(len=0;s[len]!='\0';len++);
       for(i=len;i>=0;i--)
       {
          if(s[i]==c)
          {
            for(j=i;j<=len+1;j++)
            {
               s[j]=s[j+1];
            }
          }
       }
}
int main()
{
   char s[100];
   char c;
    printf("Input a string:");
    fgets(s,sizeof(s),stdin);
    printf("Input a char:");
    scanf("%c",&c);
    printf("After deleted,the string is:");
    delchar(s,c);
    fputs(s,stdout);
    return 0;
}

46.【问题描述】编写程序,把一个数字字符串转换成一个整数。
【输入形式】61875
【输出形式】after:61875

#include<stdlib.h>
#include<string.h>
long int atol(const char *str);//定义atol()函数声明
long Change(char *p)
{
    long temp;
    temp=atol(p);//atol函数把参数的字符串转换成长整型
    return temp;
}
int main()
{
    char s[10];
    int n;
    fgets(s,sizeof(s),stdin);
    n=Change(s);
    printf("after:%d\n",n);
    return 0;
}

47.输入一个字符,再输入一个以回车结束的字符串(少于80 个字符),在字符串中查找该字符。如果找到,则输出该字符在字符串中所对应的最大下标(下标从0 开始);否则输出“NotFound”。
【输入形式】
输入一个字符和一个以回车结束的字符串
【输入输出样例1】(下划线部分表示输入)
Input a character:m
Input a string:programming
index=7
【样例说明】
输入提示符后要加一个空格。例如“Input n: ”,其中“:”后要加一个且只能一个空格。
英文字母区分大小写。必须严格按样例输入输出。

#include<stdlib.h>
int main()
{
    int i,temp,count=0;
    char s[81],c1,c2;
    printf("Input a character:");
    scanf("%c%c",&c1,&c2); //*c2为回车的吸收键
    printf("Input a string:");
    i=0;
    while((s[i]=getchar( ))!='\n')//以回车结束的字符串
    {
        i++;
    }
    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]==c1)
        {
            count=i;
            temp=1;
        }
    }
    if(temp==1)
    {
        printf("index=%d",count);
    }
    else
    {
        printf("NotFound");
    }
    return 0;
}

*48.【问题描述】不使用strcat函数实现两个字符串连接
【输入形式】abc
edf
【输出形式】abcedf

#include<stdlib.h>
void Strcat(char s[],char p[],char q[])
{
    int i,j;
    for(i=0;s[i]!='\0';i++)
    {
       q[i]=s[i];
    }
    for(j=0;p[j]!='\0';j++)
    {
        q[i+j]=p[j];
    }
    q[i+j]='\0';
}
int main()
{
   char s[100],p[100],q[200];
   gets(s);
   gets(p);
   Strcat(s,p,q);
   printf("%s\n",q);
   return 0;
}

*49.【问题描述】
编写程序将一行英文中指定的字符串替换为另一字符串后输出。注意:查找指定字符串时,大小写无关,而且有可能多次出现。
【输入形式】
先从标准输入中分行输入两个英文字符串(每个字符串不为空,长度不超过20,且字符串中不会出现空格),分别表示被替换的字符串和替换成的字符串,然后在下一行输入一行英文(长度不超过200),行末有回车换行。
【输出形式】
将输入的英文按指定字符串替换后输出到标准输出上,末尾应有一个回车换行。
【样例输入】
th
Hello
This second edition of “The C Programming Language” describes C as defined by the ANSI standard. Modern compilers already support most features of the standard.
【样例输出】
Hellois second edition of “Helloe C Programming Language” describes C as defined by Helloe ANSI standard. Modern compilers already support most features of Helloe standard.
【样例说明】
样例中输入的被替换的字符串为th,由于是大小写无关查找替换,所以下一行英文信息中有四个子串要替换:Th、Th、th和th,分别替换为Hello,其它信息原样输出。
【评分标准】该题要求编程实现指定字符串的大小写无关查找替换,提交程序文件名为exam2.c或exam2.cpp。

#include<stdlib.h>
#include<string.h>
int main()
{
    char a[20],b[20],s[200];
    int n1,n2;
    int i,j,flag=1;
    gets(a);
    gets(b);
    gets(s);
    n1=strlen(a);
    n2=strlen(s);
    for(i=0;i<n2;i++)
    {
       if((s[i]!=a[0])&&(s[i]!=a[0]-32)&&(s[i]!=a[0]+32))
       {
            printf("%c",s[i]);
       }
       else
       {
             flag=1;
             for (j=0;j<n1;j++)
             {
                   if ((s[i+j]!=a[j])&&(s[i+j]!=a[j]+32)&&(s[i+j]!=a[j]-32))
                   {
                      flag = 0;
                         break;
                   }
            }
          if (flag==1)
          {
            printf("%s",b);
            i=i+n1;
            i--;
          }
          else
          {
            printf("%c",s[i]);
          }
     }
   }
  return 0;
}

*50.【问题描述】编写一个函数int mystrcmp(char *p1,char *p2)。 设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0;
若s1不等于s2,返回它们两者第1个不同字符的ASCII码差值。
【输入形式】
第1行为1个字符串
第2行为1个字符串
【输出形式】
一个整数
【样例输入】
BOY
BAD
【样例输出】
14

#include<stdlib.h>
#include<string.h>
int mystrcmp(char *p1, char *p2)
{
    int t;
    for (; *p1!='\0'||*p2!='\0'; p1++, p2++)
    {
        if (*p1!=*p2)
        {
            t=*p1-*p2;
            break;
        }
    }
        if (*p1=='\0'&&*p2=='\0')
        {
         t=0;
        }
     return t;

}
int main()
{
	char p1[100];
	char p2[100];
    fgets(p1,sizeof(p1),stdin);
    fgets(p2,sizeof(p2),stdin);
    printf("%d",mystrcmp(p1,p2));
	return 0;
}

51.【问题描述】补充修改程序,使之具有如下功能:用指针法输入12个数,然后按每行4个数输出部分代码如下:

int main()
{    
int j,k,a[12],*p;
/*插入*/
for(j = 0;j < 12;j ++)
scanf("%d",p++);
/*插入*/
for(j = 0;j < 12;j ++)
{
printf("%4d",*p++);
if((j+1)%4 == 0)
printf("\n");
}
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int j,k,a[12],*p;
    p=a;
    for(j=0;j<12;j++)
    {
        scanf("%d",p++);
    }
    p=a;
    k=1;
    for(j=0;j<12;j++)
    {
        printf("%4d",*p++);
        if((j+1)%4==0)
        {
            printf("\n");
            k++;
        }
    }
    return 0;
}

52.【问题描述】补充完成程序,用指针及函数实现三个数的排序:从键盘上面输入3个整数,按由小到大的顺序输出。部分代码如下:

int main()
{
                   ;
 int n1,n2,n3;
 int *p1,*p2,*p3;
 scanf("%d%d%d",&n1,&n2,&n3);
 p1=&n1;
  p2=&n2;
             ;
 if(n1>n2) swap(           );
 if(n1>n3) swap(p1,p3);
 if(n2>n3) swap(p2,p3);
 printf("sorted result is:%d,%d,%d",n1,n2,n3);
 return 0;
}
 void swap(           )
 {
  int p;
  p=*q1;
               ;
  *q2=p;
 }

【输入形式】5 7 6
【输出形式】sorted result is:5,6,7

#include<stdlib.h>
void swap(int *q1,int *q2);
int main()
{
  int n1,n2,n3;
  int *p1,*p2,*p3;
  scanf("%d%d%d",&n1,&n2,&n3);
  p1=&n1;
  p2=&n2;
  p3=&n3;
 if(n1>n2)
 {
     swap(p1,p2);
 }
 if(n1>n3)
 {
    swap(p1,p3);
 }
 if(n2>n3)
 {
     swap(p2,p3);
 }
 printf("sorted result is:%d,%d,%d",n1,n2,n3);
 return 0;
}
 void swap(int *q1,int *q2)
  {
      int p;
       p=*q1;
      *q1=*q2;
      *q2=p;
  }

53.【问题描述】编写函数实现求整型动态一维数组中下标为奇数的元素和,并在主函数测试。主函数中输入元素个数n,并动态创建数组,录入数据,然后调用sum()函数,最后在主函数中输出结果。(要求用指针完成!!!)
函数定义格式应该如下:
int sum(int *a,int n) /n is the number of a[]/
【输入形式】
n=3
4 56 78
【输出形式】
sum of odd index is 56

#include<stdlib.h>
int sum(int *a,int n)
{
    int i;
    int sum=0;
    for(i=0;i<n;i++)
    {
      if(i%2!=0)
      {
        sum=sum+*(a+i);
      }
    }
    return sum;
}
int main()
{
    int i,n;
    int *p=NULL;
    printf("n=");
    scanf("%d",&n);
    p=(int *)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
    {
      scanf("%d",&p[i]);
    }
    printf("sum of odd index is %d",sum(p,n));
    free(p);
    return 0;
}

54.【问题描述】编写多个函数,用指针实现学生成绩管理相关问题。
(1)定义input()函数对n个学生成绩进行输入,从键盘输入数据,要求用传指针的形式实现;
(2)定义print()函数对n个学生成绩进行输出,数据从学生成绩存储空间中获取,内容输出到屏幕上,要求用指针实现;
(3)定义sort()函数对n个学生成绩按照从高到低进行排序,要求用指针实现;
(4)编写主函数,在主函数中通过动态数组为学生成绩开辟存储单元,并先后调用录入、输出、排序、输出函数对程序的各功能进行测试。
注意:1.学生成绩为整数,输入数据后,先把排序前的情形输出显示一下,再进行排序,最后把排序后的结果输出显示一下!
2.学生人数是动态输入的!因此,采用动态数组存放学生成绩,请同学们注意!
【输入形式】5 91 92 93 94 95
【输出形式】
before sorting is:91 92 93 94 95[回车换行]
sorted result is:95 94 93 92 91
【样例说明】输入时,第一个整数为学生人数或成绩数,后面依次为各学生的具体成绩!

#include<stdlib.h>
void input(int *a,int n)
{
   int i;
   for(i=0;i<n;i++)
   {
       scanf("%d",&a[i]);
   }
}
void sort(int *a,int n)
{
    int i,j;
    int temp=0;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
           if(*(a+j)>*(a+i))
           {
              temp=*(a+j);
             *(a+j)=*(a+i);
             *(a+i)=temp;
           }
        }
    }
}
void print(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
       printf("%d ",a[i]);
    }
}
int main()
{
       int n;
       int *p=NULL;
       scanf("%d",&n);
       p=(int *)malloc(n*sizeof(int));
       input(p,n);
       printf("before sorting is:");
       print(p,n);
       printf("\n");
       sort(p,n);
       printf("sorted result is:");
       print(p,n);
       free(p);
        return 0;
}

55.【问题描述】有n个选手围成一圈,顺序排号。从第1个人开始报数(从1到3报数),报到3的人退出圈子,问最后留下的是原来第几号选手。
要求:用指针编写功能函数,并在主函数中调用测试功能函数。
【输入形式】n=3
【输出形式】last is No. 2

#include<stdlib.h>
void number(int *a,int n)
{
    int i,count,temp,r;
    i=0,count=0,temp=0;
    r=n;
    while(r!=1)
    {
        if(*(a+i)!=0)
        {
            temp++;
            if(temp==3)
            {
                count++;
                *(a+i)=0;
                temp=0;
            }
        }
        i++;
        if(i==n)
        {
            i=0;
        }
        r=n-count;
    }
}
int main()
{
    int n,i;
    int a[1000];
    int *p=a;
    printf("n=");
    scanf("%d",&n);
    for(i=1;p<a+n;p++)
    {
        *p=i++;
    }
    number(a,n);
    for(p=a;p<a+n;p++)
    {
        if(*p)
        {
            printf("last is No. %d",*p);
            break;
        }
    }
    return 0;
}

56.【问题描述】编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
【输入形式】
按照要求输入候选人姓名字符串
【输出形式】
输出投票结果
【样例输入】
zhang
Zhang
Li
WANG
wang
liu
song
li
WaNG
LI
【样例输出】
name count
zhang 2
li 3
wang 3
invalid 2
【样例说明】
(空3格)name(空1格)count
(空2格)zhang(空1格) 2
(空5格)li(空1格) 3
(空3格)wang(空1格) 3
(无空格)invalid(空1格) 2

#include<string.h>
#include<stdlib.h>
typedef struct candidate
{
	char name[20];
	int count;
}CANDIDATE;
int Compare(char a[],char b[])
 {
     int len1,len2;
     char A,B;
     int i;
     len1=strlen(a);
     len2=strlen(b);
	 for(i=0;i<len1;i++)
     {
         A=a[i];
         B=b[i];
        if(len1!=len2)
        {
             break;
        }
        else
        {
             if(A==B||A==(B-32))
             {
                 return 1;
             }
             else
             {
                 break;
             }
        }
     }
     return 0;
 }
int main()
{
    CANDIDATE C[3]={{"zhang",0},{"li",0},{"wang",0}};
	char str[20];
	int i;
	int invalid=0;
	for(i=0;i<10;i++)
    {
		scanf("%s",str);
		if(Compare(str,"zhang")==1)
        {
            C[0].count++;
        }
		else if(Compare(str,"li")==1)
        {
            C[1].count++;
        }
		else if(Compare(str,"wang")==1)
        {
            C[2].count++;
        }
		else
        {
            invalid++;
        }
	}
	printf("   name count\n");
	printf("  zhang %d\n",C[0].count);
	printf("     li %d\n",C[1].count);
	printf("   wang %d\n",C[2].count);
	printf("invalid %d\n",invalid);
	return 0;
}

57.【问题描述】通过键盘输入下面表格中学生的信息,编程计算并输出4门课程平均成绩最高的学生记录。
号 姓名 性别 出生日期 数学 英语 语文 计算机
年 月 日
10031 Wanggang m 1991 5 19 72 83 90 82
10032 Liming m 1992 8 20 88 92 78 78
10033 Wangli f 1991 9 19 98 72 89 66
10034 Chenhong f 1992 3 22 87 95 78 90
其中,m表示男,f表示女。
【输入形式】
【输出形式】
【样例输入】
10031 Wanggang m 1991 5 19 72 83 90 82
10032 Liming m 1992 8 20 88 92 78 78
10033 Wangli f 1991 9 19 98 72 89 66
10034 Chenhong f 1992 3 22 87 95 78 90
【样例输出】
10034 Chenhong f 1992 3 22 87 95 78 90

#include<stdlib.h>
#include<string.h>
#define N 30
typedef struct date
{
    int year;
    int month;
    int day;
}DATE;
typedef struct student
{
    long studentID;
    char studentName[10];
    char Sex;
    DATE birthday;
    int score[4];
}STUDENT;
int main()
{
    STUDENT stu[N];
    int i,j;
    float max=0;
    int index=0,sum[N];
    float aver[N];
    for(i=0;i<4;i++)
    {
        scanf("%ld",&stu[i].studentID);
        scanf("%s",stu[i].studentName);
        scanf(" %c",&stu[i].Sex);
        scanf("%d",&stu[i].birthday.year);
        scanf("%d",&stu[i].birthday.month);
        scanf("%d",&stu[i].birthday.day);
        for(j=0;j<4;j++)
        {
            scanf("%d",&stu[i].score[j]);
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            sum[i]=sum[i]+stu[i].score[j];
        }
        aver[i]=(float)sum[i]/4;
        aver[0]=max;
        if(aver[i]>aver[i+1])
        {
            max=aver[i];
            index=i;
        }
        else
        {
            max=aver[i+1];
            index=i+1;
        }
    }
         printf("%ld %s %c %d %d %d",stu[index].studentID,
                                    stu[index].studentName,
stu[index].Sex,
stu[index].birthday.year,
stu[index].birthday.month,
stu[index].birthday.day);
         for(j=0;j<4;j++)
        {
            printf(" %d",stu[index].score[j]);
        }
    return 0;
}

58.单链表也叫做线性链表。用指针表示结点间的逻辑关系,它的特点是方便地进行扩充。
编写程序实现单链表的创建,使用尾插法(新结点插入链表中最后一个结点之后)生成链表,并输出刚刚建立的链表。
输入任意一个值,查找是否出现在链表中,如果能找到,输出Found!,否则输出Not found!.
结点的类型为:
struct Node
{
int num;
struct Node* next;
};
【输入形式】
结点个数
结点的值
要查找的值
【输出形式】
单链表的结点值
查询结果
【样例输入】
5
1 2 3 4 5
3
【样例输出】
1 2 3 4 5
Found!

#include<stdlib.h>
struct Node* buildNote(int* a,int n);
void printNodeList(struct Node* head);
void find(struct Node *head,int s);
struct Node
{
    int num;
    struct Node* next;
};
int main()
{
   int n,i;
   int* a;
   int s;
   scanf("%d",&n);
   a=(int*)malloc(n*sizeof(int));
   for(i=0;i<n;++i)
   {
       scanf("%d",&a[i]);
   }
   struct Node* head=NULL;
   scanf("%d", &s);
   head=buildNote(a,n);
   printNodeList(head);
   printf("\n");
   find(head,s);
   free(a);
   return 0;
}
struct Node* buildNote(int* a, int n)
{
    int i;
    struct Node *p,*pr,*head;
    head=(struct Node*)malloc(sizeof(struct Node));
    head->next=NULL;
    pr=head;
    for(i=0;i<n;i++)
    {
        p=(struct Node*)malloc(sizeof(struct Node));
        p->num=a[i];
        p->next=NULL;
        pr->next=p;
        pr=p;
    }
    return head;
}
void printNodeList(struct Node* head)
{
    head=head->next;
    printf("%d",head->num);
    head=head->next;
    while(head!=NULL)
    {
        printf(" %d",head->num);
        head=head->next;
    }
}

void find(struct Node *head,int s)
{
	while((head->num!=s)&&head->next)
	{
		head = head->next;
	}
	if( head->num==s)
	{
        printf("Found!");
	}
	else
    {
		printf("Not found!");
    }
}

59.【问题描述】编写程序,从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到磁盘文件test.txt中。输入的字符串以“!”结束。

#include<stdlib.h>
int main()
{
    FILE *fp;
    char ch;
    if((fp=fopen("test.txt","w"))==NULL)
    {
        printf("无法打开!\n");
        exit(0);
    }
    while(1)
    {
        ch=getchar();
        if(ch=='!')
        {
            break;
        }
        if(ch>='a'&&ch<='z')
        {
            ch=ch-32;
            fputc(ch,fp);
        }
    }
    fclose(fp);
    return 0;
}

60.【问题描述】对于一个文本文件text1.dat,编写一个程序,将该文件中的每一行字符颠倒顺序后输出到另一个文件text2.dat中。
【输入文件】输入文件为当前目录下的text1.dat,该文件含有多行任意字符,也可能有空行。每个文本行最长不超过80个字符。在最后一行的结尾也有一个回车符。
【输出文件】输出文件为当前目录下的text2.dat。
【样例输入】设输入文件text1.dat为:
This is a test!
Hello, world!
How are you?
【样例输出】输出文件text2.dat为:
!tset a si sihT
!dlrow ,olleH
?uoy era woH
【样例说明】将输入文件反序输出。
【评分标准】输出文件应与输入文件的字符个数相等,并且符合题目规定的格式。如果你的程序输出正确,该测试点得满分,否则该测试点不得分。上传C语言源程序,以revtext.c命名。

#include<stdlib.h>
void Write(FILE *cp,char s[],int i)
{
     char ch;
     while(i>0)
     {
       ch=s[--i];
      if(ch>=0)
      {
       fprintf(cp,"%c",ch);
      }
      else
      {
       fprintf(cp,"%c%c",s[--i],ch);
      }
    }
}
int main()
{
 FILE *fp=fopen("text1.dat","r");
 FILE *cp=fopen("text2.dat","w");
     int count;
     char ch;
     char s[200];
     int i=0;
     for(count=fscanf(fp,"%c",&ch);count!=EOF&&count>0;count=fscanf(fp,"%c",&ch))//EOF为End Of File是c语言中标准库中定义的宏,定义为:#define EOF (-1);
     {
      if(ch!='\n'&&ch!='\r')
      {
       s[i]=ch;
        i++;
      }
      else
      {
       Write(cp,s,i);
       i=0;
       fprintf(cp,"%c",ch);
      }
     }
     Write(cp,s,i);
     fclose(cp);
     fclose(fp);
 return 0;
}

61.【问题描述】已有文本文件test.txt,请编写程序,打开该文件,并将文件中的内容输出。

#include<stdlib.h>
int main()
{
    FILE *fp;
    char s[100];
    fp=fopen("test.txt","r");
    if(fp)
       {
            while(fscanf(fp,"%s",s)!=EOF)
            {
                printf("%s ",s);
            }
       }
    fclose(fp);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值