
用C语言编写 求100~200的素数有哪些 要具体程序 谢谢!!
可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。
- c语言
- 素数
- 搜索资料
代码如下
#include <stdio.h>
int is_prime(int a)
{
int i;
for(i = 2; i < a; i ++)
if(a%i==0) return 0;
return 1;
}
int main()
{
int a;
for(a=100; a<=200; a ++)
if(is_prime(a))printf("%d\n", a);
}
运行结果
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
感觉少了一个else 在return 1前面
return 1是在循环结束后才执行的 加上else就不对啦
明白啦
求采纳 嘿嘿
难道你是这个专业的吗
差不多吧 算是专业滴 呵呵
我能问一下那个return到底返回的是什么吗 是实参吗?
return和参数不一样 被称为返回值
功能是从函数返回给主调函数一个值
和参数有些不同
一方面 它是单向的 只能有被调函数返回给主调 而参数可以是双向的
另一方面 它只有一个 参数可能有多个
从形式上 它写在函数的最前面
比如
double func(float, int , int)
就是有三个参数 类型分别为float int int, 而返回值为double的一个函数
我也是这个专业的 为什么我就学不会呢 唉~~
多看书 多上机练练就好了 其实不难的
那m和n的最大公约数怎么做
方法很多的
比如这个是最暴力的
#include <stdio.h>
int main()
{
int a, b, i;
scanf("%d%d",&a,&b);
i = a;
if(i >= b) i = b;
for(;i>=1; i --)
if(a%i==0 && b %i ==0) break;
printf("%d\n", i);
}
不过这个代码最容易看懂 从最大的往下试 当出现一个可以同时被a b整除的 就是最大公约数了
目前最常用的是辗转相除法
哇~~高手在人间呐
一般一般啦 嘿嘿
敢问大神哪个学校
俺不做学生好多年啦
好吧 那就是工作啦 我还是学生党
什么学校啊?学计算机的?
西安财经学院 软件工程
大一?
大二
汗 C可是基础哦 到大二还在纠结这个可就有点危险啦 呵呵
可能我真的对这些不感冒 每道题我都没有思路 还是做题太少了 代码也没写多少
学计算机语言 不管是什么 都得多写代码才行 写的多了 自然就会了
不过如果对这方面实在不感兴趣的话 可以考虑放弃这部分 试试学其他的语言 比如java什么的
对开发都不感兴趣的话 就转测试吧
你是哪个公司的
小公司 你肯定都没听过 精宇电子
你会用visual画图吗
没画过 呵呵
就是流程图?你没画过么?
流程图很少画 以前画过 不过用的是ppt
还以为你说的visual是画界面做可视化开发呢
这样~那我再问个啊 就是x的n次方怎么用c语言表示?
如果是取整型的绝对准确值就必须自己写函数了
如果只是要double型的浮点值,那么可以用pow函数
result = pow(x, n);
可以不调用函数吗?比如10的平方就是e2 x的n次方没有类似的吗?调用好麻烦
没有的... C语言没有预制求幂的运算符
大神 你对visual studio很熟吧?我要问问题
不熟 基本没用过 windows上我一般用mingw 大多数时候都用gcc的
%6.2f是什么意思?
f是输出浮点数 也就是float类型
.2是保留2位小数
6是输出占6位宽度 不足6位用0补 超过6位显示正常长度
比如1.234输出就会是
1.23(前面补2个空格)
23.1输出是
23.10(前面一个空格)
12345.2455
12345.24(这个超过6位了 按照实际显示 但是小数还是2位)
我我我…又有不会的程序题了 你能帮我看一下吗 大神
什么问题?着急吗?不急的话我明天看看
不着急 你先忙 明天再给我说也可以的
好 那明天再答你 :)
好的 谢啦
大神 说好的帮我解决呢
额 你滴问题呢?你没法我就忘了 :-(
输入一行字符,统计英文字母,空格,数字,其他字符。我不要输入函数哦,必须得调用函数写,懂我意思吧
#include <stdio.h>
void func(char *s)
{
int a,b,c,d;
a=b=c=d=0;
while(*s)
{
if((*s<='z' && *s >='a') || (*s<='Z' && *s >='A') ) a ++;
else if(*s==' ') b ++;
else if(*s<='9' && *s >='0')c++;
else d++;
s ++;
}
printf("%d %d %d %d\n", a,b,c,d);
}
int main()
{
char str[300];
gets(str);
func(str);
return 0;
}
这样可以吗?
我先看看,还没看懂~额…
在主函数中 通过gets获取到输入的字符串
然后调用函数func
在func中执行判断和输出
四个整型输出依次对应字母 空格 数字 其他字符 的个数
我不明白gets是个什么东东
获取一整行的输入 直到遇到换行符终止
功能和scanf类似 不过scanf遇到空格就会停止,由于这个题目要求统计空格 所以只能用gets了
那它和getchar有区别吗
getchar是一次获取一个字符 gets是一次获取一行
gets(str)
等同于
int i=0;
while((str[i] = getchar())!='\n')i++;
str[i] = 0;
我凌乱了,让我理一理
呵呵 运行一下 用一下就清楚了
唉~不想再写程序的感觉
呵呵 可怜的孩子 至少还得忍受两年呢
敢问大神工作几年?三四年?
好久 好久 哈哈 老啦
看来是已经成家立业 了
介个嘛 保密 嘿嘿
很显然 不然就是你太洒脱 放荡不羁爱自由
难道不能是没人要吗
不应该吧~看来你是事业爱情都不顺利呀 大神
哈哈 程序猿的悲哀嘛
说得我以后都不敢当程序员了 我觉得性格问题吧 况且宁缺勿滥 对吧
程序员 工作累 加班多 社交圈子小 这个几乎是普遍现象了
怪不得我报的那个班的老师不去上班 反而来当老师
恩恩 当老师比当代码工人好多啦 自由 而且假期多
难道腾讯 阿里也会这样吗
差不多吧 越底层的越苦逼 爬上去了就好些了
不对啊 大神 我一运行它根本就停不下来了
就一直在计算
你是怎么输入的?
我就输入了Hello world!
输入之后回车了吗?
我这边运行正常啊
Hello world!
10 1 0 3
…我把程序拷贝给你 我能弱弱得问一句 我怎么在电脑回复你吗 我竟然找不到在哪里回复你 不然我怎么给你拷贝代码啊
这样吧 你先试试全用英文的输入 刚才你那个!看起来是中文的
电脑上你可能不能追问 貌似采纳后追问是客户端的特权 呵呵
大神 我私信给你了
#include<stdio.h>
void fun(char *s)
{
int letters=0;
int space=0;
int digit=0;
int other=0;
while(*s)
{
if((*s>='a'&&*s<='z')||(*s>='A'&&*s<='Z'))
{
letters++;
}
else if(*s==' ')
{
space++;
}
else if(*s>='0'&&*s<='9')
{
digit++;
}
else //这里有个else
other++;
s++;//这里一定得有s++ 不然就死循环了
}
printf("%d %d %d %d\n",letters,space,digit,other);//这个在循环外面
}
int main()
{
char str[200];
gets(str);
fun(str);
return 0;
}
看下注释
大神还是不行啊 我输了以后这次是没反应
再把你修改后的程序私信给我
对着呢吧?
我给你发的程序 你再看下 在25行 我加了一个s++
这个你又丢了...
糊涂虫
但是把它写在哪里应该
#include<stdio.h>
void fun(char *s)
{
int letters=0;
int space=0;
int digit=0;
int other=0;
while(*s)
{
if((*s>='a'&&*s<='z')||(*s>='A'&&*s<='Z'))
{
letters++;
}
else if(*s==' ')
{
space++;
}
else if(*s>='0'&&*s<='9')
{
digit++;
}
else
{
other++;
}
s++;//写在这里就ok啦
}
printf("%d %d %d %d\n",letters,space,digit,other);
}
int main()
{
char str[200];
gets(str);
fun(str);
return 0;
}
天哪 终于好了 头都疼 我现在还是一知半解
哈哈 要么习惯 要么放弃
有志者事竟成呀~~
恩恩 好样的 加油哦!
大神 你为何不跳槽
为什么要跳呢 在这里感觉还可以的
好吧 安于现状也挺好的
大神 你是哈尔滨什么什么来着大学毕业的?也是软件专业吗?
你为什么觉得我需要跳一下呢?
因为觉得一直处于一种状态或者环境不好吧
现在感觉还行吧 也算将近混出头了
你怎么知道我在哈尔滨上的学的?
哈工大的 计算机科学与技术专业 一个万金油专业
因为刚才用电脑登录的时候有显示你个人信息的啊~我能告诉你我是我们学校垫底的吗 冲着会计去 结果结果……
没关系啦 高中已经结束 大学的起点不代表什么的 终点才最重要
啦啦啦~其实我对于学习这方面倒是挺洒脱的 既来之 则安之
大学时间多想想以后想做什么 别学了一大堆 都是自己不喜欢的 然后一想到这些东西要陪你一辈子 就该头大了
你们公司女孩子多吗?但是没有办法啊 已经是这个专业了 就踏实学习呗~
很少 做IT的女孩子不是很常见的 尤其是搞技术
公司女孩子都集中在 人事 文员 管理 测试上
如果我一直想在这个专业发展 难道会很辛苦吗?女生还是不必太辛苦得好…
怎么说呢 也看运气吧
如果碰到好一些的公司 尤其是是一些欧洲的公司 软件上的工作还算行
我认识的意大利 英国 法国的几个公司里面就轻松很多 加班也不多
美资台资和国内的私企 真的不适合女孩子
经常要加班 熬夜 女孩子体质基本都受不了的
我们老师也是那么说的 但愿我是幸运的 我能不能偷偷问一句大神工资多少呢
一个月说是2万多 但实际拿到手的 也就接近2万吧
还要交税…我觉得你应该跟我们老师差不多大 但是貌似你又像是30左右或者更大?
是啊 得交税 交公积金 交保险 。。。
这已经是逃了不少的了 要不然得交上去一半
年龄保密 哈哈
对啊 没有不逃税的公司 哎呦~不要勾起我的好奇心啦…
现在叫合理避税 呵呵 其实政府那边也都知道的 大家睁一只眼闭一只眼罢了
不许好奇 没听说吗 好奇心会害死猫的
呵呵呵…说得我都相信了 我我我…就是好奇分析分析 工作多年却没结婚 我是该往20多岁猜还是30多岁猜…难道IT男就真有大家说得那么木讷么
这个 我没结婚貌似也是你猜的吧 哈哈
哎呀 肯定是成家立业了啊 还保密保密 不然就不正常了。
不告诉你 哈哈 下班回家啦 周末不上网 周一见
A secret make a man man
Good man 没有不偷腥的猫。有语法错误的感觉~
just so so
拜拜 an arcane man
bye
大神 那个程序还要改 但是我不会 不要输出函数也不要gets函数 怎么办?星期一看到我记得给我回复哦~
不要gets简单 不要输出是什么意思?在主函数中输出吗?
对的对的 字符直接用实参传给型参就好了
我还给你发私信了 有几道题我也不会 你帮我看看哦~
#include<stdio.h>
void fun(char *s, int *cnt)
{
while(*s)
{
if((*s>='a'&&*s<='z')||(*s>='A'&&*s<='Z'))
{
cnt[0]++;
}
else if(*s==' ')
{
cnt[1]++;
}
else if(*s>='0'&&*s<='9')
{
cnt[2]++;
}
else
{
cnt[3]++;
}
s++;
}
}
int main()
{
char str[200];
int cnt[4] = {0};
int i = 0;
while((str[i] = getchar()) != '\n') i ++;
str[i] = 0;
fun(str, cnt);
printf("%d %d %d %d\n",cnt[0],cnt[1],cnt[2],cnt[3]);//letter space digit others
return 0;
}
看看这个可以不 在你的基础上改的
PS:私信没收到哦 ...
why 给我一个理由
不知道... 是不是发错人啦? 俺私信中是空滴 再发次试试?
不可能啊 我确实发了 而且显示已送达 你确定是空的?
确定一定以及肯定
唉~~好吧 我中午再发给你吧 教室连个图片都发不了
恩恩 发完到这里说下 我到时查查
我中午直接在这里发哦~
好
9 10 11题 拜托给你啦 大神
汗 这么多 都哪个题的啊?
9 10 11啊
那三个代码是我写的 但都不对 我不知道错在哪儿
代码是按 9 10 11的顺序给你发的
那你怎么知道的不对啊?
我调试过了啊 都不对。额~~
你把代码私信给我吧
额~等等。我电脑没开
我我我…太麻烦你了嘛
没有啦 哈哈 瓜瓜
都私信给你啦 你看看有没有收到哦~
9主要是输出的问题 多输出了很多的换行
#include<stdio.h>
int Factors(int num)
{
int s=0, i;
for(i=1;i<num;i++)
{
if(num%i==0)
{
s+=i;
}
}
if(s==num)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int m, i;
for(m=2;m<1000;m++)
{
if(Factors(m))
{
printf("%d its factors are ",m);
for(i=1;i<m;i++)
{
if(m%i==0)
{
printf("%d,",i);//输出改成了逗号分隔,和你书上的一样:)
}
}
printf("\n");//这个移动到i循环外面
}
}
return 0;
}
10 是类型的问题
#include<stdio.h>
double Sum(double a,double b,int n)
{
double s=0;//类型用double
int t;
for(int i=1;i<=n;i++)
{
s=s+a/b;
t=a;
a=a+b;
b=t;
}
return s;
}
int main()
{
printf("sum=%10.4lf",Sum(2,1,20));//用lf输出double
return 0;
}
11是算法的问题了
#include<stdio.h>
double Fun(double h)
{
double s=h;
for(int i=1;i<10;i++)
{
s=s+h;
h/=2;
}
printf("%lf\n",h/2);
return s;
}
int main()
{
printf("共经过%lf米\n",Fun(100));
return 0;
}
好详细 谢啦 大神 你是我的福星~吼吼吼~
木有你我要如何
:-D my pleasure
对你来说so easy
嘿嘿 还好还好 毕竟要靠这个混口饭吃
待我仔细研究研究 再来向你提问哈~我觉得你怎么能这么悠闲呢
现在差不多混出头了嘛 事情就没那么多了
原来如此。有技术什么的都不是事儿
技术加资历吧
我还是继续写代码吧,跟你一比。你的冰山一角我都还没赶上~呜呜呜…表安慰我
我写过的代码 比你见过的代码都多 哼!!
肯定了。我这问题我觉得对你来说就是1加1等于几
也不算啦 还是需要想一下的
像你说的这几个 也都是得跑一下才容易知道什么错误 直接看代码很累的
不过 你程序写的还是挺清晰的 思路上也不错
有时候改一个错的程序 比写一个新的都累的 不过你的不会 :)
听我们课外班老师说过,如果没有注释,看别人的代码都很难懂。
也不是啦
看算法怎么样
比较简单的算法都不需要加注释的
只有某个算法 或者变量是特殊用处的时候 才会加注释
另外 最常见的注释是 写一套函数接口,这套接口是给别人用的,然后在接口声明处写明要怎么用,什么样的参数,什么样的返回值
比较规范的要求是写的每个函数在开始出加一个注释,写明函数的功能,参数类型,参数含义可能的返回值,返回值的含义
不过真正写代码的时候,除非有强制要求 不然很少有这样做的 很累
明白 我大概可以理解
我的天~编译器怎么停止生成啊 我找不到
你用的什么编译器? 要停止生成什么?
visual studio 2012
你要停止什么? 停止编译? 还是停止运行你正在运行的程序?
我也不明白啊 写了一个程序 它就这样了 以前就出现过这种情况 就是调试后就一直在运行 根本停不下来的感觉 然后点击关闭 就提示必须先停止生成方可解决方案 是让我停止什么?我找不到啊
它只说停止生成 应该是停止程序吧 你说呢
在命令行直接ctrl C断不掉吗? 不行的话 就到任务管理器里面结束掉它
没用过 这么高端的编译器 :D
那你用的什么编译器?我每次直接开机重启 因为我找不到
平时都用linux的 偶尔在windows上都用Mingw 很古老的东西了
我都没用过 我们老师说只要是编译器还是微软出的最好用
用习惯了 不管哪个都好用 毕竟 我们一般接触不到它们之间差异的部分
如果是做windows api开发 那么肯定是微软自己家的好用
不过用惯了微软的 再用其它的就容易别扭了 毕竟微软做的有不少地方都不符合规范的
1不是完数吗
完数的因子是要去除本身的 1把本身去了就没因子了 所以不是完数
第十题 double必须对应lf 它和f有区别?
还有个float 我就完全晕了
11题我的算法有问题吗?自我感觉是对的呀 哪里错了呢?
f是对应float的 lf才是对应double的
用在输出的时候 有时不会有区别
用%f输出double的时候 等同于
printf("%f",(float)a);
也就是先会把变量转为float
这样当精度比较大或者表示数字超过float限制时就会出错
大神 我感觉11题我没有错呀 我把类型问题改过了 调试后感觉是对的
我的答案是0.097656
299.707031和你的一样吗?
输出是10.6lf 你懂得
#include<stdio.h>
double Fun(double h)
{
double s=0;
for(int i=1;i<=10;i++)
{
h=h/2;
s=s+h+2*h;
}
printf("%10.6lf\n",h);
return s;
}
int main()
{
printf("共经过%lf米\n",Fun(100));
return 0;
}
主体是
for(int i=1;i<=10;i++)
{
h=h/2;
s=s+h+2*h;
}
也就是每次循环累加的是上一次掉落的距离 和这一次反弹到最高点的距离
所以 最终累计的是 第10次落地后反弹到最高点时走过的总距离
而不是第10次落地时的总距离
多了最后一次的h
所以用你这个来改 最简单的方法是
#include<stdio.h>
double Fun(double h)
{
double s=0;
for(int i=1;i<=10;i++)
{
h=h/2;
s=s+h+2*h;
}
printf("%10.6lf\n",h);
return s-h;
}
int main()
{
printf("共经过%lf米\n",Fun(100));
return 0;
}
这样得到的值是
0.097656
共经过299.609375米
为什么后面那个不一样呢
我还是没懂我的哪里错了?
你说后面不一样是说你原本程序 和我刚发给你的程序吗?
返回值差了一个h
#include<stdio.h>
double Fun(double h)
{
double s=0;
for(int i=1;i<=10;i++)
{
h=h/2;
s=s+h+2*h;
}
printf("%10.6lf\n",h);
return s-h;//这里减掉了最后一个h
}
int main()
{
printf("共经过%lf米\n",Fun(100));
return 0;
}
//对于第n次
h=h/2;//这个是第n次落地后可以弹起的高度
s=s
+h //这个是第n次落地后弹起的高度
+2*h;//这个是第n次落地前下落的高度
所以 如果是10次的话 你这个就是
第1次落地前下落高度+第1次落地后弹起高度
+ 第2次落地前下落高度+第2次落地后弹起高度
+...+
第10次落地前下落高度+第10次落地后弹起高度
而题目中要求的是第10次"落地时"经过的总距离
也就是
第1次落地前下落高度+第1次落地后弹起高度
+ 第2次落地前下落高度+第2次落地后弹起高度
+...+
第10次落地前下落高度(这里就是落地点了)
所以多了最后一次的h
彻底晕了 让我想想 你的意思是我少算了?
不是 是我多算了?
是的 多算了一次弹起的高度 你画个图 或许能更简单一点
我明白了 我的不是s等于s加h再加2h吗
直接去掉s不就好了?
我每次都多加了一次s
是不是错在这里了?大神
s是累加的啊 去掉s之前做的就白费了
额 我好然 依旧不明白错在哪里
大神 你有微信吧?敢不敢加下你的微信 每次都得来这个软件问你问题 不方便的话就算了哦~不能影响大神的日常生活
没QQ 额~好巧 注定不让加的节奏
瀑布汗
哈哈哈…不应该你们都用微信吗 我们才用QQ
为什么啊?
不知道啊 QQ我们这代人用的比较多啊 感觉比我们大个四岁以上的人都用微信 虽然我不知道你多大 肯定超过四岁了吧?
我一直用qq 从来没想过用微信 用了很多年啦
好吧 反正我都不用了
刚才那个题想通没?
没有
这个你可以看下 在附件里 不知道手机端能不能看
没看到啊?什么?
上一个回答有一个附件 可能手机端看不到 你用PC打开看看
哦~明天吧 我一会还有课 我总觉得是对的
大神 敢问你下班了吗
没呢 正准备下班呢
这样啊~那你赶紧下班回家啦,明天再请教你好啦~
好哒 呵呵
感觉大神萌萌哒~拜拜 明天找你哦。
大神 我终于明白我那道题为什么错了 因为我没有看清楚题!!!怪不得我想不明白 我太不走心了。
大神 之前给你发的那张都是题目的图片还在吧?13题 我不会 倒是找到了一个比较简单的代码 我私信给你了 你去看看哦 我看不懂 而且我也看不懂迭代法到底是个什么东东 看到回我哦~
之后又发给你了一个程序 是最后这道17题 后面这张图是运行结果 提示的错误我看不懂 你能给我解释下吗
13题关键就是迭代法的定义
迭代法就是要求的值是一个数列a0 a1 a2 ... an
这个数列是无限的 n越大 值越接近最终的结果 但是永远不会有正确的值
这个数列满足a(n+1) = f(an) 这个f(an)就是迭代公式了
所以这个题就需要根据迭代公式 对于每项不停的循环求下一项,然后最后两项结果差小于要求的1e-5就可以了
至于17题 老实交代 抄的谁哒? 只给了你一个执行的函数 没有主函数
加个主函数调用一下就可以了
#include<stdio.h>
void Match()
{
char a;
char b;
char c;
for(a='x';a<='z';a++)
{
for(b='x';b<='z';b++)
{
for(c='x';c<='z';c++)
{
if(a!='x'&&c!='x'&&c!='z'&&a!=b&&a!=c&&b!=c)
{
printf("A->%c,B->%c,C->%c\n",a,b,c);
}
}
}
}
}
int main()
{
Match();
return 0;
}
额~我抄老师哒。这都被你看出来了 我也很好奇 怎么能没有主函数呢 我还以为我想错了呢
只是一个功能函数 主函数需要自己写滴
记住 没有主函数 C程序肯定不能运行
不过 主函数一般是main 也可能有别的 而且 可能不止一个主函数的
13题那个代码 我不懂为什么直接就让X0等于二分之a了?反正我就是不知道迭代法是怎么回事 所以我不会写 也看不懂人家的程序
13题那个代码 我不懂为什么直接就让X0等于二分之a了?反正我就是不知道迭代法是怎么回事 所以我不会写 也看不懂人家的程序
迭代公式是x[n+1]=(x[n]+a/x[n])/2
#include <stdio.h>
#include <math.h>
int main()
{
float a,x0,x1;
printf("enter a positive number:");
scanf("%f",&a);
x0=a/2;
x1=(x0+a/x0)/2;//初始化x0 x1 即前两项
do
{
x0=x1;
x1=(x0+a/x0)/2;//按照迭代公式求下一项
}while(fabs(x0-x1)>=1e-5);//规定的退出条件
printf("The square root of %5.2f is %8.5f\n",a,x1);
return 0;
}
关于迭代法 你可以搜一下 在百科里就有 刚发了一个网址 结果回答被百度给吃了 ...
好吧 我再去百度一下 我昨天百度了 我没看懂解释啊 X0到底该怎么初始化?
一般情况下迭代法都会有一个初始值的
不过这个题目中没有给
x0随便给一个非0的正值就可以 用什么都不影响结果的
似懂非懂的感觉
这个属于数学范围啦
大神 好久不见 我又来麻烦你啦~明天要问你问题
#include<stdio.h>
void SelectSort(int *arr,int len)
{
int minIndex;
int tmp;
for(int i=0;i<len-1;i++)
{
minIndex=i;
for(int j=i+1;j<len;j++)
{
if(arr[minIndex]>arr[j])
{
minIndex=j;
}
}
if(minIndex!=i)//这个移动到循环外面。 对于每次i循环 ,找到剩余部分最小的一个 并和i交换。这个是选择法的定义
//所以 每次只交换一次,而不是每找到一个小的就交换一次
{
tmp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=tmp;
}
}
}
int main()
{
int arr[10]={5,2,9,0,1,3,4,7,8,6};
SelectSort(arr,sizeof(arr)/sizeof(arr[0]));
for(int i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
看下注释
如果想让数组的长度任意怎么办啊 不限制为10 在主函数里应该怎么定义数组?那个方括号里面不是不能为变量吗?
如果想让数组的长度任意怎么办啊 不限制为10 在主函数里应该怎么定义数组?那个方括号里面不是不能为变量吗?
如果是C++的话 是允许的
C的话 必须支持C99规范才可以
比如 先输入一个n 然后用n来开空间
scanf("%d",&n);
int a[n];
你试试这样能编译过不
如果可以 那么你的编译器就是支持的
好的 ming bai la
对于传统的C语言 也就是不支持这种定义方式的 比如TC
可以采用动态分配的方式
int n, *a = NULL;
scanf("%d", &n);
if(n>0)a = (int *)malloc(sizeof(int) * n);
//balabala
free(a);
那调用函数里面的形参len岂不是没有意义了吗?
我能说我都不会吗
1,2,6我们老师讲了
那调用函数里面的形参len岂不是没有意义了吗?
形参里面的len就是这种情况下的n了
话说 你上的这个图 现在哪个不会?1-7?
我的意思时在主函数里面定义数组的时候已经写了它的长度为10 为什么又要多此一举传个10给len?还是我想错了?
除了老师讲过的1,2,6 感觉我都不会
大神 我还以为你不理我了呢 吓死人家啦
这样写函数是为了更灵活 比如这次要求的测试用例是10个,下次没准就要15个了,再来一次没准要20个。
也有可能哪次就改成动态的了,写成这样就是可以少改一些
然后说这几个题吧
3是比较简单的,矩阵就是一个二维数组,依次输入数值,然后一个循环把所有值加起来就ok了
#include<stdio.h>
int main()
{
int a[3][3];
int i,j;
int s = 0;
for(i = 0; i < 3; i ++)
for(j = 0; j < 3; j ++)
scanf("%d", &a[i][j]);
for(i = 0; i < 3; i ++)
for(j = 0; j < 3; j ++)
s += a[i][j];
printf("%d\n", s);
return 0;
}
4 的话 定义一个这样的数组,然后再输入一个数,从数组开始比较,找对位置插进去就ok
#include<stdio.h>
int main()
{
int a[10] = {1, 3, 5, 7,9,11,13,15,17};
int v;
int i, j;
scanf("%d", &v);
for(i = 0; i < 9; i ++)
if(a[i] > v) break;
for(j = 9; j > i; j --) //所有向后移动一位,给v腾地方
a[j] = a[j-1];
a[i] = v;
for(i = 0; i < 10; i ++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
其实有更简单的方法,一个循环就可以,不过那个没这个好理解
5 最简单的方式 新开一个数组,然后反过来存就可以了
#include<stdio.h>
int main()
{
int a[10] = {1, 3, 5, 7,9,11,13,15,17, 19};
int b[10];
int i;
for(i = 0; i < 10; i ++)
b[i] = a[9-i];
for(i = 0; i < 10; i ++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
7的题目不全,就不说了
PS:每一道题都可以做的更复杂,比如更改测试的方式,输入输出更灵活,算法更优化 等等
不过我给你的都是最容易理解的代码,你也可以自己继续发挥 :D
哎呀 大神 你怎么把所有的功能都放在主函数里实现了 我们老师不让我们这样写 必须调用函数呢 怪我咯~忘了告诉你了 我自己先写写 不会的明天问你啦~
大神 你把我为难死了 为什么你有的不写大括号 我完全不知道哪句在循环里哪句不在 呜呜呜~
大神 我给你发了个私信 明天记得看哈
唉~写得我头晕 晚安
#include<stdio.h>
void SelectSort(int *arr,int len)
{
int minIndex;
int tmp;
for(int i=0;i<len;i++)
{
minIndex=i;
for(int j=i+1;j<len;j++)
{
if(arr[minIndex]>arr[j])//少了这一句
minIndex=j;
}
if(minIndex!=i)
{
tmp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=tmp;
}
}
}
int main()
{
int arr[10]={5,2,9,0,1,3,4,7,8,6};
SelectSort(arr,sizeof(arr)/sizeof(arr[0]));
for(int i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
改成函数的话 很容易的
只要把实现功能的部分单独提出来就可以了
比如第五个题
#include<stdio.h>
void func(int *a, int *b, int len)
{
int i;
for(i = 0; i < len; i ++)
b[i] = a[len-i-1];
}
int main()
{
int a[10] = {1, 3, 5, 7,9,11,13,15,17, 19};
int b[10];
int i;
func(a,b,10);
for(i = 0; i < 10; i ++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
其它的类似
至于有些不写大括号的 算是中习惯吧
因为如果作用域只有一句的话 写不写都是一样的
都打出来很累滴 :D
记住不写大括号的 就等同于有大括号且只包含接下来的一句 就可以了
好的吧 我知道啦 谢啦
大神 第2题我没有少你说的那句呀
大神 好郁闷 我又看了一遍 没有错呀 到底怎么回事呢
大神 好郁闷 我又看了一遍 没有错呀 到底怎么回事呢
#include<stdio.h>
void SelectSort(int *arr,int len)
{
int minIndex;
int tmp;
for(int i=0;i<len;i++)
{
minIndex=i;
for(int j=i+1;j<len;j++)
{
//注意这里 少了一句判断
minIndex=j;
}
if(minIndex!=i)
{
tmp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=tmp;
}
}
}
int main()
{
int arr[10]={5,2,9,0,1,3,4,7,8,6};
SelectSort(arr,sizeof(arr)/sizeof(arr[0]));
for(int i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
这个是你私信给我的代码
哦,天呢 是真的吗 那就真的是我忘写了
大神 你在不在呀?
大神 你为何不理我呢 你不在没人给我解答呢
五一放假 不上网 嘿嘿
strcmp要求的参数是char * 也就是字符串 你用成字符了
另外tmp的使用也有问题
修改后差不多这样
#include<stdio.h>
#include<string.h>
void OrderStr(char *p1,char *p2,char *p3)
{
char tmp[20];
if(strcmp(p1,p2)>0)
{
strcpy(tmp,p1);
strcpy(p1,p2);
strcpy(p2,tmp);
}
if(strcmp(p1,p3)>0)
{
strcpy(tmp,p1);
strcpy(p1,p3);
strcpy(p3,tmp);
}
if(strcmp(p2,p3)>0)
{
strcpy(tmp,p2);
strcpy(p2,p3);
strcpy(p3,tmp);
}
}
int main()
{
char str1[20]="hello";
char str2[20]="I am happy";
char str3[20]="I am a student";
OrderStr(str1,str2,str3);
printf("%s %s %s\n",str1,str2,str3);
return 0;
}
你终于来了 它们都欺负我~呜呜呜~
他们
他们
他们是谁?我帮你收拾他们 哈哈
我在百度知道这里问别人 他们都给我讲不清楚 还要我采纳 还是你好~终于等到你
我在百度知道这里问别人 他们都给我讲不清楚 还要我采纳 还是你好~终于等到你
目的不一样啊 大多数人来这里答题 都是为了采纳来的,或者说为了知道的财富来的,我来这里是为了玩的 哈哈
唉~人心呐 不会助人为乐嘛
大神 刷新间隔你会吗
什么刷新间隔?
反正是计算机组成原理中的一道题 让算刷新间隔 你应该会吧?我先把题发给你
一个8K乘8位的动态RAM芯片,其内部结构排列成256乘256形式,读/写周期为0.1us。试问采用集中刷新,分散刷新及异步刷新三种方式的刷新间隔各为多少?
大神 你会吗?
没听说过 ...
估计当初学过 不过早还给老师啦
好吧 我去百度呗
用指针方法处理
输入10个整数,将其中最小的数与第一个数交换,将最大的数与最后一个数交换
大神 这个怎么写?
用指针方法处理
输入10个整数,将其中最小的数与第一个数交换,将最大的数与最后一个数交换
大神 这个怎么写?
#include <stdio.h>
void func(int *a, int l)
{
int *min, *max, *p;
int i;
for(min = max = p = a; p - a < l; p ++)
{
if(*p > *max)
{
max = p;
}
if(*p < *min)
{
min = p;
}
}
i = *min;
*min = a[0];
a[0] = i;
i = *max;
*max = a[l - 1];
a[l - 1] = i;
}
int main()
{
int a[10] = { 2,5,7,9,1,23,6,8,9,3};
int i;
func(a, 10);
for(i = 0; i < 10; i ++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
谢啦 我刚才已经写出来了呢
对嘛 这才乖 自己加油先写 写不出来在找我 哈哈 (摸摸头 )
因为人家找你 你好久都不回 我只能自己写。
下次还得这样 哈哈 要不然你就犯懒
你是故意的嘛
不是啦 最近使用的一个提醒插件失效了 所以就需要自己查是不是有新消息过来 有时就慢了
原来如此 我就知道你是好人~
汗 又收到一张好人卡
这样还不好嘛 确实是个老好人呐
你滴 大大滴坏
又说我老 又给我发好人卡
我滴心啊 是拔凉拔凉滴啊
我错了 ~ 不能生气哈 我们C语言要考试 我觉得我会不及格 老师说20分以下就是不及格 唉~~题是有多难的节奏。大神 把你脑子借我用用
什么时候考试啊?总分多少?20分应该不难吧 看你平时写的还是有些靠谱的 嘿嘿
总分100呀 周三上课时吧 有些靠谱 好打击我 你应该说写得还是不错的 好人就是爱说实话呢~
总分100呀 周三上课时吧 有些靠谱 好打击我 你应该说写得还是不错的 好人就是爱说实话呢~
你给我发卡 我就打击你 啦啦啦~~~~
总分100 得20分还不简单 随便写写都有啦 别担心
因为老师说有人曾经只得三分,我就害怕了。老觉得那个三分就是偶自己~ 我写的那个代码风格你们在公司也是这样写嘛
差不多吧
不过 在公司混的久了 人就会越来越懒
比如 感觉没必要打的大括号就会不打,局部变量取名在没有强制要求下会尽量短,代码能用一行写完就不用两行 类似这样的习惯有很多
原来如此 人都是这样啦 别人作业都交到了第八章 我还在第六章 现在不努力 以后我就得努力找工作 不如我还是现在努力吧~ 但是真的好难学 难到我想哭。
你们是这学期开的这门课吗? 离期末还挺远呢 不急 呵呵
其实C语言挺简单的,只要多编几个程序就可以啦
不是呀 我已经大二了呢 这个班是我自己报的 相当于课外辅导班啦 因为我们是财经类大学 所以不报班感觉学不到什么
自己想学的话 其实现在纯C的应用已经比较小了 反而是C++市场更大一些
不过C是基础 学好C再学C++也简单一些
看现在主流的C++的书 上来也都是先介绍C的
所以我们先学习的c 下周好像就开课C加加了 然后是linux 这个是干嘛的?对了 大神 我中午回去给你私信一个代码 我有问题要问你 你记得查看哦~我会提醒你的哈。
linux是现在比较流行的一个开源操作系统
本身内核就是C写的
linux上搭载的gcc/g++是目前最流行的c/C++编译器之一
现在大多数的服务器和大多数的嵌入式操作系统都是linux
包括安卓的核心也是linux
原来如此 怪不得我们要学 这个完了貌似是数据结构 然后是数据库 大三还要我们做项目~让我们练练手。我连C都还没学会 惭愧~
大神 我想要问strcmp()函数括号里的两个参数有什么要求?必须是字符串数组吗?还是其他的?
字符串
char *型的就可以
字符数组 或者字符指针
指向空间必须以'\0'为结束 不然会出错
大神 就是这个程序
什么程序 私信没收到啊? 是你以前发的那个OrderStr的吗?
我之前给你发过?我刚才又私信给你了 你看看有没有收到
没有收到新的私信 你是不是发错啦?
如果是刚才说的那个OrderStr的 那么之前我回过你的
#include<stdio.h>
#include<string.h>
void OrderStr(char *p1,char *p2,char *p3)
{
char tmp[20];
if(strcmp(p1,p2)>0)
{
strcpy(tmp,p1);
strcpy(p1,p2);
strcpy(p2,tmp);
}
if(strcmp(p1,p3)>0)
{
strcpy(tmp,p1);
strcpy(p1,p3);
strcpy(p3,tmp);
}
if(strcmp(p2,p3)>0)
{
strcpy(tmp,p2);
strcpy(p2,p3);
strcpy(p3,tmp);
}
}
int main()
{
char str1[20]="hello";
char str2[20]="I am happy";
char str3[20]="I am a student";
OrderStr(str1,str2,str3);
printf("%s %s %s\n",str1,str2,str3);
return 0;
}
好吧 不是这个 我一会下课回去发给你 中午给忘了呢 我用手机发私信给你 你貌似用手机才能收得到 这个破软件还不能同步 所以你貌似收不到我用手机给你发的私信
瀑布汗
…………
我要给它差评
心理上支持你 加油!! 哈哈
你应该行动上也支持我 去百度上班 把它的程序重写 而且好多电脑有的东西 手机版的没有 也没有电脑版好用。
百度不要我 他们门槛太高咧
不会吧 你好歹也工作好几年了 进百度应该没问题吧
大神 你在吗 我准备给你私信发程序了啊
大神 我已经私信给你了 看了以后来找我
你发的这个不就是之前那个嘛 就是str1 2 3的定义顺序变了一下
#include<stdio.h>
#include<string.h>
void OrderStr( char *p1, char *p2, char *p3)
{
char tmp;
if(strcmp(*p1,*p2)>0)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
if(strcmp(*p1,*p3)>0)
{
tmp=*p1;
*p1=*p3;
*p3=tmp;
}
if(strcmp(*p2,*p3)>0)
{
tmp=*p2;
*p2=*p3;
*p3=tmp;
}
}
int main()
{
char str1[20]="I am a student";
char str2[20]="I am happy";
char str3[20]="hello";
OrderStr(str1,str2,str3);
printf("%s %s %s\n",str1,str2,str3);
return 0;
}
这个是你刚发给我的 没错吧?
就用我今天发给你的那个 也就是以前发你的那个
把OrderStr函数替换下就可以了
不是 我知道正确的程序 我是想问问题 不是让你给我说正确的怎么写
我的这个strcmp函数里面的两个参数不是*p1和*p2吗 我把*去掉程序就对了 所以我肯定是参数类型弄错了 我中午才问你这个函数的参数类型有什么要求
因为我想的是不解引用怎么比较字符串呢?所以我就用了*
是啊 就像之前说的 strcmp的 必须是char *类型的。 而且还不能是随便一个字符的地址都可以的,必须是以'\0'结尾的字符串
不仅是它 其他的str开头的库函数也是这样要求的
比如strcpy strlen strcat strstr...
嗯嗯 原来如此
我应该去看一下strcmp函数的定义的~
大神 我又碰到一个老好人 不过人家只比我大一岁噢~世上还是好人多 啦啦啦~没有你在 我就去问他啦。你不要羡慕嫉妒恨哈~嘿嘿~
唉 年轻的帅锅 果然更有竞争力 新人换旧人啦
没有啦 我能不能问你一个私人问题 你对你老婆从来不会厌烦嘛?对她就始终如一么
厌烦倒谈不上 不过在一起久了 就会转成平淡 不是恋人激情的感觉 而是一种亲人相依的感觉
始终如一 算是吧 偶尔肉体出轨 精神还是在家里的 嘿嘿
偶尔肉体出轨 男人都这样吗?不觉得愧疚么?如果再面对她的时候?
See you tomorrow~我还是要问你题的哈 你得随问随在哈。
大神 我给你私信了一个程序 忘了给你说了 明天上班记得查看啊 晚安~
代码功能看起来是
定义5*5的矩阵 然后把最大的移动到中间 最小的四个移动到四个角上
由于二维数组(矩阵)在内存上是连续的,所以可以降维到一维数组,即int *型来操作
整体思路 代码都没有问题
编译错误其实是提醒你有不同类的指针转换(int **转成int*)
有时这类指针转换是危险的,所以编译器会做提醒。但C又是允许这样做的,只需要你通知编译器我知道我在做什么,但是我还是要这样做,编译器就会放行了
所以调用的时候
show((int *)arr);//我知道我在做指针类型的转换 你闭嘴
这样编译器就不会说话了
那我应该怎么改啊?
我为什么还没看懂呢
为什么一维数组就可以了呢?其实我还是不懂 arr不就代表地址吗?为什么要换成int *?
简单点说 代码加一个强制类型转换就可以了
#include<stdio.h>
void show(int *p)
//这个函数不用改 字数限制 就不写了
int main()
{
int arr[5][5]={1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};
show((int *)arr);//就这里改一下就好
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
二维数组的变量名 arr可以按照int **来看,但是本质上还是有一些不同的
而函数的参数是int * 所以在调用函数会出错
加一个强制转换就好了
那么如果是一维数组 arr就相当于是 int *?二维的话arr就相当于是int **?
是这样的 如果是三维的 就相当于int *** 依次类推
使用的时候不完全相同 只是这样理解
噢~我明白了
大神 你在上海?
大神 大神 大神 大神~~~~~~
大神 你什么情况?
大神 你什么情况?
是啊 在上海 你怎么知道滴?
你现在回答变慢了哦~人家要生气了,哼哼~
摸摸头 不气不气
最近浏览器和插件不匹配 等360浏览器更新了就好啦
现在都是手动查的 当然没有机器自动查的快啦
总不能一天都用在百度上吧 让你加我qq你又没有...
那谁让你没有微信呢 感觉我好蛮不讲理~
快点专门为我搞个qq去 哈哈
我有 不想用 一年没用了 你怎么不懂怜香惜玉呢 快去申请个微信去~听话,乖~
我手机是和网络隔绝的 要不给你手机号 想我的时候给我发个信息 :-D
天呢 难道你不用网的吗?你说得这么露骨,嫂子知道吗
计算机用网 手机断网
不然总会有各式各样的麻烦
放心 你嫂子不会知道滴 嘎嘎
把嫂子手机号给我,我要告诉她~大神 你好机智,偷了腥,味儿都不会留。唉~我要拥抱嫂子
这不还没偷到呢嘛 等偷到了再夸我
得了吧,你不都偶尔肉体出轨了吗 还没有呢。对了 昨天问你那个你都还没回答我呢
哪一个? 不记得啦
大神 你一定是故意的~还不能问你私人问题了不是
找到啦 真的忘了
是昨天最后一句吧
怎么说呢 男人是不是都这样不确定,毕竟没有调查过,平时也不会和朋友讨论这些
至于愧疚,不会有啊,毕竟这个不会影响我们的生活,感觉就和平时都在家吃饭,偶尔出去吃一次差不多吧
虽然不会直接和老婆说今天去打野食了(没人那么傻吧) 不过她多少也是知道的,只不过不说而已
用一个不太恰当的例子吧,就像国外一个笑话说的,买了车之后就不打车了吗
好啦 满足你小好奇心了吧。 明天见 回家啦
怎么能不愧疚呢~还做得这么理直气壮,不明白~大神 明天见~还是且行且珍惜,你懂得。
心观天与地
意守正复奇
一花一世界
且行且珍惜
没有啊 我是另一种意思 且行且珍惜 不是还有另一种意思嘛
大神 我星期天考试。呜呜~~~
你又不理我 再见 友尽~~👋
大神 我只会做20%的题 你要给我讲题明天~你都不理我啦,怎么忍心看我不会做题呢~呜呜~不跟你好了
会20% 就能拿20分啦 再蒙点 恩 差不多到及格线了 哈哈
我能说我选择全错吗
我能说我选择全错吗
我一共就40分…
之前不是说20分就算及格嘛 嘎嘎 那够啦 至少没到三分的程度
哎,有你这么安慰人的嘛 我不管 反正你得给我讲 每道题~
好吧 先自己看 哪个搞不懂就发上来 一个个来哦
我这边不管你连续追几次 我都只能回一次 如果太多可能字数限制不足的
直接给你发图也可以的啦
那我也没办法一次回太多 百度有字数限制...
要不 我给你回代码也回图? 哈哈
你是故意的嘛 我考这么少已经很伤心了 你还要再别人的伤口上撒把盐~不带这么欺负我的
if(M)return ‘Y’;else return ‘N’;
return (M==0)?‘N’:‘Y’;
这个是B选项
问题是刚才给你发的第一个那个与哪项等价
我选的是A
return(M==1)?‘Y’:‘N’;
正确答案是B
为什么我觉得A,B选项都对 A错在哪儿了?
if(M)的含义 就是if(M!=0)
如果M是2 3 4 或者其它的数值 那么你选的那个就会出错了
我懂了
下一个 过堂
void foo(char a){
static char nCotunt;
char p1[]=“AAA”;
char *p2=“AAA”;
char *p3=(char *)malloc(10);
char *p4=&a;
char *p5=&nCount;
}
void (*p)(char)=foo;
A 数据段(全局变量区)B 代码段 C 栈 D 堆 E 不一定,视调用情况而定
汗 你这个问题,说的是哪个变量啊?
如果是nCotunt 那么是A
请说明下面的指针分别指向什么位置
&p__ p__ &p1__
p1__ p2__ p3__
p4__ p5__
答案是A B C C A D C A
大神 这个题我是真心不会 一个都不知道
p本身就是一个全局变量,这样&p指向的是这个全局变量的地址 那么是全局变量区 于是是A
p本身是一个函数指针 它指向函数foo foo所在的区域是代码段,因为它本身就是一段代码(一个函数)
p1 是局部变量,开辟了一个数组 所以 无论是p1还是&p1 都是指向局部变量的,局部变量存在栈中。 事实上,大多数编译器会做个优化,即p1和&p1本质上是一个地址的 就像是定义一个
char str[100]; 如果用scanf输入的话,标准做法是scanf("%s",str);但如果用scanf("%s",&str); 会报warning,但运行不会出错
p2本身是局部变量,但是它指向一个常量字符串 和p1是有区别的,它没有给自己分配空间。 如果在程序中对p2指向区域进行修改,会导致程序崩溃的。 这个是存在数据段的
p3局部变量,它指向一个动态分配的空间。在C中动态分配的空间是在堆上分配的,所以p3指向堆
p4指向&a, 即形参a的地址,形参本质上和局部变量相同 所以这个也是栈上的
p5指向&nCotunt 这个是一个静态的局部变量,本质上和全局变量没有什么区别。 所以p5也是指向全局变量区的
天呢 彻底晕了~ 如果再换一个差不多的题我觉得我依旧不会 因为根本不理解每一种的定义
这个我要怎么才能把它彻底弄会呢?大神
好吧 你貌似更喜欢我问题 不喜欢我说废话 那就next
写出下面代码的运行结果
struct {int a,b};
printf(“%d”,t.a/t.b);
void func(){int a;printf(“%d”,a);}
结构体那个打错了 后面还有一个t={1};
结构体那个打错了 后面还有一个t={1};
void func(){static int a;printf(“%d”,a);}
int a;
void func(){printf(“%d”,a);}
A.1 B.0 C.不确定 D.错误
答案是 D C B B
这道题我全错
吃顿饭功夫你搞出这么大一堆来。
上一个题要想不错,就需要记住各个段都放什么东西
简单地说,代码段就是你的代码,也就是各个函数。这样题目,除了函数指针的指向,一般没有代码段的了
栈上的,就是局部变量,也就是随着函数退出就会销毁的
堆上的,只有动态分配的,包括malloc zalloc realloc这类的函数分配的空间
数据段,就是所有的全局变量和常量的存储区。 一般的 用const修饰的变量,用static修饰的变量,和全局变量 常量放在这个区
至于如何区分这些变量/常量类型,就是基本功了,按照定义区分就ok
现在这个题,
struct {int a,b}t={1};
printf(“%d”,t.a/t.b);
void func(){int a;printf(“%d”,a);}
void func(){static int a;printf(“%d”,a);}
int a;
void func(){printf(“%d”,a);}
就是这四个输出吧。
第一个,结构体的定义,如果没有显示的说明,那么初始化列表是按照定义顺序来的。 如果列表中没有定义的,那么自动赋值为0
所以
t.a = 1; t.b = 0;
从这点上看,似乎应该是A 但需要注意的是printf并没有写在任何的函数里面,所以这个选d,即这个会引起一个编译错误
二三四三个是很相似的
第三个和第四个是一样的,都是全局变量无初始化定义。 第三个是静态局部变量 和全局变量是一样的
对于这种,约定为,如果没有初始化值,则自动初始化为0
第二个是和3,4相对的一种情况,即如果是局部变量,没有显示的初始化,那么初始化值为随机值,即交给编译器决定。 如果是VC的话,它会被初始化为0xcccccccc。 但从规范上,是没有要求的
你吃饭好早 我也在吃饭 吃完饭再看咯 啦啦啦~热死了 破西安
大神 你先给我讲这三个吧
大神 我坐等你给我解答 话说我是否应该真的留个你电话呢 因为你总是不理我哎~
4
A中的,定义buf长度为4,但是赋值的时候 用的字符串"hell"实际上是五个字节的,(包括结束符\0)
所以这部分就已经越界了,本身就可能出错,然后用它去printf 由于定义的四个字符中不包含\0, 所以这个操作也是越界的,同样可能出错
B和A类似,同样在strcpy中复制了5个字符过去 然后输出
C memcpy复制的长度是第三个参数,也就是strlen的结果,即3,所以这个是安全的。
需要注意的是,如果定义char buf[4]而不是char buf[4] = {0}; 那么这个选项到printf的时候就是不安全的了
D这个没什么说的 就是标准的写法 开辟的是五个字节空间,然后正常初始化和输出
5
这个涉及的东西比较偏 我也拿不准
不过可以确定的是,b0和b1的地址 一定有&b[1] = &b[0] + 4 这样一个规律
这样应该A C都有可能 至于a和b谁先分配 这个没研究过 不确定
不过我用gcc测试了一下 得到的结果是
5d9420fc 5d942100 5d942104
即a在前的(类似于C)。 或许与编译器有关吧。
3 注意a的类型是无符号型
广义上 char int long short这类都可以称为整型
当一个有符号和一个无符号的整形相比较时,会自动转为无符号类型
即(a>b)等同于(a>(unsigned int)b)
这样1和-1的比较 就变成了 1 和4294967295的比较 也就是b更"大"了
于是输出b
直到4294967295这个数是怎么来的吧
我想问那个第五题 b[0]和b[1]的地址不是相差5吗 为什么我只看出来A选项相差4 不 C和D我不会判断
还有下一个那个第三题 没有看懂你说的
还有七 八这两道题 你肯定快下班啦 明天给我解答也可以啦
还有七 八这两道题 你肯定快下班啦 明天给我解答也可以啦
5中,b[0]和b[1]地址相差的是b[0]所占的空间,也就是一个int长度,即4字节。 所以是相差4
b[0]处于低地址,b[1]是高地址
至于98 9c a0这三个数 都是差4的
3中,b原始值是-1 在与unsigned int比较时,自动转为unsigned int型。int-1的存储值为补码0xFFFFFFFF
转为无符号型为0xFFFFFFFF也就是我说的那个值
7 这个题出的也很偏,很少有这样做的
ptr1=(int *)&a+1; &a是指向a的首地址,也就是第一个元素a[0]的,&a+1就是指向a[1]的
也就是 ptr1 = &a[1]; 然后ptr1[-1]这个是一个很少见的用法,本质上还是*(ptr1-1)也就是 a[1-1] = a[0]
所以这个输出的是2
后一个更变态了。 a数组有四个元素,每个元素为int型 占4个字节,所以a占16个字节 在x86内存中是反序存储的(小端) 所以a内存的数据是
02 00 00 00 03 00 00 00 02 00 00 00 03 00 00 00
做(int)a+1时, ptr2指向了第二个00 事实上,真这样做最可能的是程序挂掉,因为这个是一个不对齐访问
如果一定要取一个值的话 *ptr2就是指向了00 00 00 03
所以输出的答案也就是03 00 00 00 即3000000
8 这个得一层层的来
首先调用 Show(Multi, 10, &a);
所以在show中,fun = Multi, arg1 = 10, arg2 = &a
定义p=Inc
tmp = p(arg1) = Inc(10); 执行Inc返回的是a+1的值,即参数+1 所以tmp = 11
执行fun(&tmp, &arg1,arg2) = Multi(&tmp, &arg1, arg2);
这里tmp值为11 arg1=10 arg2是&a 值不确定
所以执行Multi的时候 就是
*a = tmp = 11
*b = arg1 = 10
这个函数执行*c = (*a) * (*b) = 11 * 10 = 110
所以返回后的*arg2也就是*c的值110
至于答案中的5,没看到有其它的输出语句,不知道从哪里来的
那个5是5分的意思 这题我稀里糊涂得做出来了 要算分就写了个5
大神 明天见咯~这几道题我再消化消化 你说如果以后你不理我 我该拿你怎么办呢
这个嘛 是个问题 我得考虑考虑 要挟你点什么才好 哇哈哈哈哈
难道不应该是我要挟你嘛 你好人做到底嘛 对不
那可不一定 好人当一半也是正常滴呀 万一哪天我没动力了 就消失啦
如果以后去上海发展 请你吃饭咯~能不能去 这不是还得靠你给我讲题嘛
那怪我咯?看在我这么用功学习,这么虚心向你请教,你就给我讲呗~
线太长啦 没动力了呢
被发一张好人卡就很可怜了 被一直发 自然就会动力越来越小啦
哎呀 那你要我如何呢 不要欺负弱女子嘛
介个嘛 俺也不知道哎 看你喽
不懂,求大神指点~
我也不知道呢 是你提起来的 我之前都没想到 谢谢提醒哈
……怎么可以这样。我们还能愉快得聊天嘛 大不了我不问咯
你太无情了 伤心中.......
是你先欺负我的~我也委屈中
摸摸头 不哭 叔叔带你去看金鱼 :D
大神 你有孩子嘛 让我八卦一下
有啊 不过没你大 哈哈
没我大是肯定的 那我估计你就是30岁左右啦 怪不得你还挺有耐心的
我10岁的时候就这么有耐心啦
男的很少有吧 那你是女儿呢 还是儿子呢
天生的 没办法
我家的是小公主 天天欺负我
你好八卦哎 我都没问过你的信息滴说
女儿好 跟我一样好 啦啦啦~你要富养哦,精神上~
我没说不让你问呀 你自己么有问的,怪我咯?
那好啦 我要查户口啦
你姓嘛,叫嘛,从哪儿来,到哪儿去,家里几口人,人均几亩地,地里几头牛 说说说
……中午直接拿身份证件拍照给你~哈哈哈
哇 你的身份证好厉害啊 连家里的信息都有了 高级!
~有种不能愉快得聊天的感觉
这样啊 那还是恢复我色狼本色吧
速速报身高 体重 年龄 三围过来
我们不能讨论这些少儿不宜的东西哎~
这个嘛 我不是少儿 你呢
我是…真的
好吧 我相信 小家伙 昨天的题还有剩下的没?或者不懂的
我们终于言归正传啦 女生嘛 戒备心还是要有的 原谅我说得这么露骨哈
别的私人问题可以啦 什么三围啦 难道要对我心怀不轨嘛~ 不可以的哦
我能说昨天那个3题和5题依旧不会吗 一会我问你答就好了 不然你一开口 我瞬间觉得咱俩不在一个世界
还有就是这两道题
你说不懂那两个就先不管啦 一会你单独问好了
这两个题
5 考的是define宏定义的一个概念,define的效果就是
#define A B 然后在编译的时候 把代码中的A完整的替换成B 这个是一个傻瓜式的过程。所以这个题直接把define的内容替换过来就清晰了
定义的
#define FUNC(a,b) \
a++;\
b++;
\是换行标记 其实就是
#define FUNC(a,b) a++;b++;
这样 在
for(i = 0; i <2;i++)
FUNC(a,b);
就等同于
for(i = 0; i <2;i++)
a++;b++;;
这里要注意到一点,a++和b++并没有大括号,就像之前你说我写程序不加大括号一样,我当时解释说,如果不加,那么就是只对接下来的一个语句有效
于是这个就等同于
for(i = 0; i <2;i++)
a++;
b++;
;
这样就很简单了,a++在循环中 自加了2次 由2到4
b++是在循环外的 只自加了一次 由4到5
6题
对于指针,有个很简单的理解方式 *(p+n)就等同于a[n]
第一个空,p=a 这样*(p+2)=p[2] = a[2] 自然就是87
第二个稍复杂一些
p=(int*)(&a+1)
又是一个很奇怪的用法,真正编程没人这么乱搞的
a是一个一维数组,长度为5个int
&a是取a的地址,相当于int **,也就是说 在这里可以说是把a扩展到了int **也就是二维数组
对于二维数组(int**)来说,每次自加1指针移动的是一行
所以p=(int*)(&a+1) = &a[5] 本质上p已经越界了
然后执行*(p-2)= p[-2] = a[5-2] = a[3]
这样就得到一个11的值
你们老师很有意思,一般来说,大学里面的特点是教材里面介绍100,老师讲80,考试考40
可是你们这个老师像高中那样,教材里面说了100,平时讲了多少我不知道,考试的时候,考了150
有的题其实他平时穿插着讲过 不过不是细讲 他说直接找的BAT的面试题 我在上英语课啦
bat? 百度 阿里 腾讯吗?
这几家现在用C的真不多了 C++的还不少
尤其腾讯 没听说他们现在在做什么C基的项目
马云查收tvos 倒是会需要不少C的家伙
只是想让我们练练手 让我们知道平时学的那些根本就不够 更何况向我这种不好好学的 所以老师说20分及格 因为C是基础嘛 让我们打好基础呗
只是想让我们练练手 让我们知道平时学的那些根本就不够 更何况向我这种不好好学的 所以老师说20分及格 因为C是基础嘛 让我们打好基础呗
太偏 太怪
用来练习勉强可以 不过刚学搞这些真的没必要
用来打击人还是不错的 哈哈
里面有些题 我都容易搞错 ...
我们家宏儿就是故意打击我们~所以我就被打击了,完全不会嘛~怪不得我40分钟就完了 反正都不会
这种题 40分不少了 呵呵
呵呵 maybe 我也想去上海哎。感觉西安人都很怂
没去过西安 不知道
不过上海个人觉得还不错
来过上海吗?
没有啊 好远的感觉 西安太干燥了~
你是西安本地人?出国省没?
不是西安人 当然出过啦
那你是哪里人啊?
我不告诉你
太小气了 之前说我没问 现在我问什么你都不告诉 过分!!( ⊙ o ⊙ )
哎呀 这个不重要 就是那个第六题 我们老师说&a就相当于移到数组的末尾 对吗?
是&a+1
可以说是末尾 但实际上 已经超出末尾的概念了
一般来说 移动到数组末尾 指的往往是指向数组的最后一个元素
这个是指向最后一个元素的下一个元素
好吧 那我就这么理解吧 昨天那个第五题 为什么它们的地址是8位?%x是什么意思啊?我不会算 为何 98 9c a0都相差4呢
不对 地址是10位
0x是题目自己加的 不懂
这个和编译器有关。目前CPU有32位和64位两种,同样操作系统和编译器也有64位和32位两种
目前看来,32位编译器还是占主流的,所以作答和出题一般也是以32位作为标准
在32位情况下,每个int占32位(bits) 也就是4字节(bytes) 写成16进制形式也就是8个字符
在这种情况下 数据线的宽度是32根,寻址范围也是32位的,所以表现出来的地址形式就是一个32位的数值
同上,一样是8个字符表示一个地址
%x是按照16进制输出 即输出的是一个16进制形式表达的数
98 9c a0都是16进制的表示
转为10进制为152 156 160
每两个数之间差为4
PS:这个题你们老师用0x%x输出已经很厚道了 要我出题 肯定是%#10x 哈哈
你好坏~你也该下班了吧
大神 明天见~
大神 明天见~
这就准备回去了 明天见
大神 早~
早
大神 那个第三题 char b=-1 转成无符号整形 0XFFFFFFFF 怎么转的?我不懂
大神 那个第三题 char b=-1 转成无符号整形 0XFFFFFFFF 怎么转的?我不懂
大神 大神 ~ 你在哪里呀~
这个涉及到计算机对负数的存储 即有符号数和无符号数的区别
相关的概念是原码 反码和补码
当计算机存储的时候,用的都是补码
原码是数字本身的二进制表示 比如 100的原码就是0x64
反码就是把原码二进制按位翻转 0x64=b01100100 反码就是b10011011=0x9b
补码对于正数和负数不同
正数的补码为原码
负数的补码为反码加1 从补码到原码同样是反码加一
如果有溢出则抛弃
在计算原码和补码的时候,如果是有符号数那么最高位为符号位,不参与计算
如果是无符号数,那么都是正数,直接就是本身的值
举个例子 如果是无符号数
unsigned char c = 154;
那么它的16进制为0x9a= b10011010
如果为有符号数,
char c = 99;
99=0x63=b01100011 最高位为0 为正数 存储的其本身
如果char c = 135;
135=0x87=10000111 最高位为1 表述负数,于是实际值为
0000111的取反+1; 即1111000+1=1111001=0x79=121
于是 这时c的实际值为-121
如果char c = -20;
那么c的实际存储为
20=0x14=0010100 补码为1101011+1=1101100
加上符号位 完整的表示11101100=0xEC
搞明白这些这个题就很容易理解了
对于unsigned int c = -1;
int为4个字节,共32位, 如果是有符号数,那么存-1为最高位为符号位1 剩余31位为补码
1=b000 0000 0000 0000 0000 0000 0000 0001
取反+1 = b111 1111 1111 1111 1111 1111 1111 1110 + 1 = b111 1111 1111 1111 1111 1111 1111 1111
加上符号位 就成了全1 于是就是0xffffffff
当无符号转为有符号 值不变 就成了我说的那个很大的数
在%d的时候 再转为有符号数,存储值还是不变 于是按照-1输出
其实这样的题目,只要拿住当有符号和无符号互相转时,实际存储不变,不需要中间的复杂计算,直接就可以确定 按照%d输出就是原始的赋值的负值, -1
知识量太多 我要静一静~但是如果我不想计算 那我怎么能确定它就一定比另一个数大还是小呢
嗨~man
嗨~man
唉~心酸 你又不理我
唉~心酸 你又不理我
其他类似问题
- 2008-11-23 C语言编程:求100到200之间素数的个数? 29
- 2015-11-11 用C语言写求100之内所有素数的平均值的程序,谢谢!!! 6
- 2009-11-20 编辑一个C语言程序求100--200间的全部素数 44
- 2008-04-20 c语言 求100~200中所有的素数(要求编写一个判断是否是... 2
- 2012-05-11 编写C语言程序,求100~200之间所有素数。 32
- 2012-04-22 用C语言求100-200之间的素数 301
- 2016-12-07 用c语言编写一个程序求100-200之间的所有素数,并输出素... 2
- 2012-08-18 怎么求素数?最简单的方法。谢谢,用C编程。谢谢 3