当前位置: 首页 > article >正文

59、C语言程序设计谭浩强第七章

1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。

#include <stdio.h>

int s1(int n,int m ){//最大公约数
    int a=n*m;
    int b;
    while(b=n%m){
        n=m;
        m=b;
    }
    return m;
}
int s2(int n,int m){//最小公倍数
    int a=n*m;
    int b;
    while(b=n%m){
        n=m;
        m=b;
    }
    return a/m;
}
int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    if(n<m){
        int temp=n;
        n=m;
        m=temp;
    }
    printf("最大公约数为%d\n",s1(n,m));
    printf("最小公倍数为%d\n",s2(n,m));
    return 0;
}

输入输出:

6 9
最大公约数为3
最小公倍数为18

2、求方程ax^2+bx+c=0的根,用3个函数分别求当: b^2-4ac大于0、等于0、小于0的根并输出结果。从主函数输如a,b,c的值。

#include <stdio.h>
#include <math.h>
double x1,x2;
void greater_than_zero(double a,double b,double c){
    double m = sqrt(b*b-4*a*c);
    x1 = (-b+m)/(2*a);
    x2 = (-b-m)/(2*a);
}
void equal_to_zero(double a,double b,double c){
    x1 = x2 = (-b)/(2*a);
}
void small_to_zero(double a,double b,double c){
    double m = sqrt(4*a*c-b*b);
    x1 = (-b)/(2*a);
    x2 = m/(2*a);
}
int main(){
    double a,b,c;
    scanf("%lf %lf %lf",&a,&b,&c);
    double m = b*b-4*a*c;
    if(m>0){
        greater_than_zero(a,b,c);
        printf("根大于0:x1=%lf,x2=%lf",x1,x2);
    }else if(m==0){
        equal_to_zero(a,b,c);
        printf("根等于0:x1=%lf,x2=%lf",x1,x2);

    }else{
        small_to_zero(a,b,c);
        printf("根小于0:x1=%lf+%lfi,x2=%lf-%lfi",x1,x2,x1,x2);
    }
    return 0;
}

样例输入输出:

3 4 1
根大于0:x1=-0.333333,x2=-1.000000
2 4 2
根等于0:x1=-1.000000,x2=-1.000000
3 4 3
根小于0:x1=-0.666667+0.745356i,x2=-0.666667-0.745356i

3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息

#include <stdio.h>
#include <stdbool.h>

bool issushu(int n){
    int i;
    for(i=2;i<n;i++){
        if(n%i==0)
            return false;
    }
    return true;
}
int main(){
    int n;
    scanf("%d",&n);
    if(issushu(n)==true){
        printf("YES");
    }else{
        printf("NO");
    }
    return 0;
}

4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换

#include <stdio.h>

int main(){
    int a[4][4],b[4][4];
    int i,j;
    printf("请输入二维数组:\n");
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            b[j][i]=a[i][j];
        }
    }
    printf("转置后的二维数组:\n");
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

样例输入输出:

请输入二维数组:
1 2 3
4 5 6
7 8 9
转置后的二维数组:
1 4 7
2 5 8
3 6 9

5、写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串

#include <stdio.h>
#include <string.h>

void Reverse(char a[]){
    int len = strlen(a);
    int i;
    char temp;
    for(i=0;i<len/2;i++){
        temp=a[i];
        a[i]=a[len-i-1];
        a[len-i-1]=temp;
    }
}
int main(){
    char s[101];
    gets(s);
    Reverse(s);
    puts(s);
    return 0;
}

样例输入输出:

abcxyz
zyxcba

6、写一个函数,将两个字符串连接

#include <stdio.h>

void ConcatStr(char string1[],char string2[],char string[]){
    int i,j;
    for(i=0;string1[i]!='\0';i++){
        string[i]=string1[i];
    }
    for(j=0;string2[j]!='\0';j++){
        string[i+j] = string2[j];
    }
    string[i+j]='\0';

}
int main(){
  char s1[100]={0},s2[100]={0},s[200]={0};
  gets(s1);
  gets(s2);
  ConcatStr(s1,s2,s);
  puts(s);
    return 0;
}

