道痴前辈的C语言编程学习手札1

道痴前辈的C语言编程学习手札1

初学C语言已经有好几个月了,我对学习过程中遇到的一些问题进行了简单的总结,多有不足,希望各位能多多包涵

与此同时,这也是我第一次写博客,也希望各位能多多指教

素材1:

1>源代码

#include<stdio.h>
int main()
{
int price=0;

printf("请输入金额(CNY):");
scanf("%d“,&price);

int change=100-price;

printf("找你%d元。\n",change);

            return0;

}

2>运行情况
无论输入什么数字,运行结果总是显示为100;
当直接运行小程序时,只能显示“请输入金额(CNY)_",当输入数字后,点击回车键会发生直接闪退的现象

3>原因探究

经过多次尝试,最终发现问题根源在“return 0”,我错误地将其编写为“return0”,在编写过程中少敲击了一个空格键。

4>正确源代码

#include<stdio.h>
int main()
{
int price=0;
const int AMOUNT=100;

printf("请输入金额(CNY):");
scanf("%d",&price);

int change=AMOUNT-price;

printf("找你%d元。\n",change);

return 0;
}

素材2:求3~100内的所有素数之和

日期:2019-04-12 星期五

1>.源代码:
#include<stdio.h>
void main()
{
int m,n,sum=0;
while(m<100)
{
for(n=2;n<=m/2;n++)
if (m%n==0) break;
if(n>m/2)
sum+=m;
}
printf(“sum=%ld\n”,sum);
}

2>.运行情况:
能运行,无反馈结果
--------------------Configuration: a - Win32 Debug--------------------
Linking…
LINK : fatal error LNK1168: cannot open Debug/a.exe for writing
执行 link.exe 时出错.

a.exe - 1 error(s), 0 warning(s)

3>.原因探究:
粗心大意,误将两行代码遗漏

4>.正确源代码:
#include<stdio.h>
void main()
{
int m,n,sum=0;
m=3;

while(m<100)
{
	for(n=2;n<=m/2;n++)
		if (m%n==0) break;
	if(n>m/2)
		sum+=m;
                            m+=2;
}
printf("sum=%ld\n",sum);

}

素材3:三个数中取最大数

2019-04-12 星期五

1>.源代码:
#include<stdio.h>
void mian()
{
int x,y,z,max;
printf(“intput three numbers:\n”);

scanf("%d%d%d",&x,&y,&z);
max=x;
if(z>y)
{if(z>x) max=z;}
else
	if(y>x) max=y;

printf("%d\n",max);

}

2>.运行情况:

点击保存时--------------------Configuration: a - Win32 Debug--------------------
Compiling…
a.c

a.obj - 0 error(s), 0 warning(s)

正在运行时--------------------Configuration: a - Win32 Debug--------------------
Linking…
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/a.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

a.exe - 1 error(s), 0 warning(s)

3>.原因探究:
PC机错误显示“0error(s),0error(s),导致我将注意点移向其他地方,未能发现错误就在眼前:我误将main写成了mian
又因为我不能完全读懂PC机给的错误提示,导致我自己长时间不能发现错误

素材4:编程N的阶乘,N由用户输入

日期:2019-04-13

1>.源代码:
#include<stdio.h>
void main()
{
int m=0;
int N=0;
int n=1;

printf("Input one number,you will get its factorial result:\nN=" );


scanf("%d",&N);
if(N<0)
	printf("Data error!\n");
            if(N==0)
	printf("%d!=%d\n",N,N);
if(N>0)
	for(m=1;m<=N;m++)
{
	n=m*n;
}	
printf("%d!=%d\n",N,n);

}

2>.运行情况:
输入负数时,会得到:
Input one number,you will get its factorial result:
N=-4
Data error!
-4!=1
Press any key to continue
输入0时,会得到:
Input one number,you will get its factorial result:
N=0
0!=0
0!=1
Press any key to continue
输入4时,会得到:
Input one number,you will get its factorial result:
N=4
4!=24
Press any key to continue

运行看似一切正常,但当我们输入0的时候,我们总会多得到一个“0!=1”的结果,但这并不是我们想要的结果

3>.原因探究:
未将第三个if语句后面的for语句和printf语句用大括号括起来,导致输入负数或者输入0的时候,会同时输出第二个和第三个printf语句

4>.正确源代码:
#include<stdio.h>
void main()
{
int m=0;
int N=0;
int n=1;

printf("Input one number,you will get its factorial result:\nN=" );


scanf("%d",&N);
if(N<0)
	printf("Data error!\n");
            if(N==0)
	printf("%d!=%d\n",N,N);
if(N>0)
{	
                            for(m=1;m<=N;m++)
{
	n=m*n;
}	
printf("%d!=%d\n",N,n);
            }

}

素材5:求数列1,-1/2,1/4,-1/6,1/8,…前10项之和S:\n"

日期:2019-04-19

1>.源代码:
#include<stdio.h>
void main()
{
int i;
float m,S;
printf(“求数列1,-1/2,1/4,-1/6,1/8,…前10项之和S:\n”);
for(i=1;i<=9;i++)
{
if(i%2!=0)
m=-1.0/2i;
if(i%2==0)
m=1.0/2i;
S=1;
S+=m;
}
printf(“S=%f\n”,S);
}

2>.运行情况:
--------------------Configuration: a - Win32 Debug--------------------
Compiling…
a.c
C:\Users\淳哥的痛\Desktop\a.c(10) : error C2059: syntax error : ‘bad suffix on number’
C:\Users\淳哥的痛\Desktop\a.c(10) : error C2146: syntax error : missing ‘;’ before identifier ‘i’
C:\Users\淳哥的痛\Desktop\a.c(12) : error C2059: syntax error : ‘bad suffix on number’
C:\Users\淳哥的痛\Desktop\a.c(12) : error C2146: syntax error : missing ‘;’ before identifier ‘i’
执行 cl.exe 时出错.

a.obj - 1 error(s), 0 warning(s)。

3>.原因探究:
//(1).不能直接写2i,而要写成2*i;
//(2).给S赋值的时候所放的位置不对,不应该放在for循环中,会导致每次循环都会对S重新赋值1.

4>.正确源代码:
#include<stdio.h>
void main()
{
int i;
float m,S=1.0;
printf(“求数列1,-1/2,1/4,-1/6,1/8,…前10项之和S:\n”);
for(i=1;i<10;i++)
{
if(i%2!=0)
m=-1.0/(2i);
if(i%2==0)
m=1.0/(2
i);
S+=m;
}
printf(“S=%f\n”,S);
}

素材6:在某比赛中有10个评委对选手进行打分,编写程序计算选手的最终得分

        计算规则:去掉一个最高评分和一个最低评分后,求出的其余评分的平均值,
                         即为该选手的最终得分
        已知:满分为10分,一位选手的成绩如下:3,7.5,8,8,6,10,1,7,9.8,9;

1>.源代码:
#include<stdio.h>
void main()
{
float a[10]={3,7.5,8,8,6,10,1,7,9.8,9};
float max,min,s;
int i;
max=a[0];
min=a[0];
s=a[0];
for(i=1;i<=9;i++)
{
if(max<a[i])max=a[i];
if(min>a[i])min=a[i];
s=s+a[i];
}
printf(“最终得分为:%.2f\n”,(s-max-min)/8);
}

2>.运行结果:
最终得分为:7.29
Press any key to continue

注意事项:
1>.若将“s=a[0]”改为“s=0",则相应地要将”(s-max-min)/8“改为”(s+a[0]-max-min)/8".
2>.在对数组初始化时,若被定义地数组长度与要赋值的个数不相同时,数组长度不能省略,且只可以少赋值,不能多赋值,否则会出现编译错误.

素材7:

1>.源代码:
#include<stdio.h>
void main()
{
float a[20],max;
int i,n=0;
printf(“请输入任意20名学生的成绩:\n”);
for(i=0;i<20;i++)
scanf("%f",&a[i]);
for(i=0;i<20;i++)
{
max=a[0];
if(max<a[i])
max=a[i];

	if(a[i]<60)n++;

}
printf("max=%f\n",max);
printf("不及格的人数为:%d\n",n);

}

2>.运行情况:测试可进行,结果出错

3>.原因探究:在for循环中,每次循环都会将max重新赋值为a[0],应将"max=a[0]"移至第2个for循环之前

4>.正确源代码:
#include<stdio.h>
void main()
{
float a[20],max;
int i,n=0;
printf(“请输入任意20名学生的成绩:\n”);
for(i=0;i<20;i++)
scanf("%f",&a[i]);
max=a[0];
for(i=0;i<20;i++)
{

	if(max<a[i])
		max=a[i];

	if(a[i]<60)n++;

}
printf("max=%f\n",max);
printf("不及格的人数为:%d\n",n);

}

素材8:

1>.题目:懒羊羊有十个藏零食的地点,小灰灰都知道,而且懒羊羊一定会在其中一个地方吃零食。一天,小灰灰想要找懒羊羊一起玩,想要按照“1,3,6,10,15,21,…"(在上一次的寻找基础上越过一个地点继续寻找),直到找到第500个还没有找到的话,就不再找他玩了。无意中发现秘密的灰太狼在哪几个地方可能会抓住懒羊羊?

2>.源代码:
#include<stdio.h>
void main()
{
int n=0,x,i,a[10];
for(i=0;i<10;i++)
a[i]=1;
for(i=0;i<500;i++)
{
n=n+(i+1);
x=n%10;
a[x]=0;
}
for(i=0;i<10;i++)
if(a[i]==1)//也可以写成if(a[i])
printf(“懒羊羊可能会出现在%d\n”,i);
}

素材9:

1>.题目:请设计程序判断用户输入的一个任意三位数是否为”水仙花“数

2>.源代码:
#include<stdio.h>
int fun(int m)
{
int i,j,k;
i=m/100;
j=m/10%10;
k=m%10;
if(m==iii+jjj+kkk)
return 1;
else
return 0;
}
void main()
{
int n,z;
printf(“请输入一个你想要输入的三位数,系统将为您判断是否为“水仙花”数\n”);
scanf("%d",&n);
z=fun(n);
printf(“判断结果为:%d\n”,z);
}

素材10:

1>.题目:编写函数计算x的n(n>=0)次方。

2>.源代码:

①#include<stdio.h>
int w(int x,int n)
{
int i,w=1;
if(n==0)
w=1;
if(n>=0)
for(i=1;i<=n;i++)
w*=x;
return w;
}

void main()
{
int x,n;
printf(“请输入x和n的值,您将会得到x的n次方的结果\n”);
printf(“输入格式为x,n(x和n都为整数)\n:”);
scanf("%d,%d",&x,&n);
w(x,n);
printf("%d的%d次方为%d\n",x,n,w(x,n));

}

②递归法:
在调用一个函数的过程中直接或间接调用该函数本身,称为函数的递归调用
#include<stdio.h>

void main()
{
long w(int x,int n);//函数声明
int x,n;
printf(“请输入x和n的值,您将会得到x的n次方\n输入格式为:x,n\n”);
scanf("%d,%d",&x,&n);
w(x,n);//调用函数w
printf("%d的%d次方是%ld\n",x,n,w(x,n));

}
long w(int x,int n)//函数w的定义
{
if(n==0)
return 1;
else
return x*w(x,n-1);
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道痴前辈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值