目录
模块一
[题目]求素数。
编写一个函数,将大于整数 m 且紧靠 m 的 k 个素数存入数组中,在命令行输入 m 和 k。如输入 17 和 5,输出 19,23,29,31,37。
[程序设计分析]
设计一个判断素数的函数,并在取大于m的k个素数的函数中调用判断素数的函数即可。
[代码]
#include <stdio.h>
#include <math.h>
const int N=10000;
int a[N];
int Prime(int n) //判断n是否为素数
{
int i = 0;
for(i=2;i<=sqrt(n);i++) //遍历从2到根号n
{
if(n%i == 0)
break;
}
if(i>sqrt(n)) //n为素数,返回1
return 1;
return 0; //n不为素数,返回0
}
void Prime_k(int m,int k) //将大于整数 m 且紧靠 m 的 k 个素数存入数组
{
int i=0,j=m+1;
for(i=0,j=m+1;i<k;j++)
{
if(Prime(j)==1) //j为素数
{
a[i] = j;
i++;
}
}
}
int main()
{
int m,k;
printf("请输入整数m和k:\n");
scanf("%d %d",&m,&k);
Prime_k(m,k); //调用函数
for(int i=0;i<k;i++)
{
printf("%d ",a[i]); //输出a[]
}
return 0;
}
[试运行]
[题目]求最大公约数和最小公倍数。
输入两个正整数m,n,求其最大公约数和最小公倍数。
[程序设计分析]
【辗转相除法】:
使k为m除以n的余数,如果m能被n整除,则k值为0,n为这两个数的最大公约数,否则,使n代替m,k代替n,重复以上过程,直到k值为0,此时n为最大公约数。
最小公倍数=(m*n)/最大公约数。
[代码]
#include <stdio.h>
int main()
{
int m,n,gb,gy,k,a,b;
printf("请输入两个正整数:");
scanf("%d,%d",&m,&n);
k=m%n; //较小数%较大数=较小数
a=m;
b=n;
for( ;k!=0; )
{
m=n;
n=k;
k=m%n;
}
gy=n;
gb=(a*b)/gy;
printf("最大公约数为:%d\n",gy);
printf("最小公倍数为:%d\n",gb);
return 0;
}
[试运行]
[题目]玫瑰花数。
如果一个四位数等于它的每一位数的4次方之和,则称为玫瑰花数,比如:1634=1^4+6^4+3^4+4^4,编程输出所有的玫瑰花数。
[程序设计分析]
利用for循环遍历所有的四位数,用玫瑰花数的特点作为条件,满足则输出该四位数。
[代码]
#include <stdio.h>
int main()
{
int n,a,b,c,d;
for(n=1000;n<=9999;n++) //遍历所有的四位数
{
a=n%10; //n的个位
b=n/10%10; //n的十位
c=n/100%10; //n的百位
d=n/1000%10; //n的千位
if(n==a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d) //判断n是否为玫瑰花数
printf("%d ",n); //输出玫瑰花数
}
return 0;
}
[试运行]
模块二
[题目]编写合并整数数组的函数。
数组a[M]中有m个元素(m<M),数组b[N]中有n个元素(n<N),且m+n<=M,将a、b两个数组按存放的整数升序排序并合并放入数组a中。
[程序设计分析]
设计一个合并两个数组的函数和一个进行升序的冒泡排序的函数。
[代码]
#include <stdio.h>
const int N=1000,M=1000;
void Merge(int a[],int b[],int n,int m)
{
int i,j;
for(i=n,j=0;j<m;j++,i++) //将数组a[],b[]合并到a[]中
a[i]=b[j];
a[i]='\0';
}
void Sort(int a[],int n,int m)//将a[],b[]数组合并,并升序排序
{
int i,j,t;
for(i=0;i<n+m-1;i++) //将数组a[]中的数升序排序。 第一层循环遍历数组中所有数
{
for(j=0;j<n+m-i-1;j++)//第二层循环遍历i前的数
{
if(a[j]>a[j+1])//若 a[j]>a[j+1],交换两个数
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int a[N],b[M];
int n,m,i;
printf("请输入两数组中元素的个数:");
scanf("%d%d",&n,&m); //输入两数组的元素个数
printf("第一个数组为:");
for(i=0;i<n;i++)
scanf("%d",&a[i]); //输入数组a[]
printf("第二个数组为:");
for(i=0;i<m;i++)
scanf("%d",&b[i]); //输入数组b[]
Merge(a,b,n,m);
Sort(a,n,m); //调用函数fun
for(i=0;i<n+m;i++)
printf("%d ",a[i]);//升序输出合并后的数组
return 0;
}
[试运行]
[题目]数组插入问题。
生成一个10元素构成的一维数组,数组元素由用户随机输入。要求:先按照升序排列并输出。再输入一个数,按照升序的规律将其插入并输出。
[程序设计分析]
依旧可以设计一个升序的冒泡排序函数使数组完成升序排序。
[代码]
#include <stdio.h>
void Sort(int a[],int n) //冒泡升序排序
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int a[11];
int i,k;
printf("请输入10个数:");
for(i=0;i<10;i++)
scanf("%d",&a[i]); //输入数组a[]
Sort(a,10); //将数组a[]中的数升序排序
for(i=0;i<10;i++)
printf("%d ",a[i]); //输出数组a[]
printf("\n请再输入一个数:");
scanf("%d",&k); //输入新的数
a[10]=k; //向数组中添加新的数
Sort(a,11); //将新数组中的数升序排序
printf("新数组为:");
for(i=0;i<11;i++)
printf("%d ",a[i]); //输出新数组
return 0;
}
[试运行]
模块三
[题目]统计频率。
读入一个文件,文件中包含字母,数字,空格,标点符号等。请统计文件中的字母,数字,空格和其它符号的数目,在屏幕上显示。
[程序设计分析]
读取文件中的所有字符,并用不同变量统计不同字符的个数。
[代码]
#include <stdio.h>
int main()
{
int a=0,b=0,c=0,d=0,i,j;
FILE* fp=fopen("C:\\Users\\leaves\\Desktop\\\test.txt","r");//打开文件
if(fp==NULL)
printf("打开文件失败");
char s[200];
while (fgets(s,200,fp))//读取文件,并存入数组s[]中
{
printf("%s",s);//输出文件
}
fclose(fp);//关闭文件
for(i=0;s[i]!='\0';i++)
{
j=s[i]-'\0';//将文本中的字符转为ASCII码
if((j>=65 && j<=90) || (j>=97 && j<=122))
a++; //统计字母个数
else if(j>=48 && j<=57)
b++; //统计数字个数
else if(j==32)
c++; //统计空格个数
else
d++; //统计其它符号个数
}
printf("文件中字母个数为:%d\n",a);
printf("文件中数字个数为:%d\n",b);
printf("文件中空格个数为:%d\n",c);
printf("文件中其它符号个数为:%d",d);
return 0;
}
[试运行]
[题目]统计字母个数。
读取文件中的字符串,统计从“a”到“z”26个字母各自出现的次数,并将结果放入数组中。如文件中有字符串abcdefgabcdeabc,输出33322110000000000000000000。
[程序设计分析]
读取文件,使用数组下标和字母ASCII码值之间的关系,统计次数。
[代码]
#include <stdio.h>
int main()
{
int i;
int a[26]; //定义统计数组
for(i=0;i<26;i++)
a[i]=0;
FILE* fp=fopen("C:\\Users\\leaves\\Desktop\\test.txt","r"); //打开文件
if(fp==NULL)
printf("打开文件失败");
char s[200];
while (fgets(s,200,fp))//读取文件,并存入数组s[]中
{
printf("%s",s);//输出文件
}
printf("\n");
fclose(fp); //关闭文件
for(i=0;s[i]!='\0';i++) //遍历文件并统计每个字符出现次数
a[s[i]-'a']++;
for(i=0;i<26;i++)
printf("%d",a[i]); //输出数组a[]
return 0;
}
[试运行]
模块四
[题目]分数比较问题。
比较两个分数的大小。
[程序设计分析]
通过十字相乘,将两个分数的大小比较转化为乘积的比较。
[代码]
#include <stdio.h>
int main()
{
int a,b,c,d;
printf("请输入第一个分数的分子和分母:");
scanf("%d %d",&a,&b); //输入第一个分数
printf("请输入第二个分数的分子和分母:");
scanf("%d %d",&c,&d); //输入第二个分数
if(a*d > c*b) //十字相乘法比较分数大小
printf("%d/%d > %d/%d",a,b,c,d); //大于
else if(a*d == c*b)
printf("%d/%d = %d/%d",a,b,c,d); //等于
else
printf("%d/%d < %d/%d",a,b,c,d); //小于
return 0;
}
[试运行]
模块五
[题目]饭卡管理程序。
(1). 建立饭卡信息:添加若干人的饭卡号、姓名、金额,要求饭卡号是唯一的;
(2). 买饭:要求用户输入饭卡号、饭费,系统自动从该人的饭卡中减去饭钱,并分别显示买饭前 后的金额,如果原来饭卡中的余额不足 5 元,则不能买饭,显示“余额不足,请充值”;
(3). 充值:输入饭卡号、充值金额,充值完成后显示充值前后的金额。
[程序设计分析]
可以通过链表储存录入饭卡号、姓名和金额等信息,此外还需要买饭和充值两个函数来实现功能服务。两个函数都需要查找功能,通过操作指针s和for循环遍历链表中所有的饭卡号,来查找需要进行操作的节点,进而进行买饭或者充值操作。整个链表框架写完后,还需要补充一些饭卡号唯一、余额不足的提醒等功能。
[代码] 见链接