【程序 1】1~4 组成无重复数字的三位数。
题目:有 1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?程序分析:可填在百位、十位、个位的数字都是 1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
程序源代码:
#include
void main()
{
int i,j,k,sum=0;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
for(k=1;k<=4;k++)
{
if(i!=j&&j!=k&&i!=k)
{
sum++;
printf("%d,%d,%d\n",i,j,k);
}
}
printf("%d\n",sum);
}
【程序 2】企业利润计算(switch) 题目:企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元时,奖金可提 10%;利润高于 10 万元, 低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可可提成 7.5%;20 万到 40 万之 间时,高于 20 万元的部分,可提成 5%;40 万到 60 万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,高于 100 万元时,超过 100万元的部分按 1%提成,从 键盘输入当月利润 i,求应发放奖金总数a?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成浮点型。
程序源代码:
#include
void main()
{
double i;
printf("input i:");
scanf("%lf",&i);
double a,a1,a2,a3,a4,a5;
a1=10000*0.1;
a2=a1+10000*0.075;
a3=a2+20000*0.05;
a4=a3+20000*0.03;
a5=a4+40000*0.015;
if(i<=10000)
a=i*0.1;
else if(i<=20000)
a=a1+(i-10000)*0.075;
else if(i<=40000)
a=a2+(i-20000)*0.005;
else if(i<=60000)
a=a3+(i-40000)*0.005;
else if(i<=100000)
a=a4+(i-60000)*0.015;
else
a=a5+(i-100000)*0.005;
printf("%0.5lf\n",a);
}
【程序 3】加 100 是完全平方数 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168又是一个完全平方数,请问该数是多少?
程序分析:在 10 万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后 的结果满足如下条件,即是结果。
程序源代码:
#include
#include
void main()
{
long int i,x,y;
for (i=0; i<100000; i++) {
x = sqrt(i+100);
y = sqrt(i+100+168);
if (x*x == i+100&&y*y == i+100+168)
{
printf("%ld\n",i);
}
}
}
【程序 4】年月日判断是年份的第几天。
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以 3 月5 日为例,应该先把前两个月的加起来,然后再加上5 天即本年的第几天,特殊情况,闰年且输入月份大于 3时需考虑多加一天。
程序源代码:
#include
int main()
{
int i, days = 0;
int year, month, day;
int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
printf("输入年、月、日,用空格隔开:");
scanf("%d%d%d", &year, &month, &day);
for (i=1; i<month; i++)
{
days += day_tab[i];
}
days += day;
if ((year%4==0 && year%100!=0 || year%400==0) && month>=3)
days+=1;
printf("%d年%d月%d日是这一年的第%d天!\n", year, month, day, days);
return 0;
}
【程序 5】三个数,从小到大输出。
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到 x 上,先将x 与 y进行比较,如果 x>y则将 x 与 y的值进行交换,然后再用 x与 z 进行比较,如果 x>z 则将 x 与z 的值进行交换,这样能使x 最小。
程序源代码:
#include
void main()
{
int x,y,z,t;
scanf("%d %d %d",&x,&y,&z);
if (x>y)
{
t=x;x=y;y=t;
} /*交换x,y的值*/
if(x>z)
{
t=x;x=z;z=t;
}/*交换x,z的值*/
if(y>z)
{
t=y;y=z;z=t;
}/*交换z,y的值*/
printf("small to big: %d %d %d\n",x,y,z);
}
【程序 6】用号输出字母 C 的图案。
题目:用号输出字母 C 的图案。
程序分析:可先用’*'号在纸上写出字母 C,再分行输出。
程序源代码:
#include
void main()
{
printf("********\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("********\n");
}
【程序 7】输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful!
题目:输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful!
程序分析:字符共有 256 个。不同字符,图形不一样。
程序源代码:
#include
void main()
{
char a=176,b=219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);
}
【程序 8】题目:输出 9*9 口诀。
程序分析:分行与列考虑,共 9 行 9列,i 控制行,j 控制列。
程序源代码:
#include
#define N 9
void main()
{
int i,j,t;
for(i=1;i<=N;i++)
{
for(j=i;j<=N;j++)
{
t=i*j;
printf("%d*%d=%d\t",i,j,t);
}
printf("\n");
}
}
【程序 9】题目:要求输出国际象棋棋盘。
程序分析:#设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
#i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
#i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
#棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
程序源代码:
#include
void main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
【程序 10】题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用 i 控制行,j 来控制列,j 根据 i的变化来控制输出黑方格的个数。
程序源代码:
#include
int main()
{
int i,j;
printf("\1\1\n"); //打印两个笑脸
for(i=1;i<11;i++)
{
for(j=1;j<i;j++)
printf("%c%c",23,23); //23这个数字可以是任意数,代表该数所对应的符号
printf("\n");
}
return 0;
}
【程序 11】(古典问题)兔子问题。 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21… 2.
程序源代码:
#include
//兔子问题
void main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<20;i++)
{
printf("%12d%12d",f1,f2);
if(i%2==0) printf("\n");//每行输出四个数
f1=f1+f2; //给下一次的F1赋值
f2=f1+f2; //给下一次的F2赋值
}
printf("\n");
}
【程序 12】判断 101 到 200 之间的素数。
题目:判断 101-200 之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除 2到 sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。(效率升级版)(用开方和略过偶数的方式减少运算量)
程序源代码:
#include
#include
void main()
{
int i,j;
int sum = 0;
for (i = 101; i <= 200; i+=2)
{
for (j = 2; j <= sqrt(i); j++)
{
if (i%j == 0)
{
break;
}
}
if (j>sqrt(i))
{
printf("%d\t", i);
sum++;
if(sum%5==0)
printf("\n");
}
}
printf("\nsum=%d\n", sum);
}
【程序 13】打印出所有的“水仙花数”。
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+3 的三次方。
程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。
程序源代码:
#include
void main()
{
int a,i,j,k,sum=0;
for(a=100;a<1000;a++)
{
i=a%10; //个位
j=a/10%10; //十位
k=a/100; //百位
if(i*i*i+j*j*j+k*k*k==a)
{
printf("%d\t",a);
sum++;
}
}
printf("sum=%d\n",sum);
}
【程序 14】将一个正整数分解质因数
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=233*5。
程序分析:对 n进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n>k,但 n能被 k整除,则应打印出 k的值,并用 n除以 k的商,作为新的正整数n, 重复执行第一步。 (3)如果 n不能被 k整除,则用 k+1 作为 k的值,重复执行第一步。
思路是这样的,从1到N先找出最小的质因数,如果等于本身,那么说明只有一个质因数,如果不是,那么将该质因数打印出来,并将N/该质因数作为新的N值进行运算。
程序源代码:
#include
#include
//将一个正整数分解质因数
int main()
{
int i,n;
printf("Please input an integer!\n");
scanf("%d",&n);
for(i=2;i<=n;i++)
{
while(n!=i) //若i=n,则质因数就是n本身
{
if(n%i==0) //若i是质因数,则打印出i的值,并用商给n赋新值
{
printf("%d*",i);
n=n/i;
}
else
break;//若不能被i整除,则算下一个i
}
}
printf("%d\n",n); //这里是打印最后一个质因数,也就是等于i时的那个
return 0;
}
【程序 15】利用条件运算符的嵌套完成学习成绩的转换。
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90 分的同学用 A 表示,60-89 分之间的用 B 表示, 60 分以下的用 C 表示。
程序分析:(a>b)?a:b , 若a>b,则表达式值为a,否则为b. 这是条件运算符的基本例子。
程序源代码:
#include
int main()
{
int score;
char grade;
printf("Please input your score.\n");
scanf("%d",&score);
grade=score<60?'C':(score<90?'B':'A');
printf("You are Level %c\n",grade);
return 0;
}
【程序 16】求最大公约数和最小公倍数。
题目:输入两个正整数 m和 n,求其最大公约数和最小公倍数。
程序分析:利用辗除法。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 / 105 = 2余42,所以105和42的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。
程序源代码:
#include
//最大公约数函数(利用欧几里得算法)
int cy(int x, int y)
{
if(y==0)
return x;
else
return cy(y,x%y);
}
//最小公倍数函数
int cb(int x, int y)
{
return (x*y)/cy(x, y);
}
void main()
{
int a, b; //输入两个整数
scanf("%d %d", &a, &b);
printf("cy=%d, cb=%d\n", cy(a, b), cb(a, b)); //输出最大公约数和最小公倍数
}
【程序 17】输入一行字符,分别统计出其中英文字母、、、、的个数。
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:利用 while语句,条件为输入的字符不为’\n’.
程序源代码:
#include
int main()
{
int letters=0,spaces=0,numbers=0,others=0;
char c;
printf("Please input some characters!\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letters++;
else if(c>='0'&&c<='9')
numbers++;
else if(c==' ')
spaces++;
else
others++;
}
printf("Including %d letters, %d spaces, %d numbers, and %d others!\n",letters,spaces,numbers,others);
return 0;
}
【程序 18】求 s=a+aa+aaa+aaaa+aa…a 的值
题目:求 s=a+aa+aaa+aaaa+aa…a 的值,其中a 是一个数字。例如 2+22+222+2222+22222(此时 共有 5 个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
程序源代码:
#include
int main()
{
int n,i,a,sum,t;
printf("输入 a,n \n");
scanf("%d,%d",&a,&n);
sum=0,t=a;
for(i=1;i<=n;i++)
{
sum=sum+t;
t = t*10+a;
}
printf("sum=%d\n",sum);
return 0;
}
【程序 19】完数。
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6=1+2+3.编程 找出 1000 以内的所有完数。
程序源代码:
#include
int main()
{
int i,j,sum;
for(i=1;i<1000;i++)
{
sum=0;
for(j=1;j<=i/2;j++)
{
if(i%j==0)
sum+=j;
}
if(sum==i)
printf("Perfect number is %d\n",sum);
}
return 0;
}
【程序 20】小球自由下落。
题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第 10 次落地时,共经过多少米?第 10次反弹多高?
程序分析:见下面注释
程序源代码:
#include
void main()
{
int i;
float h,hf;
h=100;
hf=h/2;
for(i=2;i<=10;i++)
{
h=h+2*hf; //第i次回弹后的高度
hf=hf/2;
}
printf("第 10 次落地时,共经过%lf米\n",h);
printf("第 10次反弹高度为%lf\n",hf);
}
【程序 21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
程序源代码:
#include
int fun(int day)
{
if(day==10)
return 1;
else
return (fun(day+1)+1)*2;
}
void main()
{
int sum;
sum=fun(1);
printf("sum=%d\n",sum);
}
【程序 22】两个乒乓球队进行比赛 题目:两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为x,y,z 三人。已抽签决定 比赛名单。有人向队员打听比赛的名单。a 说他不和x 比,c 说他不和x,z 比,请编程序找出 三队赛手的名单。
程序分析:.分析,如果没有任何规矩可言,那么a可以跟x,y,z中的任何一个比,而b,c同样是,但是规矩是有的,那就是a,b,c不能和相同的对手比赛。所以,方法就是,三层循环,然后用条件语句层层筛选,打印出来满足需求的匹配。只需要3个变量就可以了,因为a,b,c的位置是确定的,而且x,y,z可以转化为对应的整数,直接放到循环里就可以了
程序源代码:
#include
int main()
{
int i,j,k; //i,j,k分别对应a,b,c
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
if(j!=i)
for(k='x';k<'z';k++)
if(k!=i&&k!=j)
if(i!='x'&&k!='x'&&k!='z')
printf("a-%c b-%c c-%c",i,j,k);
return 0;
}
【程序 23】打印出如下图案(菱形)
题目:打印出如下图案(菱形) * *** ***** ******* ***** *** *
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for 循环,第一层控制行,第二层控制列。
程序源代码:
#include
//打印菱形
int main()
{
int i,j,k; //i控制行,j控制空格的位置,K控制*的位置
for(i=0;i<4;i++)
{
for(j=0;j<3-i;j++)
printf(" ");
for(k=3-i;k<i+4;k++)
printf("*");
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<i+1;j++)
printf(" ");
for(k=i+1;k<6-i;k++)
printf("*");
printf("\n");
}
return 0;
}
【程序 24】 求数列的前 20 项和,2/1,3/2,5/3,8/5,、、
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前 20 项之和。 程序分析:请抓住分子与分母的变化规律。
程序源代码:
#include
#define N 20
void main()
{
int i;
float sum=0,a,b,t;
a=2;
b=1;
for(i=1;i<=N;i++)
{
sum=sum+a/b;
t=a;
a=a+b;
b=t;
}
printf("sum=%lf\n",sum);
}
【程序 25】 题目:求 1+2!+3!+…+20!的和
程序分析:此程序只是把累加变成了累乘。
程序源代码:
#include
//求1到20的阶乘的和
int main()
{
int i;
double sum,t;
sum=0;
t=1;
for(i=1;i<=20;i++)
{
t*=i; //当前项的值等于前一项的值乘以i
sum+=t;
}
printf("Sum is %lf\n",sum);
return 0;
}
【程序 26】 题目:利用递归方法求 5!。
程序分析:递归公式:fn=fn_1*4!
程序源代码:
#include
#define n 5
double fun(int i)
{
if(i==1)
return 1;
else
return i*fun(i-1);
}
void main()
{
double sum;
sum=fun(n);
printf("sum=%lf\n",sum);
}
【程序 27】利用递归函数调用方式,反向打印字符。
题目:利用递归函数调用方式,将所输入的 5 个字符,以相反顺序打印出来。
程序分析:
程序源代码:
#include
void print(int);
int main()
{
printf("Input chars:\n");
print(5);
printf("\n");
return 0;
}
void print(int n)
{
char next;
if(n==1)
{
next=getchar();
printf("Output chars:\n");
putchar(next);
}
else
{
next=getchar();
print(n-1);
putchar(next);
}
}
【程序 28】 五个人问岁数。
题目:有 5个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第2 人大两岁。问第 2 个人,说比第一个人大两岁。最后 问第一个人,他说是10 岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道 第四人的岁数,依次类推,推到第一人(10 岁),再往回推。
程序源代码:
#include
#define N 10
int age(int x)
{
if(x==1) return N;
return age(x-1)+2;
}
void main()
{
printf("%d\n",age(5));
}
【程序 29】 不多于 5 位数,求是几位数。
题目:给一个不多于5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数002 班赵鑫提供)
程序源代码:
#include
int digits(int n)
{
int d=0; //包含的位数
int t; //各位上的值
while(n>0)
{
t=n%10;
printf("%d",t);
n/=10;
d++;
}
printf("\n");
return d;
}
int main()
{
int i;
printf("Please input an integer:\n");
scanf("%d",&i);
printf("It contains %d digits\n",digits(i));
return 0;
}
【程序 30】一个 5 位数,判断它是不是回文数。
题目:一个5 位数,判断它是不是回文数。即 12321是回文数,
程序分析:同 29 例
程序源代码:
#include
int huiwen(int i)
{
int t,m=0;
t=i;
do
{
m=m*10+t%10;
t=t/10;
}while(t!=0);
if(m==i)
return 1;
else
return 0;
}
void main()
{
int n;
scanf("%d",&n);
if(huiwen(n))
printf("%d 是回文数\n",n);
else
printf("%d 不是回文数\n",n);
}
【程序 31】输入星期几的第一个字母来判断一下是星期几。
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if语句判断第二个字母。
程序源代码:
#include
#include
int main()
{
char letter;
while((letter=getch())!='y') /*当所按字母为Y 时才结束*/
{
switch(letter)
{
case 'M':
printf("Monday.\n");
break;
case 'W':
printf("Wednesday.\n");
break;
case 'F':
printf("Friday.\n");
break;
case 'T':
letter=getch();
if(letter=='u')
printf("Tuesday.\n");
else if(letter=='h')
printf("Thursday.\n");
else
printf("Data error.\n");
break;
case 'S':
letter=getch();
if(letter=='a')
printf("Saturday.\n");
else if(letter=='u')
printf("Sunday.\n");
else
printf("Data error.\n");
break;
default:
printf("Data error.\n");
break;
}
}
return 0;
}
程序32~35略
【程序 36】题目:求 100 之内的素数
程序分析:
程序源代码:
#include
#include
int sushu(int i)
{
int j;
for(j=2;j<=sqrt(i);j++)
if(i%j==0)
break;
if(j>sqrt(i))
return 1;
else
return 0;
}
void main()
{
int i,sum=0;
for(i=2;i<100;i++)
{
if(sushu(i))
{
sum++;
printf("%5d",i);
}
}
printf("\n");
printf("sum=%d\n",sum);
}
【程序 37】题目:对 10 个数进行排序
1.程序分析:可以利用选择法,即从后9 个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后 8 个进行比较,并进行交换。
2.程序源代码:
#include
//简单选择排序法
int main()
{
int a[10];
int i,j,tmp,minNum,n=10;
printf("Input ten numbers.\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
minNum=i; //假设a[i]为最小值
for(j=i+1;j<n;j++)
if(a[j]<a[minNum])
minNum=j; //找到其后最小数所在的位置
if(minNum!=i) //将最小数与a[i]交换
{
tmp=a[i];
a[i]=a[minNum];
a[minNum]=tmp;
}
}
for(i=0;i<n;i++)
{
printf("%4d",a[i]);
}
return 0;
}
【程序 38】题目:求一个 3*3 矩阵对角线元素之和
1.程序分析:利用双重 for 循环控制输入二维数组,再将 a 累加后输出。
2.程序源代码:
#include
#define N 3
int main()
{
int i,j,a[N][N],sum=0;
printf("输入一组3*3矩阵数据:");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);//输入矩阵的值
for(i=0;i<N;i++)
sum+=a[i][i];//对角线求和
printf("sum=%d",sum);
}
【程序 39】数组,插入数据。
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
#include
#define N 10
int main()
{
int a[N],i,j,p;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("原数组为:\n");
for(i=0;i<N;i++)
printf("%3d",a[i]);
printf("\n输入要插入的数:\n");
scanf("%d",&p);
for(i=9;i>=0;i--)//比较选择放置的位置,从小到大
{
j=i+1;
if(p>a[i])
{
a[j]=p;
break; //结束其所在的那一重循环
}
else
a[j]=a[i];
}
printf("输出插入之后的序列:\n");
for(i=0;i<=N;i++)
printf("%d ",a[i]);
}
【程序 40】题目:将一个数组逆序输出。
1.程序分析:用第一个与最后一个交换。
2.程序源代码:
#include
#define N 6
void main()
{
int i,a[N],t;
printf("输入数组a:");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("输入的数组a为:");
for(i=0;i<N;i++)
printf("%3d",a[i]);
for(i=0;i<N/2;i++)
{
t=a[i];
a[i]=a[N-i-1];
a[N-i-1]=t;
}
printf("\n逆序后的数组a为:");
for(i=0;i<N;i++)
printf("%3d",a[i]);
}
第41~60略
【程序 61】题目:打印出杨辉三角形(要求打印出 10 行如下图)
1.程序分析: 1
1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
2.程序源代码:
#include
#define M 20
void main()
{
int i,j,n;
scanf("%d",&n);
int a[M][M];
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
if(i==j||j==1)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
程序62~65略
【程序 66】题目:输入 3 个数 a,b,c,按大小顺序输出。
1.程序分析:利用指针方法。
2.程序源代码:
#include
void swap(int *p1,int *p2) //交换两个指针所指的值,从大小到大
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
int main()
{
int a,b,c,*p1,*p2,*p3;
printf("Please input 3 numbers.\n");
scanf("%d%d%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
if(a>b)
swap(p1,p2);
if(a>c)
swap(p1,p3);
if(b>c)
swap(p2,p3);
printf("The sorted numbers are %3d %3d %3d\n",a,b,c);
return 0;
}
【程序 67】数组,大的与第一个交换,小的与最后一个交换。
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1.程序分析:谭浩强的书中答案有问题。
2.程序源代码:
#include
void shuru(int a[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void fun(int a[],int n)
{
int i,min,b=0,max,temp;
min=a[0];
max=a[0];
for(i=0;i<n;i++)
if(min>a[i])
{
min=a[i];
b=i;
}
temp=a[0];a[0]=a[b];a[b]=temp;
for(i=0;i<n;i++)
if(max<a[i])
{
max=a[i];
b=i;
}
temp=a[9];a[9]=a[b];a[b]=temp;}
void shuchu(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void main()
{
int n=10,a[10];
shuru(a,n);
shuchu(a,n);
fun(a,n);
shuchu(a,n);
}
【程序 68】数组,后移。
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 1.程序分析:
2.程序源代码:
#include
int main()
{
void move(int [20],int,int);
int number[20],n,m,i;
printf("how many numbers?");
scanf("%d",&n);
printf("input %d numbers:\n",n);
for(i=0;i<n;i++)
scanf("%d",&number[i]);
printf("how many place you want move?");
scanf("%d",&m);
move(number,n,m);
printf("Now,they are:\n");
for(i=0;i<n;i++)
printf("%d ",number[i]);
printf("\n");
return 0;
}
void move(int array[20],int n,int m)
{
int *p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--)
*p=*(p-1);
*array=array_end;
m--;
if(m>0)
move(array,n,m);
}
【程序 69】n 个人,报数,去 3,剩下几号。
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最 后留下的是原来第几号的那位。
#include
int main()
{
int i,n,a[100],count,* p,out;
printf("共有几个人围成一圈?(不超过100人)\n");
scanf("%d",&n);
for(i=0;i<n;i++) //从1到n给每个人编号
a[i]=i+1;
i=0; //i为每次循环时的计数变量
count=0; //这是按123报数时的计数变量
out=0; //记录退出人数
p=a;
while(out<n-1) //循环直到只剩下一个人没退出为止
{
if(*(p+i)!=0) //遍历遇到没退出的人(序号没被标为0),123的报数+1
count++;
if(count==3) //当报数到3的时候,把退出的人的序号标为0,123的计数重新开始,退出人数+1
{
*(p+i)=0;
count=0;
out++;
}
i++; //计数变量+1,继续遍历
if(i==n) //遍历完一遍后,有一部分人退出,接着遍历第二遍;
i=0;
}
while(*p==0) //找出唯一一个不为0的数,即最后剩下的人的序号
p++;
printf("最后剩下的人是第%d号\n",*p);
return 0;
}
【程序 70】求字符串的长度。
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
1.程序分析:
2.程序源代码:
```c
```c
#include
#define N 100
int main()
{
char str[N];
char *p;
p=str;
int len =0;
//输入一个字符串
printf("input a string:");
scanf("%s",str);
//计算其长度 字符串以\0结尾
while(*p != '\0')
{
p++;
len++;
}
//输出结果
printf("It has %d chars.\n",len);
return 0;
}
【程序 71】题目:编写 input()和 output()函数输入,输出 5 个学生的数据记录。
1.程序分析:
2.程序源代码:
#include
#define N 2
//声明一个学生结构体
struct student
{
char id[3];
char name[5];
int score;
} stu[N];
//输入学生成绩
void input(struct student stu[N])
{
int i;
for (i = 0; i < N; i++)
{
printf("Input %d th student's info.Id Name Score.\n",i+1);
scanf("%s %s %d",stu[i].id,stu[i].name,&stu[i].score); //字符数组的名称本身就是地址 不要加&符号
}
}
//输出学生成绩
void output(struct student stu[N])
{
int i;
printf("Student's info:\n");
for (i = 0; i < N; i++)
{
printf("%s %s %d ",stu[i].id,stu[i].name,stu[i].score);
printf("\n");
}
}
int main()
{
input(stu);
output(stu);
return 0;
}
程序72~75数据结构
https://www.cnblogs.com/mrbourne/p/9959463.html
【程序 76】偶数求 1/2+1/4+…+1/n
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数 1/1+1/3+…+1/n(利用指针函数)
1.程序分析:
2.程序源代码:
#include
double osh(int n) //偶数和
{
double sum=0;
int i;
for(i=2;i<=n;i+=2)
sum+=1.0/i;
return sum;
}
double jsh(int n) //奇数和
{
double sum=0;
int i;
for(i=1;i<=n;i+=2)
sum+=1.0/i;
return sum;
}
void main()
{
int n;
double (*p)(int);
printf("请输入一个整数 n:");
scanf("%d",&n);
if(n%2==0)
p= osh; //sum=osh(n);
else
p= jsh; //sum=jsh(n);
printf("\n和是: s = %lf\n",(*p)(n)); //sum
}
关于指针https://blog.csdn.net/qq_35807952/article/details/78562448
【程序 77】题目:填空练习(指向指针的指针)
1.程序分析:
2.程序源代码:
#include
void main()
{
char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
for(k=0;k<5;k++)
{
q=&s[k]; //在这里填入内容
printf("%s\n",*q);
}
}
【程序 78】题目:找到年龄最大的人,并输出。请找出程序中有什么问题。
1.程序分析:
2.程序源代码:
#include
#define N 3
struct man{
char name[20];
int age;
};
struct man person[N];
int main()
{
int i,m=0;
printf("输入名字和对应的年龄:");
for(i=0;i<N;i++)
scanf("%s %d",person[i].name,&person[i].age);
struct man *q,*p;
p=person;
for(i=0;i<4;i++)
{
if(m<p->age)
{
m=p->age;
q=p;
}
p++;
}
printf("Max is %s %d\n",q->name,q->age);
//或 printf("%s %d",(*q).name,(*q).age);
return 0;
}
【程序 79】题目:字符串排序。
1.程序分析:
2.程序源代码:
法一:
#include
#include
#define N 4
#define M 100
void main()
{
char *pStr[N],*temp,a[N][M];
int i,j;
for(i=0;i<N;i++)
{
scanf("%s",a[i]);
}
for(i=0;i<N;i++)
{
pStr[i]=a[i]; //让指针数组内容对应指向二维数组a;
}
for(i=0;i<N-1;i++)
{
for(j=i+1;j<N;j++)
{ //直接进行交换指针数组里面的值——地址;
if(strcmp(pStr[i],pStr[j])>0)
{
temp = pStr[i];
pStr[i] = pStr[j];
pStr[j] = temp;
}
}
}
printf("After sorted:\n");
for(i=0;i<N;i++)
{
printf("%s\n",pStr[i]);
}
}
法二:
#include
#include
#define N 3
#define M 100
void main()
{
char a[N][M];
int i,j,k;
for(i=0;i<N;i++)
{
scanf("%s",a[i]);
}
for(i=0;i<N;i++) //选择排序,视第i个最小
{
k=i;
for(j=i+1;j<N;j++)
if(strcmp(a[k],a[j])>0)
k=j;
if(k!=i)
{
char temp[20];
strcpy(temp, a[k]);
strcpy(a[k], a[i]);
strcpy(a[i], temp);
}
}
printf("After sorted:");
for(i=0;i<N;i++)
{
printf("%s\n",a[i]);
}
}
【程序 80】猴子分桃子。(https://www.cnblogs.com/dootoo/p/4469648.html)
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的 一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
1.程序分析://初始桃子数为sum
第一次:sum=5x1+1
第二次:4x1=5x2+1
第三次:4x2=5x3+1
第四次:4x3=5x4+1
第五次:4x4=5x5+1
第五次分配结束:剩下4x5个桃子,而x5>=1,故i=4*x5>=4 。每次向上推j=(i/4)*5+1;i=j;每次上推结束后判断j%4是否等于0,如果为0则继续上推,否则更新i,直到找到能够完成五次上推的整数i,最后可以得到最初的桃子数。
2.程序源代码:
#include
int main()
{
int i, m, j, k, count;
for (i = 4; i<10000; i += 4)
/*i为5个猴子分配桃子后最后剩余的桃子,必须为4的倍数,然后以此为基础,
向上推5次,如果刚好能够推到第五次,则此剩余的桃子数i是满足条件的,否则换一个
剩余的桃子数,直到找到符合条件的最小剩余桃子数*/
{
count = 0;
m = i;
for (k = 0; k<5; k++)
{
j = i / 4 * 5 + 1;
i = j;
if (j % 4 == 0)
count++;
else
break;
}
i = m;
if (count == 4)
{
printf("原来最少的桃子数为:%d\n", j);
break;
}
}
return 0;
}
【程序 81】809*??=800*??+9*??+1
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
1.程序分析:
2.程序源代码:
全网尚未找到合理答案
#include
#include
void main()
{
int c;
int i,j,k;
printf("start computing!!!");
for(i=10;i<100;i++)
{
for(j=100;j<1000;j++)
{
c=i*809-1-9*j;
k=c%800;
if(k==0)
{
k=c/800;
if(k>10&&k<100)
printf("809*%d=800*%d+9*%d+1\n",i,k,j);
}
}
【程序 82】题目:八进制转换为十进制
1.程序分析:
2.程序源代码:
#include
void main()
{
char *p,s[6];
int n=0;
p=s;
gets(p);
while(*(p)!='\0')
{
n=n*8+*p-'0';
p++;
}
printf("%d\n",n);
}
【程序 83】题目:求 0—7 所能组成的奇数个数。
1.程序分析:这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值,
当一个数的最后一位为奇数时,那么这个数一定为奇数,不管前面几位是什么数字。如果最后一位数为偶数,
则这个数一定为偶数。
a1-a8可以取0-7这个八个数字,首位数字不为0。
从该数为一位数到该数为8位数开始统计奇数的个数:
1.当只有一位数时也就是该数的最后一位,奇数个数为4
2.当该数为两位数时,奇数个数为47=28
3.当该数为三位数时,奇数个数为:487=224
。
。
。
8.当该数为八位数时,奇数个数为:48888887(依次为最后一位到第一位)
2.程序源代码:
#include
int main()
{
long sum = 4, s = 4;//sum的初始值为4表示,只有一位数字组成的奇数个数为4个
int j;
for (j = 2; j <= 8; j++) //j表示数字的位数
{
printf("%d位数为奇数的个数%ld\n", j-1, s);
if (j <= 2)
s *= 7;
else
s *= 8;
sum += s;
}
printf("%d位数为奇数的个数%ld\n", j-1, s);
printf("奇数的总个数为:%ld\n", sum);
return 0;
}
【程序 84】题目:一个偶数总能表示为两个素数之和。
1.程序分析:
2.程序源代码:
#include
#include
int isPrime(int n)
{
if(n < 2)
{
return 0;
}
for(int i = 2; i <= sqrt(n); i++)
{
if(n % i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i,n;
printf("请输入一个偶数:");
scanf("%d",&n);
if(n%2==0)
{
for (i = 1; i < n; i++)
{
if (isPrime(i) && isPrime(n-i))
{
break;
}
}
printf("偶数%d可以分解成%d和%d两个素数的和\n:", n, i, n-i);
}
else
printf("输入的数字不是偶数,请重新输入\n!");
return 0;
}
【程序 85】题目:判断一个素数能被几个 9 整除
1.程序分析:
2.程序源代码:
#include
int main()
{
int p, i,sum = 9;
printf("请输入一个素数:");
scanf("%d", &p);
for (i = 1; ; i++)
{
if (sum % p == 0)
{
break; // 能被i个9整除
}
else
{
sum = sum * 10 + 9; // 累加
}
}
printf("素数%d能整除%d个9组成的数%d\n", p, i, sum);
return 0;
}
【程序 86】题目:两个字符串连接程序
1.程序分析:
2.程序源代码:
#include
//#include
#define N 100
int main()
{
char str1[N],str2[N];
int i=0,n=0;
printf("请输入您的第一个字符串:\n");
gets(str1);
printf("请输入您的第二个字符串:\n");
gets(str2);
//printf("通过strcat函数串接结果为:\n%s",strcat(str1,str2));
while(str1[n]!='\0')
{
n++;
}
while(str2[i]!='\0')
{
str1[n++]=str2[i++];
}
str1[n]='\0'; //此处不可漏!!!!!
printf("\n不通过strcat函数串接结果为:\n%s\n",str1);
//puts(str1); // 也可用puts输出
return 0;
}
【程序 87】题目:回答结果(结构体变量传递)
1.程序分析: 与普通变量类似
2.程序源代码:
【程序 88】读取 7 个数,打印* 题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
1.程序分析:
2.程序源代码:
#include
void main()
{
int i,j,k;
for(i=1;i<=7;i++)
{
scanf("%d",&k);
if(k>=1&&k<=50)
for(j=1;j<=k;j++)
printf("*");
printf("\n");
}
}
【程序 89】公司加密数据
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每 位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
1.程序分析:
2.程序源代码:
#include
#define N 4
void main()
{
int n,i,a[N],t;
printf("请输入四位数字:");
scanf("%d",&n);
a[0]=n/1000;
a[1]=n%1000/100;
a[2]=n%100/10;
a[3]=n%10;
for(i=0;i<N;i++)
{
a[i]+=5;
a[i]%=10;
}
for(i=0;i<N/2;i++) //逆序
{
t=a[i];
a[i]=a[N-i-1];
a[N-i-1]=t;
}
printf("加密后的数字:");
for(i=0;i<N;i++)
printf("%d",a[i]);
printf("\n");
}
程序90~96略
【程序 97】
题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
1.程序分析:
2.程序源代码:
#include
#include
int main()
{FILE *fp;
char ch,filename[10];
printf("请输入所用的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL) // 打开输出文件并使fp指向此文件
{
printf("无法打开此文件\n"); // 如果打开时出错,就输出"打不开"的信息
exit(0); // 终止程序*/
}
ch=getchar( ); // 此语句用来接收在执行scanf语句时最后输入的回车符
printf("请输入一个准备存储到磁盘的字符串(以#结束):");
ch=getchar( ); // 接收从键盘输入的第一个字符
while(ch!='#') // 当输入'#'时结束循环
{
fputc(ch,fp); // 向磁盘文件输出一个字符
putchar(ch); // 将输出的字符显示在屏幕上
ch=getchar(); // 再接收从键盘输入的一个字符
}
fclose(fp); // 关闭文件
putchar(10); // 向屏幕输出一个换行符,换行符的ASCII代码为10
return 0;
}
补充:r表输入,w表输出
将一个磁盘文件中的信息复制到另一个磁盘文件中。 今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。
解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,然后逐个输出到file2.dat中。
#include
#include
int main( )
{
FILE *in,*out;
char ch,infile[10],outfile[10]; // 定义两个字符数组,分别存放两个文件名
printf("输入读入文件的名字:");
scanf("%s",infile); // 输入一个输入文件的名字
printf("输入输出文件的名字:");
scanf("%s",outfile); // 输入一个输出文件的名字
if((in=fopen(infile,"r"))==NULL) // 打开输入文件
{
printf("无法打开此文件\n");
exit(0);
}
if((out=fopen(outfile,"w"))==NULL) // 打开输出文件
{
printf("无法打开此文件\n");
exit(0);
}
while(!feof(in)) // 如果未遇到输入文件的结束标志
{
ch=fgetc(in); // 从输入文件读入一个字符,暂放在变量ch中
fputc(ch,out); // 将ch写到输出文件中
putchar(ch); // 将ch显示在屏幕上
}
putchar(10); // 显示完全部字符后换行
fclose(in); // 关闭输入文件
fclose(out); // 关闭输出文件
return 0;
}
【程序 98】小写到大写,并保存。
题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。 输入的字符串以!结束。
1.程序分析:
2.程序源代码:
法一:
#include
#include
#include
int main()
{
FILE *fp;
int i=0;
char str[100];
printf("请输入字符串,并且以感叹号!结束:\n");
if((fp=fopen("test.txt","w"))==NULL)//打开输出文件并使fp指向此文件
{
printf("无法打开此文件!\n");//如果打开出错就输出打不开的信息
exit(0);//退出程序
}
gets(str);
while(str[i]!='!')
{
if(str[i]>='a'&&str[i]<='z')
str[i]-=32;
fputc(str[i],fp);//向磁盘输出字符,将str所指向的字符,串输出到fp指向的文件中
i++;
}
fclose(fp);
if((fp=fopen("test.txt","r"))==NULL)
{
printf("File open falied!\n");
exit(0);
}
printf("转换后的字符串是:\n");
puts(fgets(str,strlen(str)+1,fp));//从文件读取一个字符串,长度是strlen(str),并且显示出来
fclose(fp);
return 0;
}
法二:
#include
#include
void main()
{
FILE *fp;//定义指向文件型数据的指针变量(是一个结构体变量)fp,此处的FILE需大写
char ch;
char filename[20];//文件名
printf("请输入需要创建的文件名(可以带文件后缀名)\n");
scanf("%s", filename);
if ((fp = fopen(filename, "w")) == NULL) {//fopen(文件名,使用方式),此处w为write,只写.
//应返回指向这个文件的指针,文件不存在或出错则返回NULL
printf("无法打开此文件\n");
exit(0);//exit是stdlib.h中的标准C库函数,其作用是终止程序运行
}
//因为scanf()函数读取字符串时,只读取需要读取的,这样,最后一个换行符'\n'则仍等待被读取,如果不处理掉,则会存入磁盘文件中
ch = getchar();//用于接收最后键盘上输入的回车符(换行符)'\n'
printf("请输入一个字符串(以!(英文!)结尾):\n");
while (1)
{
ch = getchar();//从键盘接受一个字符
if (ch == '!') //必须是英文!
{
break;
}
if (ch > 96 && ch < 123)
{
ch = ch - 32;
}
fputc(ch, fp);//向磁盘文件中输入一个字符
}
printf("所输入字符串已存入%s中\n", filename);
fclose(fp);//关闭文件(使指针fp不再指向这个文件,防止误用或出错)
printf("关闭文件\n");
}
【程序 99】读文件,合并文件。
题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输 出到一个新文件C中。
1.程序分析:
2.程序源代码:
#include
#include
#include
#define N 100
int main()
{
FILE *fa,*fb,*fc;
int i,j;
char str1[N],str2[N];
char tem;
if((fa=fopen("A.txt","r"))==NULL) // A.txt 文件需要存在
{
printf("error: cannot open A file!\n");
exit(0);
}
fgets(str1,N,fa);
fclose(fa);
if((fb=fopen("B.txt","r"))==NULL) // B.txt 文件需要存在
{
printf("error: cannot open B file!\n");
exit(0);
}
fgets(str2,N,fb);
fclose(fb);
strcat(str1,str2);
for(i=strlen(str1)-1;i>1;i--)
for(j=0;j<i;j++)
if(str1[j]>str1[j+1])
{
tem=str1[j];
str1[j]=str1[j+1];
str1[j+1]=tem;
}
if((fc=fopen("C.txt","w"))==NULL) // 合并为 C.txt
{
printf("error: cannot open C file!\n");
exit(0);
}
fputs(str1,fc);
fclose(fc);
return 0;
}
【程序 100】五个学生,3 门课程,保存到文件中。
题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩), 计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
#include
#include
#define N 5
struct student
{
int num;
char name[20];
float score[3];
double aver;
}stu[N];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stud","wb"))==NULL)
{
printf("cannot open the file stud!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
int main()
{
int i;
printf("请输入学生学号,姓名,3门课程成绩(以空格隔开)\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
save();
FILE *fp;
if((fp=fopen("stud","rb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
printf("the data:\n");
printf("num name score1 score2 score3 average\n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-2d%5s%7.1f%7.1f%7.1f%7.1f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp);
return 0;
}