C语言程序设计第五版 谭浩强著 第六章165-167习题以及答案

1.用筛选法求100以内的素数。

#include 
#include 
int main() 
{
    int i,j,a[100],b[100];
    for (i=1;i<=100;i++) 
    {
        a[i]=i+1;
        for (j=1;j<sqrt(a[i]);j++) 
        {
            b[j]=j+1;
            if(a[i]%b[j]==0) break;
        }
        if(a[j]>sqrt(a[i]))
         printf("%3d",a[i]);
    }
}

2.用选择法队10个整数排序。

#include
main()
{
    int i,j,a[10],t;
    printf("please erter 10 integer numbers:");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    for(j=1;j<10;j++)
    {
        for(i=0;i<(9-j);i++)
        if(a[i]>a[i+1])
        {
            a[i+1]=t;
            a[i+1]=a[i];
            a[i]=t;
        }
    }
    printf("from small to large:");
    for(i=0;i<10;i++)
    printf("%3d",a[i]);
}

3.求一个3*3的整型矩阵对角线元素之和。

#include
main()
{
    int a[3][3]={{1,2,3},{2,4,6},{3,6,9}};
    int m,n,sum;
    for(m=0;m<3;m++)
    {
        for(n=0;n<3;n++)
        sum=a[0][0]+a[0][2]+a[1][1]+a[2][0]+a[2][2];
    }
    printf("%d",sum);
}

4.有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中。