样例输入输出:

welcome
China
welcomeChina

7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出

#include <stdio.h>

void cpy(char s[],char c[]){
    int i,j;
    for(i=0,j=0;s[i]!='\0';i++){
        if(s[i]=='a'||s[i]=='A'||s[i]=='i'||
           s[i]=='I'||s[i]=='e'||s[i]=='E'||
           s[i]=='o'||s[i]=='O'||s[i]=='u'||
           s[i]=='U'){
            c[j++]=s[i];
           }
    }
    c[j]='\0';
}
int main(){
    char str[80],c[80];
    gets(str);
    cpy(str,c);
    puts(c);
    return 0;
}

样例输入输出:

hello jing
eoi

8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”

#include <stdio.h>
void OutString (char str[]){
    int i = 0;
    while(str[i]!='\0'){
        printf("%c",str[i]);
        if(str[i+1]=='\0')
            break;
        printf("%c",' ');
        i++;
    }
    printf("\n");
}
int main(){
    char str[5]={0};
    gets(str);
    OutString(str);
    return 0;
}

 9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果

#include <stdio.h>
#include <math.h>
#include <ctype.h>
int letter,digit,space,others;
void CountChar(char str[]){
        int i;
        for(i=0;str[i]!='\0';i++){
               if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
                       letter++;
               }else if(str[i]>='0'&&str[i]<='9'){
                       digit++;
               }else if(str[i]==' '){
                       space++;
               }else {
                       others++;
               }
        }
}
int main(){
        char str[101];
        gets(str);
        CountChar(str);
        printf("字母的个数:%d\n",letter);
        printf("数字的个数为:%d\n",digit);
        printf("空格的个数:%d\n",space);
        printf("其他字符的个数:%d",others);
        return 0;
}

10、写一个函数,输人一行字符,将此字符串中最长的单词输出。

#include <stdio.h>
#include <string.h>

void Std(char s[]){
    int a=0,b;//第一个单词第一个字符的下标为a,最后一个为b;单词长度为b-a+1

    int start=0,end=0;//存储最长单词的首尾字符的下标
    int maxlen=0;//来存储最长单词默认为0
    int len = strlen(s);

    for(int i=0;i<len+1;i++){
        if(s[i]==' '||s[i]=='\0'){
            b=i-1;
            if((b-a+1)>maxlen){
                maxlen=b-a+1;
                start=a;
                end=b;
            }
            a=i+1;
        }
    }
    for(int i=start;i<=end;i++){
        printf("%c",s[i]);
    }
    printf("\n");
}
int main(){
    char s[101];
    gets(s);
    Std(s);
    return 0;
}

11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。

#include <stdio.h>
#include <string.h>
void BubbleSort(char str[]){
        int i,j;
        char temp;
        int len=strlen(str);
        for(i=0;i<len-1;i++){
                for(j=i+1;j<len;j++){
                        if(str[i]>str[j]){
                                temp=str[i];
                                str[i]=str[j];
                                str[j]=temp;
                        }
                }
        }
}
int main(){
        char str[101];
        gets(str);
        BubbleSort(str);
        puts(str);
        return 0;
}

12、用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。

 

#include<stdio.h>
#include<math.h>

float solut(int a, int b, int c, int d)
{
	float x = 1, x0, f, f1;
	do
	{
		x0 = x;
		f = ((a*x0 + b)*x0 + c)*x0 + d;
		f1 = (3 * a*x0 + 2 * b)*x0 + c;
		x = x0 - f / f1;
	} while (fabs(x - x0) >= 1e-3);
	return(x);
}

int main()
{
	int a, b, c, d;
	printf("input a,b,c,d:");
	scanf("%d %d %d %d", &a, &b, &c, &d);
	printf("x=%10.7f\n", solut(a, b, c, d));
	return 0;
}

样例输入输出:

1 2 3 4
x=-1.6506292

 

13、用递归方法求n阶勒让德多项式的值,递归公式为

20200628142752964.png

#include <stdio.h>

