文章目录

  • 第六章 数组
    • 6.1 筛选法求100以内的素数
    • 6.2 用选择法对10个整数排序
    • 6.3 求3阶矩阵的对角线元素之和
    • 6.4 在有序数组(升序)中插入一个数
    • 6.5 数组逆序排列其数值
    • 6.6 杨辉三角
    • 6.7 魔方阵
    • 6.8 鞍点
    • 6.9 降序数组的折半查找
    • 6.10 二维数组统计字母数字空格等个数
    • 6.11 打印平行四边形
    • 6.12 密码翻译
    • 6.13 链接两个字符串,不使用strcat
    • 6.14 比较字符串,不使用strcmp
    • 6.15 复制字符串,不使用strcpy

第六章 数组

6.1 筛选法求100以内的素数

#include<stdio.h>int main()
{//所谓筛选法就是在一张纸上写上1~100,在把非素数挖掉,剩下的就是素数 int i,j,a[100],count=0;for(i=0;i<100;i++) //有序赋值 a[i]=i+1; //判断素数for(i=0;i<100;i++) //外层控制要判断的数 {for(j=2;j<a[i];j++)if(a[i]%j==0){a[i]=1; //1是非素数,由于1不再循环内,不如把1作为判断为非素数的标志,精简代码 break; } }for(i=0;i<100;i++) //每5个一行,打印 {if(a[i]!=1){printf("%5d",a[i]);count++;if(count%5==0)printf("\n");    }   }return 0;
}
/*
输出结果2    3    5    7   1113   17   19   23   2931   37   41   43   4753   59   61   67   7173   79   83   89   97
*/

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

#include<stdio.h>int main()
{int i,j,a[10],min,temp;for(i=0;i<10;i++) //有序赋值 scanf("%d",&a[i]); printf("sort before:\n"); //排序前for(i=0;i<10;i++) //每5个一行,打印 printf("%5d",a[i]);    //选择排序(第一个和后续所有比较)//冒泡排序(第一个和第二个比较,第二个和第三个比较,两两比较) //从小到大排 for(i=0;i<10;i++) //外层控制比较数 {min=i; for(j=i+1;j<10;j++) //内层控制后续数 if(a[min]<a[j]==0) //从大到小则改为大于。 {temp=a[min]; //交换a[min]=a[j];a[j]=temp;} }printf("\nsort after:\n");    //排序后for(i=0;i<10;i++) //每5个一行,打印 printf("%5d",a[i]);        return 0;
}
/*输出结果
9 7 2 4 6 3 1 5 8 0
sort before:9    7    2    4    6    3    1    5    8    0
sort after:0    1    2    3    4    5    6    7    8    9
*/

6.3 求3阶矩阵的对角线元素之和

#include<stdio.h>int mainsum(int a[][3]);int main()
{int i,j,a[3][3],sum;//赋值 for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);//求主对角线之和//main3sum(a) for(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j)sum+=a[i][j];   printf("主对角线之和 %d",sum);return 0;
}int main3sum(int a[][3]) //抽象成函数
{int i,j,sum=0;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j)sum+=a[i][j];return sum;
}

6.4 在有序数组(升序)中插入一个数

