高级语言程序设计第五次作业

高级语言程序设计第五次作业


作业内容

程序设计

  • 设计一个getchar和putchar联合使用的程序,使得程序遇到空格符时结束。
#include <stdio.h>
int main() {
    char a;
    while((a=getchar())!=' ') {
        putchar(a);
    }   
    return 0;
}

屏幕截图 2025-11-15 154848

  • 建立一个in.txt和out.txt,分别使用这两个文件进行重定位代替键盘输入和屏幕输出in.txt存放一些字符小写字符,大写字符,数字字符,程序将这些小写字符转换成大写字符,然后全部输出到out.txt。
#include <stdio.h>

int main() {
    char a;
    while((a=getchar())!=EOF) {
    	if(a>='a'&&a<='z')
        putchar(a-32);
        else{putchar(a);
		}
    }
    
    return 0;
}

重定位输入输出
屏幕截图 2025-11-15 163745
in.txt做输入
屏幕截图 2025-11-15 163720
out.txt做输出
屏幕截图 2025-11-15 163730

  • 从键盘上输入数据并进行加、减、乘、除四则运算(以“a运算b”的形式输入),判断输入的数据是否可以进行计算,若能计算,则输出计算结果,保留小数点后2位,否则显示“wrong input”。另外,碰到除数为0是能提示“division by zero”。形式参考第八章PPT18页。
#include <stdio.h>
int main() {
	float x1,x2; 
    char a;
    while(scanf("%f %c %f",&x1,&a,&x2)==3){
    if(a=='+'){
   	printf("%.2f\n",x1+x2);
   }
   else if(a=='-'){
   	printf("%.2f\n",x1-x2);
   }
   else if(a=='*'){
   	printf("%.2f\n",x1*x2);
   }
   else if(a=='/'&&x2!=0){
   	printf("%.2f\n",x1/x2);
   }
   else if(a=='/'&&x2==0){
   	printf("division by zero\n");
   }
   else{
   	printf("wrong input\n");
   }
   printf("\n");
   
	}
    return 0;
}

屏幕截图 2025-11-16 151838

  • 混合读入字符、数值,形式参考第八章PPT19页。
    问题描述:
    先读入一个字符,再读入一个整数,最后又读入一个字符;然后分别输出它们
    输入格式:n个空格和/或<回车>,一个字符,m个空格和/或<回车>,一个整数,k个空格和/或<回车>,一个字符
    输出格式:字符整数字符
#include <stdio.h>

int main() {
	char x1,x2; 
    int a;
   scanf("\n%c \n%d \n%c",&x1,&a,&x2);
   printf("%c%d%c",x1,a,x2);
 
    return 0;
}

屏幕截图 2025-11-15 171936

  • 设计一个多源代码文件程序的编译。例如,first.c源代码文件包含主函数和一些头文件(second.h),second.c源代码文件是一些自定义的函数功能实现,second.h文件是一些常量声明和second.c中自定义函数的函数原型声明。
//second.h 头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define basepay 10.00 
#define overtime 40
#define overrate 1.5
#define taxes1 300
#define taxesrate1 0.15
#define taxes2 150
#define taxesrate2 0.2
#define taxesrate3 0.25

double wage(int time);  //计算工资
double taxes(double wage);  //计算税金
double income(double wage, double taxes);  //计算净收入

//second.cpp 函数功能实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "second.h"
double wage(int time) {
	double wage;
	if (time > overtime) {
		wage = ((time - overtime) * overrate + overtime) * basepay;
	}
	else {
		wage = time * basepay;
	}
	return wage;
}

double taxes(double wage) {
	double taxes;
	if (wage <= taxes1) {
		taxes = wage * taxesrate1;
	}
	else if (wage <= taxes2 + taxes1) {
		taxes = taxes1 * taxesrate1 + (wage - taxes1) * taxesrate2;
	}
	else {
		taxes = taxes1 * taxesrate1 + taxes2 * taxesrate2 + (wage - taxes2) * taxesrate3;
	}
	return taxes;
}
double income(double wage, double taxes) {
	double income;
	income = wage - taxes;
	return income;
}
//first.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "second.h"
int main(void)
{
    int time;
    double w, t, in;
    printf("请输入一周工作的小时数:");
    scanf("%d", &time);
    w = wage(time);
    t = taxes(w);
    in = income(w, t);
    printf("工资总额:%f美元\n", w);
    printf("税金:%f美元\n", t);
    printf("净收入:%f美元\n", in);
    return 0;
}

屏幕截图 2025-11-16 001713

  • 编写一个程序,在该程序中输出主函数中定义变量的地址,以及函数中定义的同名变量的地址。
#include <stdio.h>
void print(int n){
	printf("&n=%p\n",&n);    
}
int main() {
    int n=27;
    printf("&n=%p\n",&n);   //主函数中定义变量的地址
    print(n);                //函数中定义的同名变量的地址
    return 0;
}

屏幕截图 2025-11-15 232451

编写并运行书本第8章8.11编程练习题目中的第3~7题。

  • 设计一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母个数。假设大小写字母数是连续的。或者使用ctype.h库中合适的分类函数更方便
