C语言不挂科之我爱谭浩强——编程题拿高分(附例题答案和知识点详解)
期末考试要考C语言,边复习边写博客,总结了一些自己不太明白或者可能出错的知识点。现自己已经弄明白,写的你们肯定也能明白,希望期末备考的同学们不挂科,也适合自学C语言的小白哦
这篇博客主要写指针,由易到难,会了指针,前面的例题也就都会了。
先来个冒泡排序热身吧
#include<stdio.h>
void swap(int *a,int *b){int temp = *a;*a = *b;*b = temp;
}int main(){int arr[6]={2,5,8,1,6 ,4};int i, j, temp,len=6;for (i = 0; i < len - 1; i++)for (j = 0; j < len - 1 - i; j++)if (arr[j] > arr[j + 1]) {swap(&arr[j], &arr[j + 1]);}for (i = 0; i < len; i++){printf("%d ",arr[i]);}
}
https://blog.csdn.net/weixin_45755332/article/details/106892672
- 对三个数进行大小排序
# include <stdio.h>
int swap(int *p,int *q);
int main(){int a=5, b=11, c=9;
int *p1=&a,*p2=&b,*p3=&c;
printf("%d %d %d\n",a,b,c);
printf("%d %d %d\n",p1,p2,p3);if (a>b){swap(p1,p2);}if(a>c){swap(p1,p3);}if (b>c){swap(p2,p3);}printf("%d %d %d\n",a,b,c);printf("%d %d %d\n",p1,p2,p3);
}int swap(int *p,int *q){int o;o = *p;*p = *q;*q = o;}5 11 9
6487556 6487552 6487548
5 9 11
6487556 6487552 6487548
这个swap函数必须用指针写,如果这样,两个数在函数内是交换了,但没有返回主函数,所以必须用指针写,由结果可以看出,函数交换了指针上存放的数值,指针本身并没有变。
int swap(int p,int q){int o;o = p;p = q;q = o;
}
- 对10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换
# include <stdio.h>
int swap(int *p,int *q);
int main( ){int a[10]={11,5,8,7,6,9,0,3,4,2} ,*min,*max,*p;max=min=a;p=a; for (;p<a+10;p++){if (*max<*p)max=p;}swap(a+9,max);for (p=a;p<a+10;p++){if(*min>*p)min=p; }swap(a,min);for (p=a;p<a+10;p++)printf("%d ",*p);
}int swap(int *p,int *q){int o;o = *p;*p = *q;*q = o;
}
本题的主要思路就是先让max和min都等于第一个值的地址,让其与后面的每一个值的地址进行比较,(注意这里是指针的大小比较)如果min比后面的某个值x大,就把x的地址赋值给min,若还有个y比x还小,就把y的地址再赋值给min,直到找到最小的值。注意这时并没有进行数值交换,只是min这个指针指向了不同的数值,下面的swap函数才让其交换了地址所存放的数值。max是一样的。
有的同学可能会想到,用一个for循环,直接找出最大和最小的值不就行吗。不行!
因为这里有个bug如果a=>第一个数是最大的,b=>最后一个数为最小的,a||b 之能交换一个最值,a&b直接不交换。要是非得用也行, 看老谭怎么写的吧
- 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
# include <stdio.h>
int main(){int i, k, m, n, num[50], *p;printf("input number of person: n=" );scanf("%d", &n);p=num;for(i=0;i<n;i++) //给人数编号*(p+i)=i+1;i=0; //i为每次循环时计数变量k=0; //k为按1 2 3报数的计数变量m=0; //m 是出局的人数while(m<n-1){ //m 是出局的人数,因有n个人,最后剩一个人,最多出局(n-1)个人if( *(p+i) != 0) //判断这个序号(原来的序号)是否出局k++; //如果这个号没有出局,就报数,计数器加1,要是出局了就不算这个号了if(k==3){ //报3的出局*(p+i)=0; //将出局的这个人标记为0k=0; //使计数器置零,重新数1 2 3m++; //出局人数计数器加1} i++; //将指针后移,虽然i不是指针,但p+i就是指针了,i为指针服务if(i==n) //如果指针移到了尾部,则返回到头部i=0; //因为编号是从1开始的,所以i=0,以确保下一个是开头}int a=0; for(i=0;i<n;i++){ //因为报到3的就设置成0了,所以加起来就是最后那个序号 a+=num[i]; }printf("最后一个是%d ",a);}
4. 将一个3x3矩阵进行转置操作
# include<stdio.h>
int main(){int a[3][3]={1, 2,3, 4, 5 ,6, 7 ,8 ,9 },t ,*p;printf("原矩阵\n");for (int i=0;i<3;i++){for (int j=0;j<3;j++)printf("%d ",a[i][j]);printf("\n");}p=&a[0][0];for (int i=0;i<3;i++){for (int j=i;j<3;j++){t=*(p+3*i+j);*(p+3*i+j)=*(p+3*j+i);*(p+3*j+i)=t;}}printf("转置矩阵\n");for (int i=0;i<3;i++){for (int j=0;j<3;j++)printf("%d ",a[i][j]);printf("\n");}}原矩阵
1 2 3
4 5 6
7 8 9
转置矩阵
1 4 7
2 5 8
3 6 9
这个指针挺简单的,关键是两两交换为啥那样。
在这个33矩阵a中, a [ i ] [ j ] a[i][j] a[i][j]就是第3i+j个数,如 a [ 2 ] [ 1 ] a[2][1] a[2][1]就是第3*2+1=7个数(注意C语言是从0开始计数的)。*p是数组中第一个数第地址, ( p + 3 ∗ i + j ) (p+3*i+j) (p+3∗i+j)j就是a[i][j]的地址,转置矩阵的 a [ i ] [ j ] = a [ j ] [ i ] a[i][j]=a[j][i] a[i][j]=a[j][i],两个地址交换一下就ok了
C语言不挂科之我爱谭浩强——编程题拿高分(附例题答案和知识点详解)相关推荐
- C语言不挂科之我爱谭浩强——选择填空拿满分(附例题答案和知识点详解)
C语言程序的基本单位是___C___. A.程序行 B.语句 C.函数 D.字符 请选出可用作C语言用户标识符的一组标识符___B___. A.void . define . WORD B.a3_b3 ...
- 《C语言程序设计(第四版)谭浩强》学习笔记
<C语言程序设计(第五版)谭浩强>学习笔记 C语言程序设计(第五版)谭浩强>学习笔记 1 C语言概述 1.7 简单的C程序介绍 1.9 C源程序的结构特点 1.12 C语言词汇 2 ...
- C语言程序设计,第四版 ,谭浩强。绝对原版,最新的资料
C语言程序设计第四版 转载于:https://blog.51cto.com/7342347/1217300
- c语言谭浩强第六章答案,C语言谭浩强版本第6章课后练习题答案..doc
第6章课后练习题 单项选择题 以下程序执行后,a是: int a =0,i,j; for (i=5;i>0;i--) for(j=0;j<4;j++) a++; 20 25 24 30 执 ...
- C语言程序设计(第4版)谭浩强著—学习笔记chapter two 数据的存储与运算
第二章 数据的存储与运算 2.1数据在计算机中如何存储 关于整型数据的运算 关于实型数据的运算 关于字符型数据的运算 符号常量 2.2算术运算符和算数表达式 算数运算符 C算数运算式 提高部分(未完) ...
- C语言程序设计(第4版)谭浩强著—学习笔记chapter one 程序设计与C语言
第一章 程序设计与C语言 1.1机器语言和高级语言 1.2 C语言的出现和发展过程 1.3简单的C语言程序 stdio.h main函数 printf函数 scanf函数 格式字符串 \n换行符 re ...
- C语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列
1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果.两个整数由键盘输入. #include<stdio.h> void main(void) {in ...
- C语言程序设计(第五版)谭浩强著 第4章习题答案
1. 算数运算: 加.减.乘.除.取余等运算的统称 关系运算: 关系运算就是"比较运算",将两个数值进行比较,判断其比较的结果是否符合给定的条件. 逻辑运算: 与&& ...
- C语言谭浩强第三版第九章例题及课后题:预处理命令
目录 9.1定义一个带参数的宏,使两个参数的值互换 9.2输入两个整数,求它们相除的余数 9.3求三角形面积 9.4(5)判断闰年 9.5分析下面的宏所定义的输出格式 9.6设计输出实数的格式 9.7 ...
最新文章
- 最小生成树板子-AcWing 858. Prim算法求最小生成树
- hdu5384(AC自动机+纪录重复单词出现的次数)
- spark on k8s准确完整的测试步骤:提交Pi计算程序至k8s集群
- linux中tree命令
- 如何开始使用任何类型的数据? - 第1部分
- 360技术嘉年华第七季——测试之美 报名啦
- 韩顺平循序渐进学java 第21.22.23.24讲 集合
- 嵌入式Linux开发工具(vim的使用)
- bos物流项目面试问题汇总
- 嵌入式开发板硬件操作入门学习3——电机驱动板
- 微信开发验证php,解析微信公众平台开发之验证步骤实例(PHP版)
- 计算机多媒体最新参考文献,多媒体技术计算机论文,关于基于多媒体技术计算机教学因相关参考文献资料-免费论文范文...
- ETCD 一 什么是ETCD
- JMeter察看结果树响应数据都是相同原因
- python 背记手册 PDF 打包版
- 硅谷互联网巨头们对区块链PlusFo超级链感兴趣?原因何在!
- Hibernate 一对一关系映射总结篇
- 创客学院 level1第二节学习完成
- ITE平台开发 chapter4 - https通信
- Android 图片下载或上传时请求失败。