文章目录
- 厘米换算英尺英寸
- tips:[另附C语言取整方法
- 实验2-2-7 整数152的各位数字
- 实验2-3-3 计算存款利息
- 实验2-3-5 整数算术运算
- 实验2-3-7 阶梯电价
- 实验2-3-8 计算火车运行时间
- 实验2-4-2 求N分之一序列前N项和
- 实验2-4-3 求奇数分之一序列前N项和
- 实验2-5-4 求组合数
- 实验4-1-1 统计数字字符和空格
- 4-1-6 求分数序列前N项和
- 实验4-1-7 特殊a串数列求和
- tips:生成随机数
- tips:sort()函数使用方法
- 实验4-2-1 求e的近似值
- 实验4-2-7 找完数
- 实验4-2-9 水仙花数
- tips:字符串输入知识点
- tips:格式化输出知识
- tips:常用字符串函数
- tips:C语言字符类型和数字类型互相转换
- 实验4-1-10 兔子繁衍问题
- 实验11-2-1 建立学生信息链表
- tips:program received signal sigsegv,Segmentation fault报错
- 实验11-2-9 链表逆置
- 实验4-1-11 高空坠球
厘米换算英尺英寸
分数 15
作者 翁恺
单位 浙江大学
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。英寸的值应小于12。
输入样例:
170
输出样例:
5 6
答案:
tips:[另附C语言取整方法
](https://blog.youkuaiyun.com/qq_43448856/article/details/112939667)
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
// 法一:
int main(){
int cm,foot,inch;
scanf("%d",&cm);
foot=(int)(cm/30.48);
inch=(int)((cm/30.48-foot)*12);
printf("%d %d",foot,inch);
}
// 法二
/*
include <stdio.h>
int main(){
int cmlen;
scanf("%d",&cmlen);
int foot= cmlen/100.0/0.3048;
int inch = (cmlen/100.0/0.3048-foot)*12;
printf("%d %d\n",foot,inch);
}*/
实验2-2-7 整数152的各位数字
本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。
输入格式:
本题无输入。
输出格式:
按照以下格式输出:
152 = 个位数字 + 十位数字10 + 百位数字100
思路:做本题时用到求整数的各个位,求个位数为n%10,求十位数为n/10%10,求百位数为n/100%10,以此类推.
int main(){
int n=152;
int str[3];
/*法一
for(int i=0,j=1;j<=100&&i<3;j*=10,i++)
{
str[i]=n/j%10;
}
*/
//法二
int i=0,j=1;
while(j<=100 && i<3){
str[i]=n/j%10;
i++;
j*=10;
}
printf("152 = %d + %d*10 + %d*100",str[0],str[1],str[2]);
}
实验2-3-3 计算存款利息
分数 10
作者 颜晖
单位 浙大城市学院
本题目要求计算存款利息,计算公式为interest=money×(1+rate)
year
−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。
输入格式:
输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。
输出格式:
在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。
输入样例:
1000 3 0.025
输出样例:
interest = 76.89
思考:在解题过程中,我把year当成整数,从而导致当year不为整数时计算错误,为了计算year不为整数的情况,要用到求次方函数pow。原型为:double pow(double x, double y); 求x^y;使用时注意参数类型,如果x,y为整数可能运行会出错。使用时要加上**#include<math.h>**
另附:double sqrt(double x); 计算x平方根。函数参数和返回值都是double类型,使用时x为整形也可以,不过有可能答案会出错。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
float money,year,rate,interest;
scanf("%f %f %f",&money,&year,&rate);
float temp=1;
/* for(int i=1;i<=year;i++){
temp*=(1+rate);
}*/
temp=pow(1+rate,year);
interest=money*temp-money;
printf("interest = %.2f",interest);
}
实验2-3-5 整数算术运算
分数 10
作者 颜晖
单位 浙大城市学院
本题要求编写程序,计算并输出2个正整数的和、差、积、商与余数。题目保证输入和输出全部在整型范围内。
输入格式:
输入在一行中给出2个正整数A和B。
输出格式:
在5行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商与余数。
输入样例:
5 3
输出样例:
在这里给出相应的输出。例如:
5 + 3 = 8
5 - 3 = 2
5 * 3 = 15
5 / 3 = 1
5 % 3 = 2
思考:题目不难,但是要注意特殊字符的输出
printf("%%d");//在屏幕中输出%d
printf("\\n");//在屏幕中输出\n
printf("%%");//在屏幕中输出%
printf("\\t");//在屏幕中输出\t
实验2-3-7 阶梯电价
分数 15
作者 陈建海
单位 浙江大学
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
输入样例1:
10
输出样例1:
cost = 5.30
思考:题目简单,但是我犯了一个小错误,电价在0-50时条件写错了
#include<stdio.h>
int main(){
int k;
scanf("%d",&k);
float m;
if(k<0){
printf("Invalid Value!");
}else if(k>=0 && k<=50){//正确写法k>=0 && k<=50;错误写法0<=k<=50
m=0.53*k;
printf("cost = %.2f",m);
}else{
m=50*0.53+(k-50)*0.58;
printf("cost = %.2f",m);
}
}
实验2-3-8 计算火车运行时间
分数 15
作者 沈睿
单位 浙江大学
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
输入样例:
1201 1530
输出样例:
03:29
思考:把时间全部转换为分钟,计算出结果后,再转成hh:mm形式,主要是控制输出格式不懂
如何控制输出的格式%m.nf
%02d 右对齐输出,位数不够补0;
%2d右对齐输出,位数不够补空格;
%.2f输出两位小数,左对齐输出,位数不够自动补0;
(这里不含有四舍五入,只有保留位数,想要四舍五入也很简单,先乘以10^(n-1)然后加0.5强制转化就行了)
#include<stdlib.h>
#include<stdio.h>
int main(){
int g,r;
scanf("%d %d",&g,&r);
/* int hh=r/100-g/100;
int mm;
if((r%100-g%100)<0){
hh--;
mm=60+r%100-g%100;
}*/
int gt=g/100*60+g%100;
int rt=r/100*60+r%100;
int t=rt-gt;
int hh,mm;
hh=t/60;
mm=t%60;
printf("%02d:%02d",hh,mm);
}
实验2-4-2 求N分之一序列前N项和
分数 15
作者 C课程组
单位 浙江大学
本题要求编写程序,计算序列 1 + 1/2 + 1/3 + … 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
输入样例:
6
输出样例:
sum = 2.450000
题目不难,但要注意输入输出格式:
double,双精度浮点型,对应%lf。
定义一个double的变量可以写作:double a;
输入语句可以写作:scanf(“%lf”, &a);输出语句可以写作:printf(“%lf”,a);
在输入输出时,一定要区分好double和float,而使用对应的格式符号。
%f是以float类型格式化输入或输出
实验2-4-3 求奇数分之一序列前N项和
分数 15
作者 C课程组
单位 浙江大学
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
思考:读题时把题目看错了,注意是前n项!
#include<stdlib.h>
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
double sum=0.0;
for(int i=0;i<n;i++){
sum+=(1.0/(2*i+1));
}
printf("sum = %lf",sum);
}
实验2-5-4 求组合数
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。
输入样例:
2 7
输出样例:
result = 21
思考:题目不难,主要问题是精度问题,要认真看题目要求,说是double就要用double的变量!!
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
double fact(int n)
{
if(n==0){
return 1.0;
}else{
double s=1.0;
for(int i=1;i<=n;i++){
s*=i;
}
return s;
}
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
double re=0;
re=fact(n)/(fact(m)*fact(n-m));
printf("result = %.0f",re);
}
实验4-1-1 统计数字字符和空格
本题要求编写程序,输入一行字符,统计其中数字字符、空格和其他字符的个数。建议使用switch语句编写。
输入格式:
输入在一行中给出若干字符,最后一个回车表示输入结束,不算在内。
输出格式:
在一行内按照
blank = 空格个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。
输入样例:
在这里给出一组输入。例如:
Reold 12 or 45T
输出样例:
blank = 3, digit = 4, other = 8
在这里给出相应的输出。例如:
思考:题目不难,但要注意switch的用法,
1)括号内的"表达式",其值的类型应为整数类型(包括字符型)。
(2)花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以 default开头的行。case后面跟一个常量(或常量表达式),它们和 default都是起标号作用,用来标志一个位置。执行switch语句时,先计算 switch后面的"表达式"的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与 switch表达式相匹配的case常量,流程转去执行 default标号后面的语句。
(3)可以没有 default标号,此时如果没有与 switch表达式相匹配的case常量,则不执行任何语句。
(4)各个case标号出现次序不影响执行结果。
(5)每一个case常量必须互不相同;否则就会出现互相矛盾的现象。
(6)case标号只起标记的作用。**在执行 switch语句时,根据 switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。**因此,**一般情况下,在执行一个case子句后,应当用 break语句使流程跳出 switchs结构。**最后一个case子句(今为 default子句)中可不加 break语句。
(7)在case子句中虽然包含了ー个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8)多个case标号可以共用一组执行语句
#include<stdlib.h>
#include<stdio.h>
int main(){
char s[1000];
int len,b=0,d=0,oth=0;
for(int i=0;i<1000;i++){
scanf("%c",&s[i]);
if(s[i]=='\n'){
len=i;
break;
}
}
for(int i=0;i<len;i++){
switch(s[i]){
case ' ':b++;break;
case '1':d++;break;
case '2':d++;break;
case '3':d++;break;
case '4':d++;break;
case '5':d++;break;
case '6':d++;break;
case '7':d++;break;
case '8':d++;break;
case '9':d++;break;
case '0':d++;break;
default:oth++;break;
}
}
printf("blank = %d, digit = %d, other = %d",b,d,oth);
}
4-1-6 求分数序列前N项和
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
思考:要把下一项的分子分母提前存起来,以便后面赋值,如果不这样的话,后面赋值容易错把新值代入到计算中。
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
double sum=0.00;
if(n==1){
sum=2;
}else{
sum+=2;
double fz=2.0,fm=1.0;
for(int i=2;i<=n;i++){
double z=fz+fm,m=fz;//主要要用double,不然当n较大是会出错
sum+=(fz+fm)/fz;
fz=z;
fm=m;
}
}
printf("%.2lf",sum);
}
实验4-1-7 特殊a串数列求和
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
思考:注意要把a的值保留下来,如果不保留的话,后面更新aaa时会把aa的值加进去;
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
main(){
int a,n;
scanf("%d %d",&a,&n);
int sum=0,b=a;
for(int i=1;i<=n;i++){
sum+=b;
b=(b*10+a);
}
printf("s = %d",sum);
}
tips:生成随机数
生成随机数之前先进行播种:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int a;
srand((unsigned)time(NULL));
a = rand();
printf("%d\n", a);
return 0;
}
生成一定范围内的随机数
int a = rand() % 51 + 13; //产生13~63的随机数
tips:sort()函数使用方法
#include<algorithm>
using namespace std;
//sort(数组名,数组名+元素个数,排序函数);
int a[5]={5,3,7,2,8};
sort(a,a+5);//对数组a进行排序
for(int i=0;i<5;i++){
printf("%d ",a[i]);
实验4-1-12 黑洞数
分数 20
作者 C课程组
单位 浙江大学
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
思考:解法不难,主要是排序不能直接用sort函数
#include<stdlib.h>
#include<stdio.h>
//#include<algorithm>
//using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[3];//分别存储个位,十位,百位
int min=-1,max=-1;
int count=1;//计数用
while((max-min)!=495){
int temp=1;
for(int i=0;i<3;i++){
a[i]=n/temp%10;
temp*=10;
}
//排序
for(int i=0;i<3-1;i++){
for(int j=0;j<3-1-i;j++){
int t;
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
//sort(a,a+3);
min=a[0]*100+a[1]*10+a[2];
max=a[2]*100+a[1]*10+a[0];
printf("%d: %d - %d = %d\n",count,max,min,max-min);
n=max-min;
count++;
}
}
实验4-2-1 求e的近似值
分数 15
作者 C课程组
单位 浙江大学
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
思考;题目不难,主要是注意隐含条件,比如当n取1000时,1000的阶乘就超过整型的范围了,因此求阶乘函数返回时要返回double型,这样范围够大运行才不会出错。
#include<stdlib.h>
#include<stdio.h>
double jie(int n){
double re=1;
if(n==0 || n==1){
return 1;
}else{
for(int i=1;i<=n;i++){
re*=i;
}
return re;
}
}
int main(){
int n;
scanf("%d",&n);
double s=1.0;
if(0<=n && n<=1000){
for(int i=1;i<=n;i++){
s+=(1.0/jie(i));
}
}
printf("%.8lf",s);
}
实验4-2-7 找完数
分数 20
作者 陈建海
单位 浙江大学
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
思考:题目不难,主要是要找因数
#include <stdio.h>
int main()
{
int number, i;
printf("输入一个整数: ");
scanf("%d",&number);
printf("%d 的因数有: ", number);
//求因数
for(i=1; i <= number; ++i)
{
if (number%i == 0)
{
printf("%d ",i);
}
}
return 0;
}
题解:
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(){
int m,n,sum,index,judge=0;
scanf("%d %d",&m,&n);
int a[100];
for(int i=m;i<=n;i++){
//求因数
sum=0,index=0;
for(int j=1;j<i;j++){
if(i%j==0){
sum+=j;
a[index]=j;
index++;
}
}
if(sum==i && sum!=0){
judge=1;
printf("%d = 1",i);
for(int k=1;k<index;k++){
printf(" + %d",a[k]);
}
printf("\n");
}
}
if(judge==0){
printf("None");
}
}
实验4-2-9 水仙花数
分数 20
作者 徐镜春
单位 浙江大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
思考:题目不难,问题在于用pow函数会超时,所以自己重新写了一个求次幂的函数。
#include<stdlib.h>
#include<stdio.h>
//#include<math.h>
int pow1(int n,int index){
int t=n;
for(int i=2;i<=index;i++){
t*=n;
}
return t;
}
int shui(int n,int len){
int a[7];
int j=1,sum=0;
for(int i=0;i<len;i++){
a[i]=n/j%10;
j*=10;
sum+=pow1(a[i],len);
}
if(sum==n){
return 1;
}else return 0;
}
int main(){
int n;
scanf("%d",&n);
int min=pow1(10,n-1),max=pow1(10,n);
for(int i=min;i<max;i++){
if(shui(i,n)){
printf("%d\n",i);
}
}
}
实验6-2 英文字母替换加密(大小写转换+后移1位)
分数 15
作者 颜晖
单位 浙大城市学院
本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。
输入格式:
输入一行字符,以回车符 '\n’作为 结束符。
输出格式:
将输入的一行字符中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母后输出,其他字符按原样输出。
输入样例:
在这里给出一组输入。例如:
Reold Z123?
输出样例:
在这里给出相应的输出。例如:
sFPME a123?
思考:字符串的输入掌握熟悉,同时要把计算后的数据放在另一个数组里面,如果放在原来的数组里面会导致错误,如字母’C’在if循环时变换成‘d’,在经过else if循环时,发现满足循环,又会把‘d’变成E,就导致了错误。
tips:字符串输入知识点
https://blog.youkuaiyun.com/weixin_46768191/article/details/125984553
tips:格式化输出知识
https://blog.youkuaiyun.com/qq_15719613/article/details/120498522
tips:常用字符串函数
#include<stdlib.h>
#include<stdio.h>
int main(){
char a[100],b[100];
// getchar();
int len=0;
for(int i=0;i<100;i++){
scanf("%c",&a[i]);
if(a[i]=='\n'){
len=i;
break;
}
}
for(int i=0;i<100;i++){
if('A'<=a[i] && a[i]<='Z'){
if(a[i]=='Z'){
b[i]=('A'+32);
}else{
b[i]=(a[i]+1+32);
}
}else if('a'<=a[i] && a[i]<='z'){
if(a[i]=='z'){
b[i]=('a'-32);
}else{
b[i]=(a[i]+1-32);
}
}else{
b[i]=a[i];
}
}
for(int i=0;i<len;i++){
// if(b[i]=='\n')break;
printf("%c",b[i]);
}
}
tips:C语言字符类型和数字类型互相转换
https://blog.youkuaiyun.com/weixin_33341108/article/details/117014287
实验4-1-10 兔子繁衍问题
分数 15
作者 徐镜春
单位 浙江大学
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
思考:开始没看出是斐波那契数列, 先按时间计算一下123456月的兔子对数分别为 1 1 2 3 5 8 对;问题可转化为求第几项的斐波那契数字大于等于n
#include<stdlib.h>
#include<stdio.h>
int fibo(int n){
if(n==1 || n==2)return 1;
else return fibo(n-2)+fibo(n-1);
}
int main(){
int n;
scanf("%d",&n);
int now=1;//月份,起始为1
while(fibo(now)<n){
now++;
}
printf("%d",now);
}
实验11-2-1 建立学生信息链表
分数 20
作者 张泳
单位 浙大城市学院
本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
函数接口定义:
void input();
该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:
struct stud_node {
int num; /学号/
char name[20]; /姓名/
int score; /成绩/
struct stud_node *next; /指向下个结点的指针/
};
单向链表的头尾指针保存在全局变量head和tail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
struct stud_node *p;
head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d\n", p->num, p->name, p->score);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
输出样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
思考:思路不难,就是写代码的时候会遇到各种各样的问题,首先定义struct类型的指针后要记得赋初值,不然直接使用head->next是不起作用啊!其次,输入输出的顺序要搞清楚啊,什么时候该判断输入要清楚,我就是把3个输入直接放一起了出错,一个把学号单独拿出来判断
tips:program received signal sigsegv,Segmentation fault报错
program received signal sigsegv,Segmentation fault的解释
#include <stdlib.h>
#include <string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
struct stud_node *p;
head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d\n", p->num, p->name, p->score);
return 0;
}
/* 你的代码将被嵌在这里 */
void input() {
int n = 0, s = 0;
char name1[20];
int count = 0;
struct stud_node* pre;
while (1) {
scanf("%d", &n);
if (n == 0) {
tail = pre;
break;
}
else {
scanf("%s %d", name1, &s);
struct stud_node* now = (struct stud_node*)malloc(sizeof(struct stud_node));//头节点
if (count == 0) {
head = now;
now->num = n;
strcpy(now->name, name1);
now->score = s;
now->next = NULL;
count = 1;
// printf("data:%d %s %d\n", now->num, now->name, now->score);
pre = now;
}
else {
pre->next = now;
now->num = n;
strcpy(now->name, name1);
now->score = s;
now->next = NULL;
// printf("data:%d %s %d\n", now->num, now->name, now->score);
pre = now;
}
}
}
}
}
实验11-2-9 链表逆置
分数 20
作者 张泳
单位 浙大城市学院
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
//函数接口定义:
struct ListNode *reverse( struct ListNode *head );
//其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
思路:开始用原地逆置的方法,发现运行超时了,那就以空间换时间吧,直接新建一个带头结点的链表,把原来链表中的数据一个个取下来,再通过头插法插入新建的链表中。
struct ListNode *reverse( struct ListNode *head ){
if(head==NULL) return NULL;
else if(head->next==NULL) return head;
else{
//新建一个链表来存放
struct ListNode *head1=(struct ListNode *)malloc(sizeof(struct ListNode *));
head1->next=NULL;
while(head!=NULL){
struct ListNode *node=(struct ListNode *)malloc(sizeof(struct ListNode *));
node->data=head->data;
node->next=head1->next;
head1->next=node;
head=head->next;
}
return head1->next;
}
}
实验4-1-11 高空坠球
分数 20
作者 C课程组
单位 浙江大学
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
main(){
long int n;
float h;
scanf("%f %ld",&h,&n);
double sum=0.0;
double t;
if(n==1){
sum=h;
h=h/2.0;
}else if(n==0){
sum=0;
h=0;
}
else{
sum+=h;
h=h*1.0/2;
for(int i=2;i<=n;i++){
sum+=(h*2);
h=h*1.0/2;
}
}
printf("%.1lf %.1lf",sum,h);
}