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; }
分类:
C语言学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)