專升本計算機程式設計:C程式設計例項
【程式1】
題目:求1+2!+3!+…+20!的和
1.程式分析:此程式只是把累加變成了累乘。
2.程式原始碼:
#include "stdio.h"
#include "conio.h"
int main(){
float n,s=0,t=1;
for(n=1;n<=20;n++){
t*=n;
s+=t;
}
printf("1+2!+3!...+20!=%e\n", s);
getch();
return 0;
}
tips:
- #include"conio.h":conio.h庫檔案定義了通過控制檯進行資料輸入和資料輸出的函式,主要是一些使用者通過按鍵盤產生的對應操作,比如常用的getch()函式就是在這個標頭檔案裡定義的
- getch():getch();並非標準C中的函式,不存在C語言中。所以在使用的時候要注意程式的可移植性。國內C語言新手常常使用getch();來暫停程式且不知道此函式來源,建議使用getchar()或者使用<stdlib.h>標頭檔案中的system(“PAUSE”)呼叫系統命令暫停;(如果情況允許)代替此功能或更換一款編譯器。
【程式2】
題目:判斷101-200之間有多少個素數,並輸出所有素數。
1.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
2.程式原始碼:
#include "stdio.h"
#include "conio.h"
#include "math.h"
int main()
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m++)
{
k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{
leap=0;//不是素數
break;
}
if(leap)
{
printf("%-4d",m);
h++ ;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
getch();
}
【程式3】
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
1.程式分析:利用輾除法。
2.程式原始碼:
#include "stdio.h"
#include "conio.h"
int main()
{
int a,b,num1,num2,temp;
printf("please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1<num2)/*交換兩個數,使大數放在num1上*/
{
temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用輾除法,直到b為0為止*/
{
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
getch();
}
tips(輾轉相除法):
- 1.a除以b,如果b等於0,計算結束,a就是那個最大公約數
- 2.否則,計算a除以b的餘數,讓a等於b,而b等於那個餘數
- 3.回到第一步
【程式4】
題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。
1.程式分析:關鍵是計算出每一項的值。
2.程式原始碼:
#include "stdio.h"
#include "conio.h"
int main()
{
int a,n,count=1;
long int sn=0,tn=0;
printf("please input a and n\n");
scanf("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+...=%ld\n",sn);
getch();
}
【程式5】
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。
1.程式分析:請抓住分子與分母的變化規律。
2.程式原始碼:
#include "stdio.h"
#include "conio.h"
int main()
{
int i,t,number=20;
float sum=0,a=2,b=1;
for(i=1;i<=number;i++){
sum=sum+a/b;
t=a;
a=a+b;
b=t;
}
printf("sum is %9.6f\n", sum);
getch();
}
tips:
分子=分子加分母
分母=上一個結果的分子
【程式6】
題目:求0-7所能組成的奇數個數
1.程式分析:
2.程式原始碼:
#include<stdio.h>
#include<stdlib.h>
int main(int agrc, char*agrv[])
{
long sum = 4, s = 4;//sum的初始值為4表示,只有一位數字組成的奇數個數為4個
int j;
for (j = 2; j <= 8; 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);
system("pause");
return 0;
}
tips(演算法思想):
這個問題其實是一個排列組合的問題,設這個數為sun=a1a2a3a4a5a6a7a8,a1-a8表示這個數的某位的數值,
當一個數的最後一位為奇數時,那麼這個數一定為奇數,不管前面幾位是什麼數字。如果最後一位數為偶數,
則這個數一定為偶數。
a1-a8可以取0-7這個八個數字,首位數字不為0。
從該數為一位數到該數為8位數開始統計奇數的個數:
1.當只有一位數時也就是該數的最後一位,奇數個數為4
2.當該數為兩位數時,奇數個數為47=28
3.當該數為三位數時,奇數個數為:487=224
。
。
。
8.當該數為八位數時,奇數個數為:48888887(依次為最後一位到第一位)
摘自部落格:https://blog.csdn.net/dodoto/article/details/45698609
【程式7】
題目:有五個學生,每個學生有3門課的成績,從鍵盤輸入以上資料(包括學生號,姓名,三門課成績),計算出平均成績,況原有的資料和計算出的平均分數存放在磁碟檔案"stud"中。
1.程式分析:
2.程式原始碼:
#include "stdio.h"
struct student{
char num[6];
char name[8];
int score[3];
float avr;
} stu[5];
int main(){
int i,j,sum;
FILE *fp;
/*input*/
for(i=0;i<5;i++){
printf("\n please input No. %d score:\n",i);
printf("stuNo:");
scanf("%s",stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++){
printf("score %d.",j+1);
scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].avr=sum/3.0;
}
fp=fopen("stud","d");
for(i=0;i<5;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1){
printf("file write error\n");
}
fclose(fp);
}
【程式8】
題目:求100之內的素數
1.程式分析:
2.程式原始碼:
#include "stdio.h"
#include "math.h"
#include "conio.h"
#define N 101
int main()
{
int i,j,line,a[N];
for(i=2;i<N;i++) a[i]=i;
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
}
printf("\n");
for(i=2,line=0;i<N;i++)
{
if(a[i]!=0)
{
printf("%5d",a[i]);
line++;
}
if(line==10)
{
printf("\n");
line=0;
}
}
getch();
return 0;
}