南京林业大学程序设计语言实习题解

最近学校在搞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; 
}

希望能对同学们有所帮助🤩

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值