#include <stdio.h>
#include <ctype.h>
int main() {
	char ch;
	int lower=0,upper=0;
	
	printf("请输入字符流:\n"); 
	
    while((ch=getchar()) != EOF){
    	if(islower(ch)){               //判断小写字母
		    lower++;
		}
		else if(isupper(ch)){          //判断大写字母
			upper++;
		}
	} 
	printf("大写字母数:%d\n",upper);
	printf("小写字母数:%d\n",lower);
    return 0;
}

屏幕截图 2025-11-15 220708

  • 设计一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。
#include <stdio.h>
#include <ctype.h>
int main() {
	char ch;
	int num=0,n=0;
	
	printf("请输入字符流:\n"); 
	
    while((ch=getchar()) != EOF){
    	if(isalpha(ch)){
		    n++;            //计数总字母数
		}
		else if(isspace(ch)){           
			num++;           //计数总单词数
		}
	} 
	
	printf("单词平均字母数:%d\n",n/num);
    return 0;
}

屏幕截图 2025-11-15 221447

  • 修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序最初猜50,询问用户是大了,小了还是猜对了。如果小了,那么下一次的猜测值应该是50和100中值,75;猜大了,同理。使用二分查找,很快就会猜到真确答案。
#include <stdio.h>

int main() {
	char re;
	int guess=50,upper=100,lower=1,result;
	printf("Pick an integer from 1 to 100 .I will try  to guess it.\n");
	scanf("%d",&result);
	printf("Respond with a y if my guess is right or b if my guess is bigger than it or l if my guess is litter.\n");
	printf("is you number %d?\n",guess);
    while((re=getchar())!='y'){
    	if(re=='b'){
    	   	upper=guess;            //猜大了,改变上限为guess
    	   	guess=(upper+lower)/2;        //计算中值
		}
		else if(re=='l'){
			lower=guess;               //猜小了,改变下限为guess
			guess=(upper+lower)/2;
		}
		printf("is you number %d?\n",guess);
	} 
    return 0;
}

屏幕截图 2025-11-15 223050

  • 修改程序清单8.8中的get_first()函数,让该函数返回读取的第一个非空白字符,并在一个简单程序中测试
#include <stdio.h>
char get_first(){
	char ch;
	while((ch=getchar())==' '){
	}
	return ch;
}

int main() {
    char ch=get_first();
    putchar(ch);
    return 0;
}

屏幕截图 2025-11-15 231211

  • 修改第七章的练习八,用字符替代数字标记菜单的选项。用q代替5作为结束输入的标志
#include <stdio.h>
#define RATE_1 8.75
#define RATE_2 9.33
#define RATE_3 10.00
#define RATE_4 11.20

#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
#define TAX_BREAK_1 300.0
#define TAX_BREAK_2 450.0
#define OVERTIME_HOURS 40
#define OVERTIME_RATE 1.5

void menu(void);          
double calculate_wage(double hours, double pay_rate);
double calculate_taxes(double gross);

int main(void)
{
    char choice;
    double hours;
    double rate;
    double wage, taxes, income;
    
    while (1)
    {
        menu();
        
        scanf("%c", &choice) ; 
        
        switch (choice)
        {
            case 'a':
                rate = RATE_1;
                break;
            case 'b':
                rate = RATE_2;
                break;
            case 'c':
                rate = RATE_3;
                break;
            case 'd':
                rate = RATE_4;
                break;
            case 'q':
                printf("程序结束。\n");
                return 0;
            default:
                printf("请输入a-d之间或q的有效选项。\n");
                continue;
        }
        
        printf("请输入工作小时数: ");
        if (scanf("%lf", &hours) != 1 || hours < 0)
        {
            printf("无效的工作小时数。\n");
            while (getchar() != '\n')
                continue;
            continue;
        }
        
        // 计算工资总额
        wage = calculate_wage(hours, rate);
        
        // 计算税金
        taxes = calculate_taxes(wage);
        
        // 计算净收入
        income = wage - taxes;
        
        // 输出结果
        printf("\n工资总额: $%.2f\n", wage);
        printf("税金: $%.2f\n", taxes);
        printf("净收入: $%.2f\n\n", income);
    }
    
    return 0;
}

void menu(void)
{
    printf("****************************************\n");
    printf("请选择对应的工资等级或操作:\n");
    printf("a) $%.2f/小时\tb) $%.2f/小时\n", RATE_1, RATE_2);
    printf("c) $%.2f/小时\td) $%.2f/小时\n", RATE_3, RATE_4);
    printf("q) 退出\n");
    printf("****************************************\n");
    printf("请选择(a-d or q): ");
}

double calculate_wage(double hours, double rate)
{
    if (hours > OVERTIME_HOURS)
    {
        return OVERTIME_HOURS * rate + (hours - OVERTIME_HOURS) * rate * OVERTIME_RATE;
    }
    else
    {
        return hours * rate;
    }
}

