C语言程序设计(第四版)谭浩强版 课后答案 第六章 数组

1、筛选法:可以先到网上看看定义在写算法

复制代码
#include<stdio.h>
int main(){
    int a[100];
    int i,j;
    for(i=0;i<100;i++){
        a[i]=i+1;
    }
    a[0] = 0;
    for(i=0;i<100;i++){
        for(j=i+1;j<100;j++){
           if(a[i]!=0&&a[j]!=0){
                if(a[j]%a[i]==0){
                    a[j]=0;
                }
           }
        }
    }
    printf("the prime number of 1-100 are:\n");
    for(i=0,j=0;i<100;i++){
        if(a[i]!=0){
            printf("%d  ",a[i]);
            j++;
            if(j==5){
                j=0;
                printf("\n");
            }
        }
    }
    return 0;
}
复制代码

2、选择排序(从小到大),每次选择一个最小的出来

复制代码
#include<stdio.h>
int main(){
    int a[10];
    int i,j,min,temp;
    printf("please input 10 numbers:");
    for(i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++){
        min=a[i];
        for(j=i+1;j<10;j++){
            if(min>a[j]){
                temp=min;
                min=a[j];
                a[j]=temp;
            }
        }
        a[i]=min;
    }
     for(i=0;i<10;i++){
        printf("%d  ",a[i]);
    }
    printf("\n");
    return 0;
}
复制代码

3、此处代码没有做输出,直接复制,若需输入则可以做一个双层循环

复制代码
#include<stdio.h>
int main(){
    int a[3][3] = {{1,2,3},{1,2,3},{1,2,3}};
    int i,j,sum = 0;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            if(j==i){
                sum+=a[i][j];
            }
        }
    }
    printf("the diagoline sum is:%d\n",sum);
    return 0;
}
复制代码

4、插入如何往后移,从最后一个一个往后拿最简单,但是这个程序插入的数是最大时,运行错误,索性直接把最大的情况,单独拿出来描述。

复制代码
#include<stdio.h>
int main(){
    int a[100];
    int n,x,i,j;
    printf("how many number you want enter:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }

    printf("please input the number you want insert:");
    scanf("%d",&x);
    if (x>a[n-1]){
        a[n]=x;
    }
    else{
         for(i=0;i<n;i++){
            if(a[i]>x){
              for(j=n;j>i;j--){
                    a[j]=a[j-1];     
             }
             a[i]=x;
             break;
            }
         }
    }
    for(i=0;i<=n;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}
复制代码

5、将一组有序数逆序输出

复制代码
#include<stdio.h>
int main(){
    int a[100];
    int t,n,i,j;
    printf("how many number you want enter:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=0,j=n-1;i<=n/2;i++){
        t = a[i];
        a[i]=a[j];
        a[j]=t;
        j--;
    }
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
}
复制代码

6、输出杨辉三角

复制代码
#include<stdio.h>
int main(){
    int a[10][10]={0};
    a[0][0]=1;
    a[1][0]=1;
    a[1][1]=1;
    int i,j;
    for(i=2;i<10;i++){
        a[i][0]=1;
        a[i][i]=1;
        for(j=1;j<i;j++){
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(a[i][j]!=0){
                printf("%d ",a[i][j]);
            }
        }
        printf("\n");
    }
    return 0;
}
复制代码

7、

(1)将1放在第1行中间一列。

(2) 从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5 在4的上一行后一列)。

(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则⒉应放在最下一行,列数同样加1。

(4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。

(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面.由于6是第1行第3列(即最后一列),故7放在6下面。

按此方法可以得到任何阶的魔方阵。

复制代码
#include<stdio.h>
int main(){
    int a[20][20];
        int n,i,j,k;
        printf("please input the order:");
        scanf("%d",&n);
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                a[i][j]=0;
            }
        }
        //先找1存放的位置
        i=0;
        j=n/2;
        a[i][j]=1;

        for(k=2;k<=n*n;k++){
            i=i-1;
            j=j+1;
            if((i<0)&&(j==n)){
                i=i+2;
                j=j-1;
            }else{
                if(i<0) 
                    i=n-1;
                if(j==n)
                    j=0;
            }
            if(a[i][j]==0){
                a[i][j]=k;
            }else{
                i = i+2;
                j=j-1;
                a[i][j]=k;
            }
        }
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                printf("%5d",a[i][j]);
            }
            printf("\n");
        }
        return 0;

}
复制代码

 8、鞍点没有想法,一行中先找最大值,然后判断是不是他列的最小值。

复制代码
#include<stdio.h>
#define N 100