#include
main()
{
    int a[5]={2,4,5,7,9};
    int b,i,t;
    printf("please erter an integer number:\n");
    scanf("%d",&b);
    for(i=0;i<5;i++)
    {
        if(bprintf("%3d",a[i]);

    }
        printf("%3d",b);
}

5.讲一个数组的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8.

#include
main()
{
    int a[5]={8,6,5,4,1};
    int i;
    for(i=4;i>=0;i--)
    printf("%d\t",a[i]);
}

6.输出以下的杨辉三角形(要求输出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
………………
………………

#include 
int main()
{
    int a[11][11];
    int i, j;
    for (i=1; i<=10; i++){
        for (j=1; j<=10; j++){
            if (j==1)
                a[i][j]= 1;
            else if (j>i){
                a[i][j]=0;
                break;
            }
            else
                a[i][j]=a[i-1][j-1]+a[i-1][j];
            if (a[i][j]!=0)
                printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
  1. 要求输出1-n*n的魔方阵
    既输出的方阵的每一行,每一列,对角线的和都相等 例如:
    8 1 6
    3 5 7
    4 9 2
#include
#define MAX 15
int main() {
    int n;
    int m = 1;
    int i, j;
    int a[MAX][MAX];
    scanf("%d", &n);

    i = 0;
    j = (n + 1) / 2 - 1;       //(1)
    while (m <= n * n) { //(2)
        a[i][j] = m;
        m++;
        i--;
        j++;
        if ((m - 1) % n == 0 && m > 1) {
            i = i + 2;   //(3)
            j = j - 1;
        }

        if (i < 0)   //超出上界
            i = i + n;          //(4)
        if (j > (n - 1))  //超出右边界
            j = j - n;          //(5)
    }

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++)
            printf("%d\t", a[i][j]);
        printf("\n");
    }
    return 0;
}

8.找出一个二维数组中的鞍点,即该位置上的元素在该行最大、该列最小、也可能无鞍点。

#include 
#define N 4
#define M 5                   /* 数组为4行5列 */
int main()
{
  int i,j,k,a[N][M],max,maxj,flag;
  printf("please input matrix:\n");
  for (i=0;i/* 输入数组 */
     for (j=0;j"%d",&a[i][j]);
  for (i=0;imax=a[i][0];               /* 开始时假设a[i][0]最大 */
    maxj=0;                    /* 将列号0赋给maxj保存 */
    for (j=0;j/* 找出第i行中的最大数 */
   if (a[i][j]>max)
     {max=a[i][j];         /* 将本行的最大数存放在max中 */
      maxj=j;              /* 将最大数所在的列号存放在maxj中 */
     }
    flag=1;                   /* 先假设是鞍点,以flag为1代表 */
    for (k=0;kif (max>a[k][maxj])     /* 将最大数和其同列元素相比 */
      {flag=0;             /* 如果max不是同列最小,表示不是鞍点令flag1为0 */
       continue;}
    if(flag)                  /* 如果flag1为1表示是鞍点 */
 {printf("a[%d][%d]=%d\n",i,maxj,max);   /* 输出鞍点的值和所在行列号 */
  break;
 }
  }
  if(!flag)                    /* 如果flag为0表示鞍点不存在 */
    printf("It is not exist!\n");
  return 0;
 }

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

#include 
int main()
{
 int a[15]={98,64,58,53,51,46,43,38,31,29,25,10,5,-8,-12};
 int i,n;
 printf("数组中数据如下: \n");
 for(i=0;i<15;i++)
  printf("%5d",a[i]);
 printf("\n");
 printf("你想要查找的数字为: ");
 scanf("%d",&n);
 if(a[14]<=n<=a[0])
 {
  if (n==a[7])
  i=8;
  else if(n<a[7])
  {
  if(n==a[11])
   i=12;
  else if(n<a[11])
  {
   if(n==a[13])
    i=14;
   else if(n<a[13])
    i=15;
   else i=13;
  }
  else
  {
   if(n==a[9])
    i=10;
   else if(n<a[9])
    i=11;
   else i=9;
  }
  }
  else
  {
   if(n==a[3])
    i=4;
   else if(n<a[3])
   {
    if(n==a[5])
     i=6;
    else if(n<a[5])
     i=7;
    else i=5;
   }
   else
   {
    if(n==a[1])
     i=2;
    else if(n<a[1])
     i=3;
    else i=1;
   }
  }
 printf("\n");
 printf("%d是此数组中第%d个元素的值",n,i);
 printf("\n");
 }
 else printf("data error!");
 return 0;
}

10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数。

#include
#include
main()
{
    char word[3][80];
    int i,j,a,b,c,d,e;
    a=b=c=d=e=0;
    printf("输入3行文字:\n");
    for(i=0;i<3;i++)
    {
        gets(word[i]);
        for(j=0;j<80&&word[i][j]!='\0';j++)
        {
            if(word[i][j]>='A'&&word[i][j]<='Z') a++;
            else if(word[i][j]>='a'&&word[i][j]<='z') b++;
            else if(word[i][j]>='0'&&word[i][j]<='9') c++;
            else if(word[i][j]==' ') d++;
            else e++;   
        }
    }
    printf("大写字母%d个\n小写字母%d个\n数字%d个\n空格%d个\n其他字符%d个\n",a,b,c,d,e);
    return 0;
}

11.输出以下图案:



   *  *  *  *  *
       *  *  *  *  *
#include
main()
{
    char str[]={"*****"};
    int i,k;
    for(i=1;i<=5;i++)
    {
        printf("%s\n",str);
        for(k=1;k<=i;k++)
        {
            char c=32;
            printf("%c",c);
        }   
    }
}

12.有一行电文,已按下面规律译成密码:
A->Z a->z
B->Y b->y
C->X c->x
…… ………..
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文。

#include
#include
main()
{
    char a[10],b[10];
    int i;
    printf("输入一行电文:\n");
    gets(a);
    for(i=0;a[i]!='\0';i++)
    {
        if('A'<=a[i]&&a[i]<='Z') b[i]=155-a[i];//'A'+'Z'=155 
        else if('a'<=a[i]&&a[i]<='z') b[i]=219-a[i];//'a'+'z'=219
        else b[i]=a[i];
    }
    b[i]=0;
    printf("原密码为:\n");
    puts(a);
    printf("密码翻译成原文为:\n");
    puts(b);
}

13.编译程序,将两个字符串连接起来,不要用strcat函数。

#include
main()
{
    char a[10],b[10],c[20];
    int i,j;
    printf("输入两个字符串:\n");
    gets(a);
    gets(b);
    for(i=0;a[i]!='\0';i++)
    c[i]=a[i];
    for(j=0;b[j]!='\0';j++)
    c[i+j]=b[j];
    c[i+j+1]='\0';
    printf("两字符串连接后的字符串为:%s\n",c);
}

14.编一个程序,将两个字符串s1和s2进行比较。如果s1>s2,输出一个正数;s1=s2输出0;s1

#include
int main()
{
    char s1[100],s2[100];
    printf("请输入s1:");
    gets(s1);
    printf("请输入s2:");
    gets(s2);
    int i,num=0;
    for(i=0;s1[i]!='\0'||s2[i]!='\0';i++)
    {
        printf("s1[%d]=%d\n",i,s1[i]);
        printf("s2[%d]=%d\n",i,s2[i]);
        num=num+s1[i]-s2[i];
        printf("\n");
    }
    printf("结果是:%d\n\n",num);
    return 0;
}

15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数,复制时,’\0’也要复制过去,’\0’后的字符不复制。

#include.h>
main()
{
    char s1[10],s2[10];
    int i;
    printf("输入s2字符串:\n");
    gets(s2);
    for(i=0;s1[i]=s2[i];i++);
    printf("s2字符串输出:\n");
    printf("%s",s1);
}

你可能感兴趣的:(C语言)