double polya(int n,int x){
        double result;
        if(n==0){
                result=1;
        }
        if(n==1){
                result=x;
        }
        if(n>1){
                result=((2*n-1)*x-polya(n-1,x)-(n-1)*polya(n-2,x))/n;
        }
        return result;
}
int main(){
        int n,x;
        scanf("%d %d",&n,&x);
        printf("%.2lf",polya(n,x));
        return 0;
}

14、输人10个学生5门课的成绩,分别用函数实现下列功能:

①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差:

其,x;为某一学生的平均分。

#include<stdio.h>

#define N 10
#define M 5
float score[N][M];
float a_stu[N], a_cour[M];
int r, c;

//输入学生成绩信息函数
void input_stu(void)
{
	int i, j;
	for (i = 0; i < N; i++)
	{
		printf("\ninput score of student%2d:\n", i + 1);
		for (j = 0; j < M; j++)
			scanf("%f", &score[i][j]);
	}
}

//每个学生平均分
void aver_stu(void)
{
	int i, j;
	float s;
	for (i = 0; i < N; i++)
	{
		for (j = 0, s = 0; j < M; j++)
			s += score[i][j];
		a_stu[i] = s / 5.0;
	}
}

//每门课程平均分
void aver_cour(void)
{
	int i, j;
	float s;
	for (j = 0; j < M; j++)
	{
		s = 0;
		for (i = 0; i < N; i++)
			s += score[i][j];
		a_cour[j] = s / (float)N;
	}
}

//最高分函数
float highest()
{
	float high;
	int i, j;
	high = score[0][0];
	for (i = 0; i < N; i++)
	for (j = 0; j<M; j++)
	if (score[i][j]>high)
	{
		high = score[i][j];
		r = i + 1;
		c = j + 1;
	}
	return(high);
}

//方差函数
float s_var(void)
{
	int i;
	float sumx, sumxn;
	sumx = 0.0;
	sumxn = 0.0;
	for (i = 0; i < N; i++)
	{
		sumx += a_stu[i] * a_stu[i];
		sumxn += a_stu[i];
	}
	return(sumx / N - (sumxn / N)*(sumxn / N));
}

int main()
{
	int i, j;
	float h;
	input_stu();
	aver_stu();
	aver_cour();
	printf("\n  NO.     cour1   cour2   cour3   cour4   cour5   aver\n");
	for (i = 0; i < N; i++)
	{
		printf("\n NO %2d ", i + 1);
		for (j = 0; j < M; j++)
			printf("%8.2f", score[i][j]);
		printf("%8.2f\n", a_stu[i]);
	}
	printf("\naverage:");
	for (j = 0; j < M; j++)
		printf("%8.2f", a_cour[j]);
	printf("\n");
	h = highest();
	printf("highest:%7.2f   NO. %2d   course %2d\n", h, r, c);
	printf("variance %8.2f\n", s_var());
	return 0;
}

15、写几个函数:

①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。

#include <stdio.h>

struct emploee{
    int num;
    char name[6];
}empl[101];
//输入函数
void input_employee(){
    int i;
    for(i=0;i<10;i++){
        scanf("%d %s",&empl[i].num,empl[i].name);
    }
}
//按职工号排序
void sort_num(){
    struct emploee a;
    int i,j;
    for(i=0;i<9;i++){
        for(j=i+1;j<10;j++){
            if(empl[i].num>empl[j].num){
                a=empl[i];
                empl[i]=empl[j];
                empl[j]=a;
            }
        }
    }
    printf("职工号 姓名\n");
    for(i=0;i<10;i++){
        printf("%d %s\n",empl[i].num,empl[i].name);
    }
}
//折半查找
char sort_binary(int n){
   
    int left=0,right=9;
    while(left<=right){
        int mid=(left+right)/2;
        if(empl[mid].num==n){
            printf("%s",empl[mid].name);
            break;
        }else if(empl[mid].num>n){
            right = mid-1;
        }else{
            left = mid+1;
        }
    }

    if(left>right){
        printf("该职工不存在");
    }
}
int main(){
    printf("请输入职工的职工号和姓名:\n");
    input_employee();
    sort_num();
    int n;
    printf("请输入职工号:\n");
    scanf("%d",&n);
   sort_binary(n);
    return 0;
}