int main()
{
    float a[N][N] = {0},
          max, min; 
          
    int i, j,
        h, l, //行数、列数  
        m, n; //中间变量 
    
    //输入二维数组的行、列数
    scanf("%d %d", &h, &l);
    
    //输入二维数组 
    for(i = 0; i < h; i++)
        for(j = 0; j < l; j++)
            scanf("%f", &a[i][j]);
    
    //输出二维数组        
    for(i = 0; i < h; i++){
        for(j = 0; j < l; j++)        
            printf("%5.1f", a[i][j]);
            printf("\n");
    }
    
    //找寻鞍点 
    int flag = 0; //判断是否找到鞍点
    for(i = 0; i < h; i++){
        max = a[i][0];
        for(j = 0; j < l; j++){ //先在一行中找寻最大值
            if(max < a[i][j])
                max = a[i][j];
            m = i; 
            n = j;    
        }
        min = a[m][n];
        for(i = 0; i < h; i++)  //判断改行最大值是否为该列最小值
            if(min > a[i][n]) break;
        if(i == h){
            printf("\n鞍点为%.1f\n", a[m][n]);
            flag = 1;
        }     
    }     
    if(!flag) printf("无鞍点!!!");
    return 0; 
 }
复制代码

9、折半查找

复制代码
#include<stdio.h>
int main(){
    int x,i,mid,b,c;
    int a[15]={1,3,4,5,6,7,9,10,12,14,15,16,17,23,24};//直接赋值
    printf("please input a number of inserting:");
    scanf("%d",&x);
    b=0;
    c=14;
    mid=(c+b)/2;
    while(b<=c){
        if(x>a[mid]){
            b = mid+1;
        }
        else if(x<a[mid]){
            c = mid-1;
        }
        else {
            break;
        }
        mid = (b+c)/2;
    }
    if(b>c)
        printf("not found\n");
    else
        printf("the subscript is :%d\n",mid+1);
    return 0;
}
复制代码

10、主要问题在输入,三行用二维数组,每一行读入用gets,每一行循环结束用\n

复制代码
#include<stdio.h>
int main(){
    int i,j,q=0,p=0,z=0,o=0,n=0;
    char a[3][80];
    for(i=0;i<3;i++){
        printf("%d行:",i+1);
        gets(a[i]);
    }
    for(i=0;i<3;i++){
        for(j=0;a[i][j]!='\0';j++){
            if(a[i][j]>='A'&&a[i][j]<+'Z') q++;
            else if(a[i][j]>='a'&&a[i][j]<='z') p++;
            else if(a[i][j]>='0'&&a[i][j]<='9') z++;
            else if(a[i][j]==' ') o++;
            else n++;
        }
    }
     printf("大写字母:%d\n小写字母:%d\n数字:%d\n空格:%d\n其它:%d\n",q,p,z,o,n);

    return 0;
}
复制代码

11、

复制代码
#include<stdio.h>
int main(){
    int i,j,k;
    for(int i=1;i<=5;i++){
        for(j=1;j<=i;j++){
            printf(" ");
        }
        for(k=1;k<=5;k++){
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}
复制代码

12、密码译为原文

复制代码
#include<stdio.h>
int main(){
    char a[20];
    int i=0;
    printf("please inpput crypto:");
    scanf("%s",a);
    printf("the crypto is:%s\n",a);
    while(a[i]!='\0'){
        if(a[i]>='A'&&a[i]<='Z'){
            a[i]=64+(26-(a[i]-65+1)+1);
        }
        if(a[i]>='a'&&a[i]<='z'){
            a[i]=96+(26-(a[i]-97+1)+1);
        }
          i++;
    }
    printf("the original text is:%s\n",a);

    return 0;
}
复制代码

13、字符串连接实现

复制代码
#include<stdio.h>
int main(){
    char a[100],b[10];
    int i=0,j=0;
    printf("please input first string:");
    gets(a);
    printf("please input second string:");
    gets(b);
    puts(a);
    puts(b);
    while(a[i]!='\0'){
        i++;
    }
    while(b[j]!='\0'){
        a[i]=b[j];
        i++;
        j++;
    }
    a[i]='\0';
    puts(a);
    return 0;

}
复制代码

 

14、strcpy实现

复制代码
#include<stdio.h>
int main(){
    char a[10],b[10];
    int i=0,j;
    printf("please input first string:");
    gets(a);
    printf("please input second string:");
    gets(b);
    while(a[i]!='\0'){
        if(a[i]!=b[i]){
            j=a[i]-b[i];
            break;
        }
        i++;
    }
    if(b[i]=='\0'){
        j=0;
    }
    printf("the difference is %d\n",j);
    return 0;
}
复制代码

15、字符串复制

复制代码
#include<stdio.h>
int main(){
    char a[20],b[20];
    int i=0,j=0;
    printf("please input first string:");
    gets(a);
    printf("please input second string:");
    gets(b);
    puts(a);
    puts(b);
    while(b[i]!='\0'){
        a[i]=b[i];
        i++;
    }
    a[i]='\0';
    puts(a);

    return 0;
}
复制代码

 

posted @   风中凌乱的猪头  阅读(178)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示