double calculate_taxes(double gross)
{
    double taxes = 0.0;
    
    if (gross <= TAX_BREAK_1){
        taxes = gross * TAX_RATE_1;
    }
    else if (gross <= TAX_BREAK_2){
	
        taxes = TAX_BREAK_1 * TAX_RATE_1 + (gross - TAX_BREAK_1) * TAX_RATE_2;
    }
    else{
        taxes = TAX_BREAK_1 * TAX_RATE_1 + (TAX_BREAK_2 - TAX_BREAK_1) * TAX_RATE_2 + (gross - TAX_BREAK_2) * TAX_RATE_3;
    }
    return taxes;
}



屏幕截图 2025-11-16 005237

编写并运行书本第9章9.11编程练习题目中的第1~4,8,9,11题。

  • 设计一个函数min(x,y),返回两个double类型值的较小值
#include <stdio.h>
double min(double x,double y){
	if(x<y){return x;
	}
	return y;
}
int main() {
	double x=1.20,y=2.10;

   printf("%f",min(x,y));
 
    return 0;
}

屏幕截图 2025-11-15 185715

  • 设计一个函数chline(ch,i,j),打印指定的字符j行i列
#include <stdio.h>
void chline(char ch,int i,int j){
	for(int m=0;m<j;m++){         
		for(int n=0;n<i;n++){
			printf("%c",ch);
		}
		printf("\n");
	}	
}
int main() {
	char ch;
	int i,j;
	printf("请输入要输出的字符和行列数:"); 
	scanf("%c %d %d",&ch,&j,&i) ;
	chline(ch,i,j);
    return 0;
}

屏幕截图 2025-11-15 190504

  • 编写一个函数,接受三个参数:一个字符,两个整数。字符参数是待打印的字符,第一个整数指定一行中打印字符次数,第二个字符指定打印字符行数
#include <stdio.h>
void chline(char ch,int i,int j){
	for(int m=0;m<j;m++){
		for(int n=0;n<i;n++){
			printf("%c",ch);
		}
		printf("\n");
	}
	
	
}
int main() {
	char ch;
	int i,j;
	printf("请输入要输出的字符和行列数:"); 
	scanf("%c %d %d",&ch,&j,&i) ;
	chline(ch,i,j);
 
    return 0;
}

屏幕截图 2025-11-15 190806

  • 两数的调和平均数:先得到这两数的倒数,然后计算着两个倒数的平均值,最后计算结果的倒数。编写一个函数,接受两个double类型的参数,返回调和平均数
double ave(double x1,double x2){
	double x3=1/x1;
	double x4=1/x2;
	return 1/((x3+x4)/2);
	
}
int main() {
	double x1=1.0,x2=2.0;
	printf("x1=%f \nx2=%f \n调和平均数为:%f",x1,x2,ave(x1,x2)); 
	
 
    return 0;
}

屏幕截图 2025-11-15 191350

  • 改进第六章程序清单6.20中power()函数,使其能正确计算负幂,另外函数要处理0的任何次幂都是0,任何数的0次幂都是1,使用循环测试该函数
#include <stdio.h>
double power(double n,int p){
	int	p1=p;
	if(n==0){return 0;      //0的任何次幂都是0
	}
	else if(p==0){return 1;   //任何数的0次幂都是1
	}
	else if(p<0){           
	p1=-p;
	}
	double pow=1;
	for(int i=1;i<=p1;i++){       //先计算n^|P|,再判断p<0时,返回1/pow;p>0,返回,pow;
		pow*=n;
	}
    if(p<0){return (1/pow);       
	}
	return pow;
}
int main() {
	double n;
	int p;
	printf("请输入底数和指数:"); 
	while (scanf("%lf%d",&n,&p) == 2){
		printf("%lf^%d=%lf\n",n,p,power(n,p));
		printf("请再次输入(输入q时停止):") ;
	}
    return 0;
}

屏幕截图 2025-11-15 193531

  • 使用递归函数重新编写上题
#include <stdio.h>
double power(double n,int p){
	if(n==0){return 0;
	}
	else if(p==0){return 1;
	}
	else if(p==1){
		return n;
	}
	else if(p==-1){return 1/n;
	}
	if(p<-1){
		return power(n,p+1)/n;
	}
	else if(p>1){
		return power(n,p-1)*n;
	}
	
}
int main() {
	double n;
	int p;
	printf("请输入底数和指数:"); 
    while (scanf("%lf%d",&n,&p) == 2){
		printf("%lf^%d=%lf\n",n,p,power(n,p));
		printf("请再次输入(输入q时停止):") ;
	}
	
    return 0;
}

屏幕截图 2025-11-15 214255

  • 编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契数
#include <stdio.h>
int Fibonacci(int n){
	if(n<=2){
		return 1;
	}
	return Fibonacci(n-1)+Fibonacci(n-2);
	
}
int main() {
	int n;
	printf("请输入求n个斐波那契数:"); 
	scanf("%d",&n);
	int i=1;
    while(i<=n){
    	printf("%d ",Fibonacci(i++));
	} 
	
    return 0;
}

屏幕截图 2025-11-15 215346

posted @ 2025-11-16 15:34  叶银珍  阅读(9)  评论(0)    收藏  举报