最近学校在搞C语言的实习(其实就是做题),特分享一下我的做题思路,虽然写的有些屑,但希望能帮到同学们。
模块1(选2题)
1.输入两个正整数m和n,求其最大公约数和最小公倍数。
#include <stdio.h>
int main() {
int m, n;
scanf_s("%d,%d", &m, &n);//输入2个数
int max = m, min = n;// 给输入的2个数字按大小排序,方便后面的调用
if (m < n) {
max = n;
min = m;
}
int maximumCommonFactor;// 定义最大公约数变量
int minCommonMultiple;// 定义最小公倍数变量
if (max % min == 0) //1个数能被另1个数整除,它们的最大公因数是较小的那个数
maximumCommonFactor = min;
else {
int temp = max % min; //temp变量是大数对小的数取余后的结果
if (max % temp == 0 && min % temp == 0)//如8和10
maximumCommonFactor = temp;
else maximumCommonFactor = 1;//如17和9
}
minCommonMultiple = m * n / maximumCommonFactor;//两个数的乘积=它们最大公因数和最小公倍数的乘积
printf("%d和%d的最小公倍数是%d,最大公因数是%d", m, n, minCommonMultiple, maximumCommonFactor);//输出结果
}
2.如果一个四位数等于它的每一位数的4次方之和,则称为玫瑰花数,比如:1634=1^4+6^4+3^4+4^4,编程输出所有的玫瑰花数。
#include<stdio.h>
#include<math.h>
int main() {
int ge, shi, bai, qian; //定义四个位上的数
int number;
for (number = 1000; number < 10000; number++) { // 对四位数进行遍历
ge = number % 10;
shi = number / 10 % 10;
bai = number / 100 % 10; //获取一个四位数每位上的值
qian = number / 1000;
if (pow(qian, 4) + pow(bai, 4) + pow(shi, 4) + pow(ge, 4) == number) //判断是否是玫瑰花数
printf("%d ", number); //输出玫瑰花数
}
}
模块2(选2题)
1.数组 a[M]中有 m 个元素(m<M),数组 b[N]中有 n 个元素(n<N),且 m+n≤M,将 a、b两个数组按存放的整数升序排序并合并放入数组 a 中。
#include <stdio.h>
#define M 100000
#define N 100000
int main() {
int a[M];//定义数组a
int b[N];//定义数组b
int m, n;//定义两个数组的元素数量
input:
printf("请输入2个数组元素数量:");
scanf_s("%d,%d", &m, &n);//输入2个数组的元素数量
if (m > M || n > N || m + n > M)//防止输入的元素数量不符合题目要求
{
printf("error! please input again!");
goto input;
}
printf("现在给a数组赋值");
for (int i = 0; i < m; i++)//给a数组元素赋值
scanf_s("%d", &a[i]);
printf("现在给b数组赋值");
for (int j = 0; j < n; j++)//给b数组元素赋值
scanf_s("%d", &b[j]);
for (int j = 0, i = m; j < n; i++, j++)//将b数组的元素全部加到a数组
a[i] = b[j];
int temp = 0;//定义一个辅助变量,用于交换2个变量的值
for (int i = 0; i < m + n - 1; i++) {//给a数组元素升序冒泡排序
for (int j = 0; j < m + n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < m + n - 1; i++)//输出排序后a数组
printf("%d ", a[i]);
}
2.生成一个10元素构成的一维数组,数组元素由用户随机输入。要求:先按照升序排列并输出。再输入1个数,按照升序的规律将其插入并输出。
#include <stdio.h>
int main() {
int arr[10]; //定义一个数组存储
for (int i = 0; i < 10; i++) {
scanf_s("%d", &arr[i]); //用户依次输入10个元素存入数组
}
int temp = 0;
for (int i = 0; i < 9; i++) { //采用冒泡排序给数组元素升序排序
for (int j = 0; j < 9 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < 10; i++) //输出排完序后的原数组
printf("%d ", arr[i]);
printf("现在请再输入一个整数:");
int m;
scanf_s("%d", &m); //再输入一个整数
if(m>arr[9]){ //如果m比原来最大的数还大,直接放末尾
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
printf("%d ", m);
}
else if (m < arr[0]) { //如果m比最小的数还小,直接放开头
printf("%d ", m);
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
}
else {
for (int i = 0; i < 10; i++) {//m既不是最大也不是最小数的情况
if (m > arr[i]) //和每个元素比较,如果m相对大就不输出m
printf("%d ", arr[i]);
else {//和每个元素比较,如果m相对小就先输出m再输出数组元素
printf("%d ", m);
printf("%d ", arr[i]);
}
}
}
}
模块3(选2题)
1.读取文件中的字符串,统计从“a”到“z”26个字母各自出现的次数,并将结果放入数组中。如文件中有字符串 abcdefgabcdeabc,输出 33322110000000000000000000。
#include<stdio.h>
int a[26];
int main()
{
FILE *file;
file=fopen("D:\\a.txt","r"); //打开文件
char ch[100000],c; //定义数组存放文件字符串
fscanf(file,"%s",ch); //获取字符串
for(int i=0;ch[i];i++)a[ch[i]-'a']++;//遍历
for(int i=0;i<26;i++)printf("%d",a[i]);
fclose(file);
return 0;
}
2.读入一个文件,文件中包含字母,数字,空格,标点符号等。请统计文件中的字母,数字,空格和其他符号的数目,在屏幕上显示。
#include <stdio.h>
int main(){
int num=0,other=0,chara=0,space=0;//定义四个变量存储对应的数量
FILE *file;
file =fopen("D:\\b.txt","r");//读取文件
char ch[100000],c;
fgets(ch,100000,file);//将文件内的字符串输入到字符数组
fclose(file); //关闭文件
for(int i=0;ch[i];i++){//根据ASCII码给对应变量++
if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z'))chara++;
else if(ch[i]>='0'&&ch[i]<='9')num++;
else if(ch[i]==32)space++;
else other++;
}
printf("字母个数:%d\n",chara);//输出
printf("数字个数:%d\n",num);
printf("空格个数:%d\n",space);
printf("其他符号个数:%d\n",other);
}
模块4(选1题)
1.比较两个分数的大小。
#include <stdio.h>
int main(){
int a1,a2,b1,b2;//定义2个分数的部位
int temp1,temp2; //用于表示通分后的分子
input: printf("请输入第一个分数:\n");//获取分数
scanf("%d/%d",&a1,&a2);
printf("请输入第二个分数:\n");
scanf("%d/%d",&b1,&b2);
if(a2==0||b2==0)//检验是否输入了正确的分数
{printf("分母不能为0!请重新输入!\n");
goto input;
}
if(a2==b2){//分母一样,比分子大小
if(a1>a2)printf("%d / %d比%d / %d大",a1,a2,b1,b2);
else if(a1<a2)printf("%d / %d比%d / %d小",a1,a2,b1,b2);
else printf("2个分数一样大");
}
else if(a2!=b2){//分母不同,先通分再比较分子
temp1=a1*b2;
temp2=b1*a2;
if(temp1>temp2)printf("%d / %d比%d / %d大",a1,a2,b1,b2);
else if(temp1<temp2)printf("%d / %d比%d / %d小",a1,a2,b1,b2);
else printf("2个分数一样大");
}
}
模块5(选1题)
1.饭卡管理程序。
(1). 建立饭卡信息:添加若干人的饭卡号、姓名、金额,要求饭卡号是唯一的;
(2). 买饭:要求用户输入饭卡号、饭费,系统自动从该人的饭卡中减去饭钱,并分别显示买饭前
后的金额,如果原来饭卡中的余额不足 5 元,则不能买饭,显示“余额不足,请充值”;
(3). 充值:输入饭卡号、充值金额,充值完成后显示充值前后的金额。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define max 10
struct Card
{
char Id[100]; //饭卡号
char Name[100]; //名字
float money; //饭卡余额
} Card [max]; //定义结构体最大人数
int Count=0; //已经办理饭卡的数量
void menu(){ //菜单
printf("\n");
printf("\t\t\t\t │ 食堂饭卡管理系统 │\n");
printf("\t\t\t\t │ 1. 办卡 │\n");
printf("\t\t\t\t │ 2. 存款 │\n");
printf("\t\t\t\t │ 3. 就餐 │\n");
printf("\t\t\t\t │ 4.退出 │\n");
printf("\n");
printf("\t\t\t\t\t\t 请您选择(1-4):\t");
}
void Save()//保存信息
{
FILE *fp;//打开文件保存信息所用的指针
int i;
fp= fopen("饭卡管理数据.txt", "w");//建立一个名字为:饭卡管理数据.txt的文件
for(i=0; i<Count; i++)//for循环储存每个卡的信息
{
fprintf(fp,"%d %s %s %.2f \n",Count,Card[i].Id,Card[i].Name,Card[i].money);//储存标记 学号 姓名 饭卡余额
}
fclose(fp);//关闭文件
}
void Create_card()//办卡
{
char a;
fflush(stdin); //清空缓存区
printf("\n请输入卡号:");
gets( Card[Count].Id);//获取卡号
for(int i=0;i<Count;i++){
if(strcmp(Card[Count].Id,Card[i].Id)==0){//保证卡号唯一
printf("该用户已存在!\n");
printf("\n请重新输入卡号:");
gets( Card[Count].Id);//获取卡号
}
}
fflush(stdin);
printf("\n请输入姓名:");
gets(Card[Count].Name);//获得名字
fflush(stdin);
printf("\n请输入饭卡余额:");
scanf("%f",&Card[Count].money);//获得饭卡费
printf("\n");
fflush(stdin);
printf("建立成功!\n");
printf("轻触回车以继续!");
a=getchar();
Count++;
Save();
}
void Exit(){//退出程序
Save();
exit(0);
}
void Consume()//消费
{
int i;
float m;
char a;
char num[20];
do
{
system("cls");
fflush(stdin);
printf("\n请输入您的卡号:");
gets(num);
fflush(stdin);
printf("\n请输入价格:");
scanf("%f",&m);
if(m<=0)
printf("\n请正确输入饭费!\n");
else
{
for(i=0; i<Count; i++)
if(strcmp(num,Card[i].Id)==0) //字符串比较寻找饭卡
break;
if(i==Count)
printf("该用户不存在!\n");
else if(Card[i].money < m||Card[i].money<5) //小于5或者比要的钱少则提醒充卡费
{
printf("余额不足,请充值!!\n");
printf("该用户余额:%5.2f 元\n",Card[i].money);
}
else
{
printf("\n消费前:%5.2f\n",Card[i].money);
Card[i].money=Card[i].money-m; //实现饭卡费的扣除
printf("\n消费后:%5.2f\n",Card[i].money);
}
}
printf("\n是否继续消费?\n请输入【y或n】:\t\t");
fflush(stdin);
a=getchar();
}
while(a=='y');//do while循环
Save();
}
void Recharge_money()//充值饭卡
{
int i;
float m;
char num[10];
char a;
do
{
system("cls");
fflush(stdin);
printf("\n请输入您的卡号:");
gets(num);
fflush(stdin);
printf("\n请输入您的充值金额:");
scanf("%f",&m);
if(m<=0)
printf("输入错误!\n");
else
{
for(i=0; i<Count; i++)
if(strcmp(num,Card[i].Id)==0) //字符串比较寻找饭卡
break;
if(i==Count)
printf("该用户不存在!\n");
else
{
printf("\n原余额:%5.2f\n",Card[i].money);
Card[i].money=Card[i].money+m; //实现饭卡的充钱
printf("\n现余额:%5.2f\n",Card[i].money);
}
}
printf("\n是否继续充值?\n请输入【y或n】\t\t");
fflush(stdin);
a=getchar();
}
while (a=='y');
Save();
}
int main()
{
int Option;
int i=0;
FILE *fp;
if((fp=fopen("饭卡管理数据.txt","a+"))==NULL)// 打开文件并且让fp指向 文件
{
printf("Can not open file\n");
Save();
}
while(!feof(fp)) //读取一组数据后指针指向下一组数据,并且判断是否指向最后一行
{
fscanf(fp,"%d %s %s %f\n",&Count,&Card[i].Id,&Card[i].Name,&Card[i].money);//分别读取txt文档中的 标记,学号,姓名,余额信息并存入数组
i++;
}
fclose(fp);//关闭文件
do
{ system("cls");//清屏
menu();//打开菜单
fflush(stdin);
scanf("%d",&Option);
switch(Option)//使用switch语句对输入的功能进行呈现
{
case 1:
Create_card();
break;
case 2:
Recharge_money();
break;
case 3:
Consume();
break;
case 4:
Exit();
break;
default : printf("\n输入错误!\n");
system("pause");
}
}
while (Option!=4);
return 0;
}
希望能对同学们有所帮助🤩