#include<stdio.h>
#define N 1000
void upsort(int a[],int length);
void insert(int a[],int *length);
int main()
{int i,j,a[N],length;scanf("%d",&length);for(i=0;i<length;i++) //有序赋值 scanf("%d",&a[i]); printf("sort before:\n");  //排序前 for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);   upsort(a,length); //排序printf("\nsort after:\n");  //排序后for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);        //插入函数//先考虑插入一个数后是否越界printf("\ninsert value = ");int num;scanf("%d",&num); if(length+1>N) //判断越界 printf("sorry!can not insert anyone");else{if(num>a[length-1]||length==0) //判断是否大于最后一个数 a[length]=num;else{for(i=0;i<length;i++) //判断a[0]-a[n-1]的数 {if(num<=a[i]) //标记第一次出现比num大的下标 {for(j=length;j>=i;j--) //后移数组 a[j+1]=a[j];a[i]=num; //把标记为赋值num的值           } break;    //结束循环  }       }length++; //只要可插入,别忘了数组长度+1 ! }printf("\ninsert after:\n"); //排序后for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);      return 0;
}void upsort(int a[],int length)
{int i,j,min,temp;//选择排序(第一个和后续所有比较)//冒泡排序(第一个和第二个比较,第二个和第三个比较,两两比较) //从小到大排 for(i=0;i<length;i++) //外层控制比较数 {min=i; for(j=i+1;j<length;j++) //内层控制后续数 if(a[min]<a[j]==0) //从大到小则改为大于。 {temp=a[min]; //交换a[min]=a[j];a[j]=temp;} }
} void insert(int a[],int *length) //抽象为函数,由于长度会改变,记得传入地址
{int i,j,num;scanf("%d",&num); if(*length+1>N) //判断越界 printf("sorry!can not insert anyone");else{if(num>a[*length-1]||*length==0) //判断是否大于最后一个数 a[*length]=num;else{for(i=0;i<*length;i++) //判断a[0]-a[n-1]的数 {if(num<=a[i]) //标记第一次出现比num大的下标 {for(j=*length;j>=i;j--) //后移数组 a[j+1]=a[j];a[i]=num; //把标记为赋值num的值            } break;    //结束循环  }       }*length++; //只要可插入,别忘了数组长度+1 ! }
}

6.5 数组逆序排列其数值

#include<stdio.h>
#define N 1000void inverse(int a[],int length); int main()
{int i,j,a[N],length;scanf("%d",&length);for(i=0;i<length;i++) //有序赋值 scanf("%d",&a[i]); printf("inverse before:\n");   //排序前 for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);   int temp;for(i=0;i<length/2;i++){temp=a[i];a[i]=a[length-1-i];a[length-1-i]=temp;}printf("\ninverse after:\n");  //排序后for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);        return 0;
}void inverse(int a[],int length) //抽象成函数
{int i,temp;for(i=0;i<length/2;i++){temp=a[i];a[i]=a[length-1-i];a[length-1-i]=temp;}
}

6.6 杨辉三角

#include<stdio.h>
#define N 100
int main()
{int i,j,a[N][N],level;scanf("%d",&level);for(i=0;i<level;i++){for(j=0;j<=i;j++){if(j==0||j==i)a[i][j]=1;elsea[i][j]=a[i-1][j-1]+a[i-1][j];}  } for(i=0;i<level;i++){for(j=0;j<i+1;j++)printf("%-5d ",a[i][j]);printf("\n"); }return 0;
}
/*
12
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
1     10    45    120   210   252   210   120   45    10    1
1     11    55    165   330   462   462   330   165   55    11    1
*/

6.7 魔方阵

图解:

可以看到三种不同颜色的线,代表三种不同的状态

  1. 直接由行-1,列+1 找到空格子,直接赋值。

  2. 在行-1,列+1时,行列已经时边界,则到边界的一段要到另一端,在在空格子里赋值。

  3. 在上述两种行为后发现格子中已经存在数,则在原数的下方赋值。

    (要是原始的下方也有值咋办,应该不会出现这个情况)

#include<stdio.h>
#define N 1000
int main()
{int i,j,a[N][N]={0},n,k;scanf("%d",&n);a[0][n/2]=1; //初始赋值 int temp_i,temp_j;for(i=0,j=n/2,k=2;k<=n*n;k++) //循环结束的条件时把1-n^2全都赋值完 {temp_i=i; //保存前一个数的坐标  temp_j=j; //保存前一个数的坐标 i=i-1;j=j+1;if(i<0&&j>n-1) //如果上一个数是第一行第n列时 {i=temp_i+1;j=temp_j;    }else{if(i<0) i=n-1;if(j>n-1)j=0;       }   if(a[i][j]) //如果格子存在数{i=temp_i+1;j=temp_j;if(i>n-1)i=0;a[i][j]=k; }         else //若是空格子直接赋值a[i][j]=k;}//打印for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");    }return 0;
}
/*
输出结果
----------------------------
38  1  63  5  74  9  2
----------------------------
517 24  1  8 1523  5  7 14 164  6 13 20 2210 12 19 21  311 18 25  2  9
----------------------------
*/

6.8 鞍点

