第6章 利用数组处理批量数据 习题

作者在 2011-11-07 15:10:31 发布以下内容

6.1. 用筛选法求100之内的素数

/*
时间:2011年10月31日16:22:34
题目:习题6.1 用筛选法求100之内的素数
备注:筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。又称埃拉托斯特尼筛子。
参考:
http://baike.baidu.com/view/2722688.htm
*/
# include <stdio.h>

int main()
{
    int a[100];
    int i,j,k;
    
    for(i=0; i<100; ++i)    //建立数组,将1到100的自然数写入
    {
        a[i]=i+1;
    }
    a[0]=0;                    //去掉自然数1
    for(i=1; i<100; ++i)    //最外层从2到99循环
    {
        if(a[i]!=0)            //从2开始第一个没被去掉的数是素数
        {
            printf("%d ",a[i]);        //把质数输出出来
            for(j=1; j<100; j++)    //嵌套循环,a[1]到a[99]中等于素数倍数的数去除(改为0)
            {
                for(k=2; k<=100/a[i]; ++k)
                {
                    if(a[j]==a[i]*k)
                    {
                        a[j]=0;
                    }
                }
            }
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Press any key to continue
————————————
*/

 

6.2 用选择法对10个整数排序

/*
时间:2011年11月1日14:10:42
题目:习题6.2 用选择法对10个整数排序
*/
# include <stdio.h>

int main()
{
    int i,j;
    int a[10];
    int temp;
    
    printf("输入10个数:\n");
    for(i=0; i<10; ++i)
    {
        scanf("%d",a+i);
    }
    
    for(i=0; i<9; ++i)            //分别选取从a[0]到a[9]与其之后的元素比较大小
    {
        for(j=i+1; j<10; ++j)    //把小的改放在前面
        {
            if (a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }

    printf("由小到大排序:\n");
    for(i=0; i<10; ++i)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入10个数:
1 3 5 7 9 2 4 6 8 10
由小到大排序:
1 2 3 4 5 6 7 8 9 10
Press any key to continue
————————————
*/

 

6.3 求一个3x3整型矩阵,对角线元素的和

/*
时间:2011年11月1日14:38:48
题目:习题6.3 求一个3x3整型矩阵,对角线元素的和
*/
# include <stdio.h>
# include <malloc.h>

int main()
{
    int n=3;
    int len;
    int i,j;
    int * pArr;
    int sum1=0,sum2=0;
    
    len = n*n;
    pArr = (int *)malloc(sizeof(int)*len);

    printf("输入%dx%d矩阵元素:\n",n,n);
    for(i=0; i<len; ++i)
    {
        scanf("%d",&pArr[i]);
    }
    
    for(j=1; j<=n; ++j)
    {
        sum1 += *(pArr+(n+1)*(j-1));
        sum2 += *(pArr+(n-1)*j);
    }
    
    printf("\\方向对角线的元素和=%d\n",sum1);
    printf("\/方向对角线的元素和=%d\n",sum2);

    free(pArr);    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入3x3矩阵元素:
1 3 5
2 4 6
7 8 9
\方向对角线的元素和=14
/方向对角线的元素和=16
Press any key to continue
————————————
*/

 

6.4 有一个已排好序的数组,要求输入一个数后,按原来排序的顺序把它插入数组中

/*
时间:2011年11月7日15:06:45
题目:习题6.4 有一个已排好序的数组,要求输入一个数后,按原来排序的顺序把它插入数组中
备注:暂时只练习由小到大排列的情况
*/
# include <stdio.h>
# define N 5

int main()
{
    int a[N]={1,3,5,7,9};
    int b[N+1];
    int i;
    
    printf("原来已排好序的数组为:\n");
    for(i=0; i<N; ++i)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    
    printf("输入要插入的数:\n");
    scanf("%d",&b[N]);
    
    for(i=0; i<N; ++i)
    {
        if(a[i]<=b[N])
        {
            b[i]=a[i];
        }
        else
        {
            b[i]=b[N];
            b[N]=a[i];
        }
    }
    
    printf("新的数组为:\n");
    for(i=0; i<=N; ++i)
    {
        printf("%d ",b[i]);
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
原来已排好序的数组为:
1 3 5 7 9
输入要插入的数:
4
新的数组为:
1 3 4 5 7 9
Press any key to continue
————————————
*/

 

6.5 将一个数组中的值按逆序重新存放,例如,原来顺序是86541,。要求改为14568

/*
时间:2011年11月3日10:17:20
题目:将一个数组中的值按逆序重新存放,例如,原来顺序是8、6、5、4、1,。要求改为1、4、5、6、8
*/
# include <stdio.h>
# include <malloc.h>

int main()
{

    int temp;
    int* pArr;
    int len = 1;
    char ch;
    int n = 0;

    pArr = (int *)malloc(sizeof(int)*len);
    printf("输入数组中的元素,按回车结束:\n");
    scanf("%d",pArr+n);
    
    while(ch=getchar()!='\n')
    {
    ++ n;
    ++len;
    pArr = (int *)realloc(pArr,sizeof(int)*len);
    scanf("%d",pArr+n);
    }

    for(n=0; n<len/2; ++n)
    {
        temp = *(pArr+n);
        *(pArr+n) = *(pArr+(len-1-n));
        *(pArr+(len-1-n)) = temp;
    }
    
    printf("按逆序输出:\n");
    for(n=0; n<len; ++n)
    {
        printf("%d ",*(pArr+n));
    }
    printf("\n");
    
    free(pArr);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入数组中的元素,按回车结束:
8 6 5 4 1
按逆序输出:
1 4 5 6 8
Press any key to continue
————————————
*/

 

6.6 输出杨辉三角形,要求输出10

/*
时间:2011年11月3日10:51:21
题目:习题6.6 输出杨辉三角形
要求:输出10行
*/
# include <stdio.h>
# define N 10

int main()
{
    int i,j;
    int a[N][N]={0};
    
    for(i=0; i<N; ++i)
    {
        for(j=0; j<N; ++j)
        {
            if(0==j)
            {
                a[i][j]=1;
            }
            else if(i>0)
            {
                a[i][j] = a[i-1][j-1] + a[i-1][j];
            }
            if(0!=a[i][j])
            {
                printf("%-4d",a[i][j]);
            }
        }
        printf("\n");
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5   10  10  5   1
1   6   15  20  15  6   1
1   7   21  35  35  21  7   1
1   8   28  56  70  56  28  8   1
1   9   36  84  126 126 84  36  9   1
Press any key to continue
————————————
*/

 

6.7 输出魔方矩阵,要求输出1~n^2的自然数构成的魔方阵

/*
时间:2011年11月3日13:38:16
题目:输出魔方矩阵
备注:暂时只练习编写奇数阶数的
参考:
http://baike.baidu.com/view/1905316.htm
*/
# include <stdio.h>
# define N 3

int main()
{
    int i,j;
    int it,jt;
    int a[N][N]={0};
    int n=1;
    
    i=0;
    j=N/2;
    a[i][j]=n;        //把1填入第一行中间一列的位置
    
    while(n<N*N)
    {
        ++n;
        
        if(0==i)    //找到行数减1,列数+1的位置,如果越界则回绕
        {
            it=N-1;
        }
        else
        {
            it=i-1;
        }
        if(N-1==j)
        {
            jt=0;
        }
        else
        {
            jt=j+1;
        }
        
        if(0==a[it][jt])    //找到的位置如果没有填过数,就把下一个数填进去
        {
            i=it;
            j=jt;            
        }
        else                //找到的位置如果填过数了,就把下一个数填在上一个数的下面(行数+1)
        {
            if(N-1==i)
            {
                i=0;
            }
            else
            {
                ++i;
            }
        }
        a[i][j]=n;
    }
    
    for (i=0; i<N; ++i)        //输出矩阵
    {
        for (j=0; j<N; ++j)
        {
            printf("%-3d  ",a[i][j]);
        }
        printf("\n");
    }
        
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
8    1    6
3    5    7
4    9    2
Press any key to continue
————————————
*/

 

6.8 找出一个二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。

/*
时间:2011年11月3日14:43:57
题目:习题6.8 找出一个二维数组的鞍点
备注:鞍点即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
*/
# include <stdio.h>
# define LINE 4
# define COLUMN 5

int main()
{
    int i,j,k;
    int a[LINE][COLUMN];
    int temp;
    int line,column;
    
    printf("输入%d行%d列矩阵的元素:\n",LINE,COLUMN);
    for(i=0; i<LINE; ++i)
    {
        for(j=0; j<COLUMN; ++j)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    for(j=0; j<COLUMN; ++j)
    {
        temp = a[0][j];
        for(i=0; i<LINE; ++i)
        {
            if(a[i][j]<=temp)
            {
                temp = a[i][j];
                line = i;
                column = j;
            }
        }
        for(k=0; k<COLUMN; ++k)
        {
            if(temp < a[line][k])
            {
                break;
            }    
        }
        if(k==COLUMN)
        {
            printf("找到鞍点a[%d][%d]=%d\n",line,column,a[line][column]);
            break;
        }
    }
    if(j==COLUMN)
    {
        printf("找不到鞍点\n");
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入4行5列矩阵的元素:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
找到鞍点a[0][4]=5
Press any key to continue
----------------------------
输入4行5列矩阵的元素:
1 2 3 4 11
2 4 6 8 12
3 6 9 10 15
4 8 12 16 7
找不到鞍点
Press any key to continue
————————————
*/

 

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

/*
时间:2011年11月3日15:38:23
题目:习题6.9 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中的第几个元素的值。如果该数不在数组中,则输出"无此数"
*/
# include <stdio.h>
# define N 15

int main()
{
    int a[N]={29,27,25,23,21,19,17,15,13,11,9,7,5,3,1};
    int number;
    int min,max,n;
    
    printf("输入要查找的数: ");
    scanf("%d",&number);
    
    min=0;
    max=N;
    
    while(1)
    {
        n = (min+max)/2;
        if(number==a[n])
        {
            printf("该数是数组的第%d个元素\n",n+1);
            break;
        }
        else
        {
            if(max-min<=1)
            {
                printf("无此数\n");
                break;
            }
            else
            {
                if(number<a[n])
                {
                    min=n;
                }
                else
                {
                    max=n;
                }        
            }
        }
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入要查找的数: 3
该数是数组的第14个元素
Press any key to continue
------------------------
输入要查找的数: 2
无此数
Press any key to continue
————————————
*/

 

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

/*
时间:2011年11月4日14:47:30
题目:习题6.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数
*/
# include <stdio.h>
# include <ctype.h>
# define LINE 3
# define COLUMN 80

int main()
{
    int i,j;
    char a[LINE][COLUMN];
    int space=0;
    int digit=0;
    int alpha=0;
    int other=0;
    
    for(i=0; i<LINE; ++i)
    {    
        printf("输入第%d行的内容:\n",i+1);
        for(j=0; j<COLUMN; ++j)
        {            
            if ((a[i][j]=getchar()) !='\n')
            {
                if(isalpha(a[i][j]))
                {
                    ++alpha;
                }
                else if(isdigit(a[i][j]))
                {
                    ++digit;
                }                
                else if(isspace(a[i][j]))
                {
                    ++space;
                }
                else
                {
                    ++other;
                }
            }
            else
            {
                break;
            }
        }
    }    
    printf("%d行文字共包含有:\n",LINE);
    printf("\t\t空格%d个\n",space);
    printf("\t\t数字%d个\n",digit);
    printf("\t\t字母%d个\n",alpha);
    printf("\t\t其他字符%d个\n",other);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入第1行的内容:
pi=3.14159
输入第2行的内容:
1+2=3 is right
输入第3行的内容:
bbs.bccn.net
3行文字共包含有:
                空格2个
                数字9个
                字母19个
                其他字符6个
Press any key to continue
————————————
*/

 

6.11 输出图案

/*
时间:2011年11月4日15:20:37
题目:习题6.11 输出图案
*/
# include <stdio.h>
# define N 5

int main()
{
    int i,j,k;

    for(j=0; j<N; ++j)
    {
        for(k=0; k<2*j; ++k)
        {
            printf(" ");
        }
        for(i=0; i<N; ++i)
        {
            printf("* ");
        }
        printf("\n");            
    }    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
* * * * *
  * * * * *
    * * * * *
      * * * * *
        * * * * *
Press any key to continue
————————————
*/

 

6.12 有一行电文,已按下面规律译成密码。即第一个字母变成第26个字母,第i个字母变成(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。

/*
时间:2011年11月4日17:12:56
题目:习题6.12 要求编程序将密码译回原文
*/
# include <stdio.h>
# include <malloc.h>

int main()
{
    char ch;
    i
《C程序设计》学习 | 阅读 3016 次
文章评论,共5条
wordless
2011-11-07 20:31
1
想知道你的6.14能比较 A 和 c 的大小的吗?
edwardflee(作者)
2011-11-08 13:13
2
<div class="quote"><span class="q"><b>wordless</b>: 想知道你的6.14能比较 A 和 c 的大小的吗?</span></div>输入第1个字符串:<br />
A<br />
输入第2个字符串:<br />
c<br />
result=-34<br />
Press any key to continue
wordless
2011-11-08 18:28
3
两个字符串用gets函数输入。输出的正数或负数的绝对值应是相比较的两个字符中相应字符的ASCII码的差值,例如,“A”与“c”相比,由于“A”&lt;“C”.应输出负数.同时由于'A'与'C'的ASCII码差值为2,因此应输出“-2”。<br />
<br />
这是题目中说的。。
edwardflee(作者)
2011-11-08 21:04
4
<div class="quote"><span class="q"><b>wordless</b>: 两个字符串用gets函数输入。输出的正数或负数的绝对值应是相比较的两个字符中相应字符的ASCII码的差值,例如,“A”与“c”相比,由于“A”&lt;“C”.应输出负</span></div>哦,呵呵,抱歉抱歉,题目输入错了,应该是大写的C,谢谢指正<img src="image/face/2.gif" class="face">
wordless
2011-11-09 23:00
5
<div class="quote"><span class="q"><b>edwardflee</b>: 哦,呵呵,抱歉抱歉,题目输入错了,应该是大写的C,谢谢指正<img src="image/face/2.gif" class="face"></span></div>哦。我也是新手。。<img src="image/face/3.gif" class="face">
游客请输入验证码