样例输入输出:

请输入职工的职工号和姓名:
4 sd
3 er
2 we
1 df
10 hc
9 sb
8 nh
7 qi
6 li
5 wi
职工号 姓名
1 df
2 we
3 er
4 sd
5 wi
6 li
7 qi
8 nh
9 sb
10 hc
请输入职工号:
10
hc

16、写一个函数,输人一个十六进制数,输出相应的十进制数。

#include <stdio.h>
#include <string.h>
#include <math.h>
double chang(char s[]){
    int len = strlen(s);
    int i,j;
    double a[101];
    double sum=0;
    for(i=0;i<len;i++){
        if(s[i]=='A'){
            a[i]=10;
        }else if(s[i]=='B'){
            a[i]=11;
        }else if(s[i]=='C'){
            a[i]=12;
        }else if(s[i]=='D'){
            a[i]=13;
        }else if(s[i]=='E'){
            a[i]=14;
        }else if(s[i]=='F'){
            a[i]=15;
        }else {
            a[i]=s[i]-'0';
        }
    }
    for(i=len-1,j=0;i>=0;i--,j++){
        sum+=pow(16,j)*a[i];
    }
    return sum;
}
int main(){
    char s[101];
    gets(s);
    double m = chang(s);
    printf("%.0lf",m);
    return 0;
}

样例输入输出:

2AF5
10997

17、用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数

#include <stdio.h>
#include <string.h>

void Convert(int n){
    int i;

    if((i=n/10)!=0)
        Convert(i);
    putchar(n%10+'0');

}
int main(){
    int n;
    scanf("%d",&n);
    if(n<0){
        putchar("-");
        n=-n;
    }
    Convert(n);

    return 0;
}

18、给出年、月、日,计算该日是该年的第几天。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(){
    int year,mon,day;
    int mday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int total[13]={0};
    for(mon=2;mon<13;mon++){
        total[mon]=total[mon-1]+mday[mon-1];
    }
    scanf("%d %d %d",&year,&mon,&day);
    bool isleap = year%400==0 || year%100!=0&&year%4==0;
    if(isleap==true && mon>=3){
        total[mon]++;
    }
    printf("%d",total[mon]+day);
    return 0;
}

样例输入输出:

2020 6 24
176


http://www.kler.cn/a/3241.html

相关文章:

  • DeepSeek API 的获取与对话示例
  • kafka-部署安装
  • vue3和vue2的区别有哪些差异点
  • Linux(Centos、Ubuntu) 系统安装jenkins服务
  • 力扣算法题——11.盛最多水的容器
  • 利用Qt5.15.2编写Android程序时遇到的问题及解决方法
  • 你真的掌握到“优先级队列“的精髓了吗?
  • linux入门---操作体统的概念
  • leetcode.1574 删除最短的子数组使剩余数组有序 - 阿里笔试 双指针 二分
  • 清晰概括:进程与线程间的区别的联系
  • 两种方法教你在postman设置请求里带动态token
  • 入职第一天就被迫离职,找工作多月已读不回,面试拿不到offer我该怎么办?
  • MySQL数据库管理系统安装部署——Linux
  • Java 集合【学习笔记】Java 基础
  • 注意力机制(四):多头注意力
  • 冲击蓝桥杯-并查集,前缀和,字符串
  • Mysql查询优化_单表使用索引及常见索引失效
  • Linux编译cpprestsdk库
  • 菜鸟刷题Day6
  • 学习 Python 之 Pygame 开发魂斗罗(十三)
  • 邪恶的想法冒出,立马启动python实现美女通通下
  • vue更高效的工具-vite
  • nodejs的后端框架egg,thinkjs,nestjs,nuxtjs,nextjs对比
  • Spring Security实践
  • python自动发送邮件,qq邮箱、网易邮箱自动发送和回复
  • LeetCode-674. 最长连续递增序列