#include<stdio.h>
#define N 100
int main()
{int i,j,a[N][N],n,m;//设置阶数 scanf("%d %d",&n,&m);//赋值 for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&a[i][j]);printf("\n");int max,min,x_index,y_index;x_index=y_index=-1;for(i=0;i<n;i++){max=0; for(j=0;j<m;j++){if(a[i][max]<=a[i][j]) //找到这一行的最大值,记录下标//这里用<=的原因,假定鞍点至多只有一个,一行可能有多个相同的最大值,去最后一个 max=j;          }//已找到一行的max(i,j)注意i是固定还在外层循环里,故来判定列的最小值的行下标是否为i min=0; for(j=0;j<n;j++) //行遍历注意j<n,不是j<m了 {if(a[min][max]>=a[j][max]) //找到这一列的最小值 min=j;          }if(min==i) //若最小值下标与外层行下标一致则是。驻点只有一个 {x_index=min; y_index=max;break;  }}if(i>=n)printf(" not exist !");elseprintf("a[%d][%d] = %d",x_index,y_index,a[x_index][y_index]);return 0;
}
/*
4 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20a[0][4] = 5
*/
-----------------------
/*
2 2
1 7
4 1not exist !
*/

6.9 降序数组的折半查找

#include<stdio.h>
#define N 1000void downsort(int a[],int length);
int bisearch(int a[],int length,int search);int main()
{int i,j,a[N],length;scanf("%d",&length);for(i=0;i<length;i++) //有序赋值 scanf("%d",&a[i]); printf("inverse before:\n");   //排序前 for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);   downsort(a,length); //排序 从大到小 printf("\ninverse after:\n");   //排序后for(i=0;i<length;i++) //每5个一行,打印 printf("%5d",a[i]);        //折半查找 int search,index=-1,front,end,middle;printf("\nsearch = :");scanf("%d",&search);   //index=bisearch(a,length,search);front=0;end=length-1;middle=0;while(front<=end){middle=(front+end)/2;if(a[middle]>search) //左边 front=middle+1;     else if(a[middle]<search)  //右边 end=middle-1; else{index=middle;break; }   }   if(index>=0)printf("%d 是数组第 %d 个元素",search,index+1);elseprintf("数组内无此数");return 0;
}int bisearch(int a[],int length,int search) //抽象成函数 找不到返回-1,找得到返回下标
{int i,front,end,middle,index;front=0;end=length-1;middle=0;while(front<=end){middle=(front+end)/2;if(a[middle]>search) //左边 front=middle+1;      else if(a[middle]<search)  //右边 end=middle-1; elsereturn index; }return -1; //找不到返回 -1 不存在下标负数
}void downsort(int a[],int length)
{int i,j,min,temp;//选择排序(第一个和后续所有比较)//冒泡排序(第一个和第二个比较,第二个和第三个比较,两两比较) //从小到大排 for(i=0;i<length;i++) //外层控制比较数 {min=i; for(j=i+1;j<length;j++) //内层控制后续数 if(a[min]>a[j]==0) //从大到小则改为大于。 {temp=a[min]; //交换a[min]=a[j];a[j]=temp;} }
}

6.10 二维数组统计字母数字空格等个数

#include<stdio.h>
#define N 100int statistics(char c);int main()
{int i,j,box[5]={0};char c[3][81];//给每一行赋值 for(i=0;i<3;i++)gets(c[i]);//统计字符 for(i=0;i<3;i++){ for(j=0;j<strlen(c[i]);j++)box[statistics(c[i][j])]++;} //打印统计结果printf("大写英文\t%d",box[0]); printf("小写英文\t%d",box[1]);printf("数字\t%d",box[2]);printf("空格\t%d",box[3]);printf("其他字符\t%d",box[4]);return 0;
} int statistics(char c) //抽象为函数形式
{if(c>='A'&&c<='Z')return 0;else if(c>='a'&&c<='z')return 1;else if(c>='0'&&c<='9')return 2;else if(c==' ')return 3;elsereturn 4;
}
/*输出结果
I am a student.
123456
ASDFG
大写英文        6
小写英文        10
数字            6
空格            3
其他字符        1
*/

6.11 打印平行四边形

#include<stdio.h>
#define N 100
int main()
{int i,j,a[N][N],n;//设置阶数 scanf("%d",&n);//赋值 for(i=0;i<n;i++){for(j=0;j<i;j++) //打印空格 printf(" ");for(j=0;j<n;j++) //打印 * printf("* ");printf("\n");}return 0;
} 

6.12 密码翻译

#include<stdio.h>
#include<string.h>
int main()
{int i;char c[80];gets(c);putchar('\n');//编译成密文for(i=0;i<strlen(c);i++){     if(c[i]>='A'&&c[i]<='Z')c[i]='A'+25-(c[i]-'A');else if(c[i]>='a'&&c[i]<='z')c[i]='a'+25-(c[i]-'a');}puts(c); putchar('\n');//翻译回原文 for(i=0;i<strlen(c);i++){    if(c[i]>='A'&&c[i]<='Z')c[i]='Z'-25+('Z'-c[i]);else if(c[i]>='a'&&c[i]<='z')c[i]='z'-25+('z'-c[i]);} puts(c); return 0;
} /*
输出结果
R droo erhrg Xsrmz mvcg dvvp.I will visit China next week.R droo erhrg Xsrmz mvcg dvvp.*/
----------------------------------
/*
I will visit China next week.R droo erhrg Xsrmz mvcg dvvp.I will visit China next week.
*/

6.13 链接两个字符串,不使用strcat

#include<stdio.h>
#define N 100void u_stract(char str1[],char str2[]);int main()
{char a[N],b[N];//赋值    gets(a);gets(b);u_stract(a,b);//打印链接后的a puts(a);return 0;
} void u_stract(char str1[],char str2[]) //抽象为函数形式
{int i,j;while(str1[i]!='\0') i++;for(j=0;str2[j]!='\0';j++,i++)str1[i]=str2[j];str1[i]='\0';
}

6.14 比较字符串,不使用strcmp

#include<stdio.h>
#define N 100int u_strcmp(char str1[],char str2[]);int main()
{char a[N],b[N],c[N],d[N];//赋值  gets(a);gets(b); //相同值gets(c); //a>cgets(d); //a<d//输出结果printf("相同值结果 %d\n",u_strcmp(a,b));printf("a>c结果 %d\n",u_strcmp(a,c));printf("a<d结果 %d\n",u_strcmp(a,d));return 0;
}int u_strcmp(char str1[],char str2[]) //抽象为函数形式
{int i,j;for(i=0;str1[i]!='\0'||str2[i]!='\0';i++)if(str1[i]>str2[i])return 1;else if(str1[i]<str2[i])return -1;elsecontinue;if(str1[i]=='\0'&&str2[i]!='\0')return -1;else if(str1[i]!='\0'&&str2[i]=='\0')return 1;else if(str1[i]=='\0'&&str2[i]=='\0')return 0;
}
/*
输出结果
12345
12345
123
123456789
相同值结果 0
a>c结果 1
a<d结果 -1
*/

6.15 复制字符串,不使用strcpy

#include<stdio.h>
#define N 100void u_strcpy(char str1[],char str2[]) ;int main()
{char a[N],b[N];//赋值    gets(a);gets(b); //相同值u_strcpy(a,b);    //输出结果printf("打印拷贝后的a:↓\n"); puts(a);return 0;
}void u_strcpy(char str1[],char str2[]) //抽象为函数形式
{int i;for(i=0;str2[i]!='\0';i++)str1[i]=str2[i];str1[i]='\0';
}
/*
输出结果
12345679865465465
1212
打印拷贝后的a:↓
1212
*/

谭浩强c语言课后习题笔记[第6章]相关推荐

  1. 谭浩强c语言课后习题笔记[1-4章]

    c语言程序设计(第五版)谭浩强课后习题笔记 文章目录 c语言程序设计(第五版)谭浩强课后习题笔记 第一章 程序设计和c语言 1.4 打印 Hello World 1.6 输入abc求最大值 第二章 算 ...

  2. 【第二章】谭浩强C语言课后习题答案

    1. 什么是算法?试从日常生活中找3个例子,描述它们的算法 算法:简而言之就是求解问题的步骤,对特定问题求解步骤的一种描述. 比如生活中的例子: 考大学 首先填报志愿表.交报名费.拿到准考证.按时参加 ...

  3. 谭浩强C语言程序设计代码示例第6章(笔记)

    谭浩强C语音程序设计代码示例第六章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  4. 谭浩强C语言程序设计代码示例第5章(笔记)

    谭浩强C语音程序设计代码示例第四章(新手入门笔记) 第一章包含参考书,在线编译工具,代码,注释等. 遵循共享互助原则 谭浩强C语言程序设计代码示例(1-3章) 谭浩强C语言程序设计代码示例第4章(笔记 ...

  5. C程序设计-谭浩强 第三版-学习笔记第1章 C语言概述

    第一章 C语言概述 1.C语言历史背景 C语言是在B语言的基础上发展起来的,兼具一般高级语言和低级语言的优点,可用来编写系统软件或应用软件. 1972-1973年,贝尔实验室在B语言基础上设计出C语言 ...

  6. C++程序设计(第二版)谭浩强----程序题课后习题答案第二章

    3. #include<iostream> using namespace std; int main() {char c1 = 'a', c2 = 'b', c3 = 'c', c4 = ...

  7. 谭浩强c语言不讲位运算呢,谭浩强c语言教程_第十二章-位运算谭浩强c语言教程_第十二章-位运算.doc...

    12位运算1 12.1位运算符C语言提供了六种位运算符:1 12.1.1按位与运算1 12.1.2按位或运算2 12.1.3按位异或运算2 12.1.4求反运算3 12.1.5左移运算3 12.1.6 ...

  8. C程序设计-谭浩强 第三版-学习笔记 第2章 程序的灵魂 算法

    第 2 章 算法 --程序的灵魂 程序 = 算法 + 数据结构 (沃思,计算机科学家) 一个程序应该包括两方面: 对数据的描述:在程序中要指定数据的类型和数据的组织形式,即数据结构(data stru ...

  9. 谭浩强c语言程序设计第五版---第一章

    5.编写程序,输出平行四边形**** (1) #include<cstdio> int main(){int i,j,k;for(i=0;i<4;i++){//确定形状的关键代码 f ...

最新文章

  1. celery源码分析-wroker初始化分析(上)
  2. linux 内核 fork,《Linux内核分析》之分析fork函数对应的系统调用处理过程
  3. Android LayoutInflater详解(转)
  4. CMOS与BIOS的区别
  5. fwrite函数的一般调用形式是什么?
  6. Bootstrap按钮的状态
  7. pfSense 2.3.5发布!汉化包同步发布!
  8. 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
  9. c++ 课程设计之车票管理系统
  10. 王道计算机考研图书勘误表公布!
  11. 关系代数表达式_英语学数学 | 英语学代数XYZ,一样很简单
  12. 汇率换算自然语言理解功能JAVA DEMO
  13. wine android模拟器,Mac  下运行window 软件,(wine 模拟器)
  14. Java应届生面试必备考题(附答案)
  15. Intouch2020与施耐德PLC通讯
  16. html隐藏汉堡按钮,12种汉堡包图标按钮变形动画特效
  17. 嵌入式OS的现状、智能的物联网与未来的机器人
  18. Linux下Oracle移植数据
  19. 0315-HttpURLConnection和JASON结合使用(以天气预报为例)
  20. SQL Sever 2012

热门文章

  1. 卡尔曼滤波simulink模型_电池管理系统---Simulink源码/资料分享及Live 介绍
  2. MATLAB 怎样将文本复制到剪切板
  3. 给大家介绍几个手机冷门但好用的小技巧
  4. 姓名验证生僻字 php,正则_验证文本框输入的姓名是否规范(包含生僻字,不包含中文符号与其他字符)...
  5. win10/win11开机自动连接指定WiFi - 任务计划运行bat脚本
  6. JVM 的垃圾回收器
  7. AVAsset、AVMutableComposition系列类的理解及视频裁剪示例
  8. P6166 [IOI2012]scrivener
  9. 参考文献查重的技巧有哪些?
  10. 通信算法之七十五:无人机通信-接收信号解析破解