C语言每日一题之No.4
这几天老大也没安排我什么项目,于是想正好趁着空补C。当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台。 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家在关心Linux玩得顺溜不顺溜的情况下,我在补C,万恶的C。想想也是,这种最最基础的C语言只能自己挤出时间来补了,在公司最起码也得学点高端点的,比如Linux,如果作为一个软件开发人员,你不会Linux还搞毛线啊?
好吧,工作一天了,今日吐槽完毕,人生因吐槽而舒畅爽快 ,神一样的存在。此时此刻就是回家之后在电脑跟前老老实实补C了,加油,girl ! ^_^
一. 题目:从键盘输入一个n×n的二维数组(n键盘输入),找出此二维数组中各行的最大值,并按从大到小的次序输出
各行的最大值及此值所在的行号。如:
输入
4 (n=4)
13 34 23 44
45 78 21 30
98 32 11 50
5 66 88 22 (n×n)
输出
98 3(最大98,在第3行)
88 4
78 2
44 1
45
二.思路:定义一个二维数组,其大小由输入决定
依次输入二维数组的每个元素
循环比较一维数组得出每行最大值并记录该行(定义一个结构体存储最大值和改行)
将各个最大值和行数进行排序输出
三.程序:
#include <stdio.h> int main(void)
{
int size;
scanf("%d\n",&size); int arry[size][size]={}; return ; }
就先程序到此为止,碰到了问题:
1.数组的大小不可以是变量,怎么解决这个由输入来决定数组大小?
2.多维数组如何初始化?
解答:
1.数组声明时的大小确实必须是常亮,但实际几维取决于数组里的元素,也就是说可以通过控制输入元素来控维数
2.多维数组初始化按格式 { { },
{ },
{ },
.
.
.
}
好吧,继续程序:
#include <stdio.h>
#include <string.h> #define SIZE 80 //最大值函数
int max_func(int x,int y)
{
int max = ;
max = x > y ? x:y; return max; } int main(void)
{ int num = ;
int max = ;
int arry[SIZE][SIZE]={};
typedef struct
{
int max;
int line;
}s_order,s_order*;//定义结构体用来存储行和该行最大值 printf("Please input the size of the arry:\n");
scanf("%d\n",&num); s_order* order[SIZE];
printf("please input the elements of the arry:\n");
for(int i=;i<num;i++)
{
scanf("%d ",&max);//max保存每行第一个元素
for(int j=;j<num;j++)
{
scanf("%d ",&arry[i][j]) ;
max=max_func(max,arry[i][j]);
}
//将比较出来的每行最大值存在s_order结构体的max元素中,且该行保存在line元素中
order[i].max = max;
order[i].line = i;
} s_order* temp[SIZE];
for(i=;i<num;i++)
{
//把s_order结构体中的max元素单独拿来排序
if( order[i].max< order[i+].max)
{
temp = order[i];
order[i] = order[i+];
order[i+] = temp;
}
//如果要换顺序,连同整个结构体数组都换掉,这样就可以达到最大值和行数同步了
} for(i=;i<num;i++)
printf("%d %d\n",order[i].max,order[i].line);
return ; }
四.编译运行:
在结构体定义那里报错:missing ';' before '*'。
1.然后想了想,为嘛一定要s_order*呢?以为下面要用到结构体数组order[SIZE],所以就一定要定义成
结构体指针类型吗?不能直接就用结构体类型吗?
2.上面竟然用了数组整体赋值,temp是数组啊亲,真是碉堡了,不长记性吧同时,还有一个很奇怪的地
方,既然交换时不能使用数组整体复制,那就不要把temp定义成数组就好啦。再说了,temp是用来交换
的中间值,它干嘛要定义成数组?
3.为什么输完矩阵后,按回车没有继续往下走呢?
那是因为你在scanf(“%d ”)的%d后面不该加那么多空格。
五.分析问题:
1.去掉结构体指针,将结构体数组定义成结构体类型
2.交换数组那里改成用memcpy的方法
3. 将scanf那里("%d ")里的空格符去掉
六.改进
#include <stdio.h>
#include <string.h> #define SIZE 80 //最大值函数
int max_func(int x,int y)
{
int max = ;
max = x > y ? x:y; return max; } int main(void)
{ int num = ;
int max = ;
int arry[SIZE][SIZE]={};
typedef struct
{
int max;
int line;
}s_order;//定义结构体用来存储行和该行最大值 printf("Please input the size of the arry:\n");
scanf("%d",&num); s_order order[SIZE]={};
printf("please input the elements of the arry:\n");
for(int i=;i<num;i++)
{
scanf("%d",&max);//max保存每行第一个元素
for(int j=;j<num;j++)
{
scanf("%d",&arry[i][j]) ;
max=max_func(max,arry[i][j]);
//将比较出来的每行最大值存在s_order结构体的max元素中,且该行保存在line元素中
}
order[i].max = max;
order[i].line = i;
} for(i=;i<num;i++)
{
printf("the max num of every line is:\n");
printf("%d\n",order[i].max);
}
s_order temp={};//结构体怎么初始化?
for(i=;i<num-;i++)
{
//把s_order结构体中的max元素单独拿来排序
if( order[i].max< order[i+].max)
{
memcpy(&temp,&order[i],sizeof(order));
memcpy(&order[i],&order[i+],sizeof(order));
memcpy(&order[i+],&temp,sizeof(order));
}
//如果要换顺序,连同整个结构体都换掉,这样就可以达到最大值和行数同步了
} for(i=;i<num;i++)
{
printf("the order of the max is:\n");
printf("%d %d\n",order[i].max,order[i].line);
}
return ; }
七.运行结果:
很显然,前面各行最大值以及对应的行都已经顺利得出,就是比较各行最大值时出了问题。
八.问题分析
就程序而言,将得出的各行最大值排序时,就直接两两相邻比较肯定是无法排序成功的,应该是冒泡法的思维。同时,还有个很奇怪的地方:temp不是已经不是数组了吗?那就不存在数组整体复制啦,为何还要通过memcpy来规避?明明之前的交换法就可以用啊!可是到底memcpy是怎样呈现出以上结果的呢?
s_order temp={,};//结构体怎么初始化?
int len = ;
//运用冒泡法思维来对各行最大值进行排序
for(i=;i<num;i++)
{
//把s_order结构体中的max元素单独拿来排序
for(int j=;j<num--len;j++)
{
if( order[j].max< order[j+].max)
{
temp = order[j];
order[j] = order[j+];
order[j+] = temp;
}
//如果要换顺序,连同整个结构体都换掉,这样就可以达到最大值和行数同步了
}
len++;
}
运行结果:
九.贴出网上的解答版本
#include <stdio.h>
#include <string.h>
int main(void)
{
int a[][],b[],c[];
//定义b数组保存各行最大值,c数组保存各行行号
int n,i,j,k=,l=,index,max,temp;
scanf("%d",&n);
11
printf("请输入%d阶矩阵:",n);
for(i=;i<n;i++)
for(j=;j<n;j++)
scanf("%d",&a[i][j]);
for(i=;i<n;i++)
{
max=a[i][];
for(j=;j<n;j++)
if(a[i][j]>max) max=a[i][j];
b[k++]=max;
//记录此行的最大值
c[l++]=i+;
//记录这时的行号
}
for(i=;i<n-;i++)//选择排序
{
index=i;
for(j=i+;j<n;j++)
if(b[j]>b[index]) index=j;
if(index==i) continue;
temp=b[index];
b[index]=b[i];
b[i]=temp;
temp=c[index];
//交换最大值时别忘了交换相应的行号
c[index]=c[i];
c[i]=temp;
}
printf("每行最大数排序后:\n");
for(i=;i<n;i++)
printf("%-4d在第%2d行\n",b[i],c[i]); return ;
}
[/code]
十.知识点:
1.结构体数组的定义
2.结构体的初始化
3.memcpy
4.scanf输入符格式带空格怎么处理?
C语言每日一题之No.4的更多相关文章
- C语言每日一题之No.1
鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...
- C语言每日一题之No.9
再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...
- C语言每日一题之No.8
正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...
- C语言每日一题之No.3
几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<.虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透 ...
- C语言每日一题之No.12
文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,count,siz ...
- C语言每日一题之No.7
今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...
- C语言每日一题之No.6
人总要战胜内心的懦弱的,我不能一直这么缩在里边.终究向自己发出了挑战,还是会伤心的时候,发愣的时候.如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来.可是,我们谁又能抗拒时间呢?这雨 ...
- C语言每日一题之No.5
总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...
- C语言每日一题之No.2
题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...
随机推荐
- Apache HttpClient使用之阻塞陷阱
前言: 之前做个一个数据同步的定时程序. 其内部集成了某电商的SDK(简单的Apache Httpclient4.x封装)+Spring Quartz来实现. 原本以为简单轻松, 喝杯咖啡就高枕无忧的 ...
- 转载:LBP代码详细注释
%LBP returns the local binary pattern image or LBP histogram of an image.% J = LBP(I,R,N,MAPPING,MOD ...
- tyvj1015 - 公路乘车 ——完全背包
题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1015 完全背包 #include <cstdio> #include <algorit ...
- 网站优化之-SEO在网页制作中的应用(信息来自慕课网课程笔记)
一.SEO基本介绍. 1.搜索引擎工作原理. 2.seo简介:SEarch Engine Optimization,搜索引擎优化.为了提升网页在搜索引擎自然搜索结果中的收录数量及排序位置而做的优化行为 ...
- HTTP详解(1)-工作原理
出处 http://blog.csdn.net/hguisu/article/details/8680808#t0 1. HTTP简介 HTTP协议(HyperText Transfer Protoc ...
- nfs文件系统启动参数配置
1. tiny6410(增强版)bootargs(nfs文件挂载)启动参数(周学伟) noinitrd console=ttySAC0,115200 lcd=S70 init=/init root=/ ...
- Crawler4j学习笔记
Crawler4j概述 crawler4j是一款基于Java的轻量级单机开源爬虫框架,最大的一个特点就是简单.另外也支持多线程.支持代理.可以过滤重复URL 基本上从加载jar到工程里面 通过修改示例 ...
- 【POJ3904】【P1202】水晶密码
说是莫比乌斯反演,其实只是玩儿玩儿内个miu函数而已…… 原题: wty 打算攻击 applepi 的用来存放机密数据的水晶系统. applepi 早有察觉,于是布置了一个密码系统来防备 wty ...
- 套接字I/O模型-WSAAsyncSelect
利用这个异步I/O模型,应用程序可在一个套接字上接收以Windows消息为基础的网络事件通知.WSAAsyncSelect和WSAEventSelect提供读写数据能力的异步通知,但它们不提供异步数据 ...
- sql字符串插入函数STUFF
STUFF (Transact-SQL) SQL Server 2012 其他版本 此主题尚未评级 - 评价此主题 <?XML:NAMESPACE PREFIX = "[default ...