算法笔记+CodeUp

选择结构

问题 B: 例题4-2 比较交换实数值

#include <cstdio>

int main()
{
	double a, b;
	scanf("%lf%lf", &a, &b);
	
	if (a > b)
		printf("%.2f %.2f\n", b, a);
	else
		printf("%.2f %.2f\n", a, b);
	return 0;
}

问题 C: 例题4-3 比较交换3个实数值,并按序输出

#include <cstdio>
void swap(double* a, double* b)
{
	double temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	double a, b, c;
	scanf("%lf%lf%lf", &a, &b, &c);
	if (a > b) swap(&a, &b);
	if (b > c) swap(&b, &c);
	if (a > b) swap(&a, &b);
	printf("%.2f %.2f %.2f", a, b, c);
	return 0;
}

问题 D: 习题4-4 三个整数求最大值

#include <cstdio>

int main()
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	if (a >= b&&a >= c)
		printf("%d\n", a);
	else if (b >= a&&b >= c)
		printf("%d\n", b);
	else if (c >= a&&c >= b)
		printf("%d\n", c);
	return 0;
}

问题 E: 习题4-10-1 奖金计算


#include <cstdio>
int main()
{
	double l, prize;
	scanf("%lf", &l);
	/*某企业发放的奖金根据利润提成。
	利润I低于或等于100000时,奖金可提10%;
	利润高于100000元,低于200000元(100000<I <= 200000)时,低于100000元的部分仍按10%提成,高于100000元的部分提成比例为7.5%;
	200000<I <= 400000时,低于200000元的部分仍按上述方法提成(下同),高于200000元的部分按5%提成;
	400000<I <= 600000元时,高于400000元的部分按3%提成;
	600000<I <= 1000000时,高于600000元的部分按1.5%提成;
	I>1000000元时,超过1000000元的部分按1%提成
	输入:企业利润,小数,双精度double类型
	输出:应发奖金数,保留2位小数,末尾换行。*/
	double d1, d2, d3, d4, d5;
	d1 = 100000 * 0.1;
	d2 = d1 + 100000 * 0.075;
	d3 = d2 + 200000 * 0.05;
	d4 = d3 + 200000 * 0.03;
	d5 = d4 + 400000 * 0.015;
	if (l <= 100000)
		prize = l*0.1;
	else if (l <= 200000)
		prize = d1 + (l - 100000)*0.075;
	else if (l<=400000)
		prize = d2+ (l - 200000)*0.05;
	else if (l<=600000)
		prize = d3+(l - 400000)*0.03;
	else if (l<=1000000)
		prize = d4+ (l - 600000)*0.015;
	else
		prize = d5+(l - 1000000)*0.01;
	printf("%.2f\n", prize);
	return 0;
}

循环结构

问题 A: 例题5-1-1 连续自然数求和

#include <cstdio>
int main()
{
	int i = 100,sum = 0;
	//求1 + 2 + 3 + ... + 100,while()实现
	while (i)
	{
		sum += i;
		i--;
	}
	printf("%d\n", sum);
	return 0;
}

问题 B: 例题5-1-2 连续自然数求和

#include <cstdio>
int main()
{
	int n =1 , sum = 0;
	//使用do...while语句实现1到100求和
	do
	{
		sum += n;
		n++;
	} while (n <= 100);
	printf("%d\n", sum);
	return 0;
}

问题 C: 例题5-1-3 连续自然数求和

#include <cstdio>
int main()
{
	int sum = 0;
	//求1 + 2 + 3 + ... + 100,要求用for语句实现
	for (int i = 100; i >=0; i--)
	{
		sum += i;
	}
	printf("%d", sum);
	return 0;
}

问题 E: 例题5-1-5 连续自然数求和

#include <cstdio>

int main()
{
	int i,sum=0;
	//编程实现求1+2+3+...和的程序,要求得到使和数大于1000的最小正整数。
	for (i=1; sum <= 1000;i++)
	{
		sum += i;
	}
	i--;
	printf("%d\n", i);
	
	return 0;
}

问题 F: 例题5-6 矩阵输出

#include <cstdio>

int main()
{
	
	for (int i = 1; i <= 4; i++)
	{
		for (int j = 1; j <= 5; j++)
		{
			printf("%3d", i*j);
		}
		printf("\n");
		
	}
	return 0;
}

问题 G: 例题5-7 求圆周率pi的近似值

#include <cstdio>
#include <cmath>
#include <cstdio>
/* 用如下公式 pi/4 = 1-1/3+1/5-1/7....求圆周率PI的近似值,直到发现某一项的绝对值
小于10-6为止(该项不累加)。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).
输出 PI=圆周率的近似值 输出的结果总宽度占10位,其中小数部分为8位。末尾输出换行。 */
int main()
{
	double pi = 0.0;
	for (double term = 1, i = 1, j = 3;fabs(term)>=1e-6;j+=2)
	{
		pi += term;
		i = -i;
		term = i / j;
	}
	printf("PI=%10.8f\n",pi*4);
	getchar();
	return 0;
}

问题 H: 例题5-8 Fibonacci数列

#include <cstdio>
/*输入 一个不超过50的正整数
输出 Fibonacci数列的第n个数,末尾输出换行。*/
int fibo(int n)
{
    //利用递归实现分治法的简单例子
    //递归函数的实现必须要有递归边界和递归式
	if (n == 1 || n == 2)
		return 1;
	else return fibo(n - 1) + fibo(n - 2);
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", fibo(n));
	return 0;
}

问题 I: 习题5-10 分数序列求和

#include <cstdio>
/* 有一个分数序列:2/1 , 3/2 , 5/3 , 8/5 , 13/8 , 21/13 ...
求出这个数列的前20项之和. 输出 小数点后保留6位小数,末尾输出换行。*/
double top(int n)
{
	if (n == 1) return 2;
	else if (n == 2) return 3;
	else return top(n - 1) + top(n - 2);
}
double bottom(int n)
{
	if (n == 1) return 1;
	else if (n == 2) return 2;
	else return bottom(n - 1) + bottom(n - 2);
}

int main()
{
	double sum = 0.0;
	for (int i = 1; i <= 20; i++)
	{
		sum += double(top(i) / bottom(i));
	}
	printf("%.6f\n", sum);
	return 0;
}

数组

问题 A: 习题6-4 有序插入

#include <cstdio>
/* 第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。
第二行输入一个整数, 将此整数插入到前有序的9个数中,使得最终的10个数
依然是从小到大有序的。
输出 从小到大输出这10个数,每个数一行8*/
int main()
{
	int a[10],b;

	for (int i = 0; i < 9; i++)
		scanf("%d", &a[i]);
	scanf("%d",&b);
	/*for (int i = 8; i >= 0; i--)
	{
		if (b < a[i])
			a[i + 1] = a[i];
		else
		{
			a[i+1] = b;
			break;
		}	
	}
	for (int i = 0; i < 10; i++)
		printf("%d\n", a[i]);*/
	int i;
	for (i = 9; b < a[i - 1]&&i >= 1; i--)//注意i>=1
		a[i] = a[i - 1];
	a[i] = b;
	for (int i = 0; i < 10; i++)
		printf("%d\n", a[i]);
	return 0;
}

问题 B: 习题6-5 数组元素逆置

#include <cstdio>
/*  将一个长度为10的整型数组中的值按逆序重新存放。
输入 从键盘上输入以空格分隔的10个整数。
输出 按相反的顺序输出这10个数,每个数占一行。*/
int main()
{
	int a[10],b[10];
	int j = 9;
	for (int i = 0; i < 10; i++)
	{
        scanf("%d", &a[i]);
		b[j] = a[i];
		j--;
	}
	for (int i = 0; i < 10; i++)
		printf("%d\n", b[i]);
	return 0;
}

问题 C: 习题6-6 杨辉三角

#include <cstdio>
//输入 输入只包含一个正整数n,表示将要输出的杨辉三角的层数。
//输出 对应于该输入,请输出1 - 相应层数的杨辉三角,每一层的整数之间用一个空格隔开, 最多输出10层
int main()
{
	int n, a[10] = { 1, 1 };
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		//打印第1,2层
		if (i == 1) printf("%d\n", a[0]);
		else if (i == 2) printf("%d %d\n", a[0], a[1]);
		else{
			//打印其它层
			int temp[10];
			temp[0] = 1;
			int j;
			//从a的现在一层推导出下一层,存入临时数组
			for (j = 1; j <= i - 2; j++)
				temp[j] = a[j - 1] + a[j];
			temp[j] = 1;
			//打印这一层
			for (int k = 0; k <=j; k++)
				printf("%d ", temp[k]);
			printf("\n");
            //更新数组a
			for (int m = 0; m < i; m++)
				a[m] = temp[m];
		}
	}
	return 0;
}

问题 D: 习题6-12 解密

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
//第一个字母变成第26个字母,第i个字母变成第(26 - i + 1)个字母,非字母字符不变。
//要求根据密码译回原文,并输出。
//输入 输入一行密文; 输出 解密后的原文,单独占一行。
int main()
{
	char str[100];
	gets(str);
	for (int i = 0; i < strlen(str); i++)
	{
		if (str[i] >= 65 && str[i] <= 90)
		{
			str[i] = 155 - str[i];
		}
		else if (str[i] >= 97 && str[i] <= 122)
		{
			str[i] = 219 - str[i];
		}
	}
	puts(str);
	//syetem("pause");
	std::cin.get();
	return 0;

}

问题 E: 习题6-13 字符串比较


#include <cstdio>
#include <cstring>
//比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;
//若s1 = s2,则输出0;若s1<s2,则输出一个负数。
//	要求:不用strcpy函数;两个字符串用gets函数读入。
//	输入 输入2行字符串
//	输出 一个整数,表示这两个字符串 比较的差值,单独占一行。
int main()
{
	char s[100], t[100];
	int temp;
	gets(s);
	gets(t);
	int a=strlen(s);
	int b=strlen(t);
	int lt = a < b ? a : b;
	
	for (int i = 0;i < lt; i++)
	{
		temp=s[i] - t[i];
		if (temp)//如果不等于0
			break;
		else
		{
			if (a == b && i == a - 1)
				break;
		}	
	}
	printf("%d\n", temp);
	return 0;
}

问题 F: 例题6-1 逆序输出数组元素

#include <cstdio>
//输入 10个整数,以空格分隔
//输出 将输入的10个整数逆序输出,每个数占一行。
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
		scanf("%d", a+i);
	for (int i = 9; i >= 0; i--)
		printf("%d\n", a[i]);
	return 0;
}

问题 G: 例题6-2 数组求解Fibonacci数列问题

#include <cstdio>
//输入 无
//输出 Fibonacci数列的前20个数,每个数占一行。
int main()
{
	int fib[20] = { 1, 1 };
	for (int i = 2; i < 20; i++)
		fib[i]=fib[i - 1] + fib[i - 2];
	for (int i = 0; i < 20; i++)
		printf("%d\n", fib[i]);
	return 0;
}

问题 H: 例题6-3 冒泡排序

#include <cstdio>

int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 0; j <= 9-i; j++)
		{
			if (a[j] > a[j+1])
			{
				int temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
	for (int i = 0; i < 10; i++)
		printf("%d\n", a[i]);
	return 0;
}

问题 I: 例题6-4 矩阵转置

#include <cstdio>
//输入 2行数据,每行3个整数,以空格分隔。
//输出 行列互换后的矩阵,3行,每行2个数据,以空格分隔
int main()
{
	int a[2][3];
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	/*for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("%d ", a[j][i]);
		}
		printf("\n");
	}*/
	int aT[3][2];
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			aT[j][i] = a[i][j];
		}
	}
	for (int i = 0; i < 2; i++)
		printf("%d %d\n", aT[i][0], aT[i][1]);
	return 0;
}

问题 J: 例题6-9 字符串求最大值

#include <cstdio>
#include <cstring>
//输入 输入3行,每行均为一个字符串。
//输出 一行,输入三个字符串中最大者
int main()
{
    char s1[100], s2[100], s3[100], *Max;
    gets(s1);
    gets(s2);
    gets(s3);
    Max = s1;
    if (strcmp(Max, s2) < 0) Max = s2;
    if (strcmp(Max, s3) < 0) Max = s3;
    printf("%s", Max);
    return 0;
}

函数

问题 A: 习题7-5 字符串逆序存放

#include <cstdio>
#include <cstring>
//输入 一行字符串。
//输出 输入字符串反序存放后的字符串。单独占一行
void reverse(char a[])
{
    int len = strlen(a);
    for (int i = 0; i < len/2; i--)
    {
        int temp = a[i];
        a[i] = a[len - 1 - i];
        a[len - 1 - i] = temp;
    }

}
int main()
{
    char a[100];
    gets(a);
    reverse(a);
    printf("%s\n", a);
    return 0;
}

问题 B: 习题7-7 复制字符串中的元音字母

//输入 一个字符串(一行字符)。
//输出 该字符串所有元音字母构成的字符串。行尾换行
void vowels(char s1[],char s2[])
{
    int len = strlen(s1),j = 0;
    for (int i = 0; i < len; i++)
    {
        if (s1[i] == 'a' || s1[i] == 'e' || s1[i] == 'i' || s1[i] == 'o'|| s1[i] =='u'){
            s2[j] = s1[i];
            j++;
        }
      
    }
    s2[j] = '\0';
}
int main()
{
    char s1[100],s2[100];
    gets(s1);
    vowels(s1,s2);
    printf("%s\n", s2);
    return 0;
}

指针

问题 A: C语言10.1


#include <cstdio>
//输入a和b两个整数,按先大后小的顺序输出a和b
//注意请使用指针变量的方式进行比较和输出
int main()
{
    int a, b;
    scanf("%d%d\n", &a, &b);
    int *p=&a, *p1=&b;

    if (*p >= *p1)
        printf("%d %d\n", *p, *p1);
    else
        printf("%d %d\n", *p1, *p);
    return 0;
}

问题 B: C语言10.2

#include <cstdio>
//输入 三个用空格隔开的整数a、b和c。
//输出 按先大后小的顺序输出a、b和c,用空格隔开。请注意行尾输出换行
int main()
{
    int a[3];
    scanf("%d%d%d\n", &a[0], &a[1], &a[2]);
    for (int i = 1; i <= 2; i++)
    {
        for (int* p = a; p < a+2; p++)
        {
            if (*p < *(p + 1)){
                int temp = *p;
                *p = *(p + 1);
                *(p + 1) = temp;
            }
        }
    }
    printf("%d %d %d\n", *a, *(a + 1), *(a + 2));
    return 0;
}

问题 C: C语言10.10

#include <cstdio>
#include <cstring>
//给定字符串定义char *a = “I love China!”,
//读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串。
//输入 一个整数n,保证0 <= n<13.
//输出 输出进行了题目描述中赋值操作之后a对应的字符串.请注意行尾输出换行
int main()
{
    char* a = "I love China!";
    int n;
    scanf("%d", &n);
    puts(a + n);
    return 0;
}

问题 D: C语言10.15

#include <cstdio>
#include <cstring>
//输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
//输入 3行,每行一个用字符串。保证每个字符串的长度不超过20。
//输出 按从小到大的顺序输出这3个字符串,每个字符串一行
void swap(char a[], char b[])
{
    char t[21];
    strcpy(t, a);
    strcpy(a, b);
    strcpy(b, t);
}
int main()
{
    char s[3][21];
    for (int i = 0; i < 3; i++)
        gets(s[i]);
    if (strcmp(s[0], s[1])>0)
        swap(s[0], s[1]);
    if (strcmp(s[1], s[2]) > 0)
        swap(s[1], s[2]);
    if (strcmp(s[0], s[1]) > 0)
        swap(s[0], s[1]);
    puts(s[0]);
    puts(s[1]);
    puts(s[2]);
    return 0;
}

问题 E: C语言10.16

#include <cstdio>
//输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求
//用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
//输入 用空格隔开的10个整数。
//输出 输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格
void inp(int a[])
{
    for (int i = 0; i < 10; i++)
        scanf("%d", a + i);
}
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void tackle(int a[])
{
    int min=*a, max=*a,mink=0,maxk=0;
    for (int i = 1; i < 10; i++)
    {
        if (a[i] < min){
            min = *(a + i);
            mink = i;
        }
        if (a[i] > max){
            max = *(a + i);
            maxk = i;
        }
    }
    swap(a, a + mink);
    swap(a + 9,a + maxk);
}
void oup(int a[])
{
    for (int* p = a; p < a+10; p++)
    {
        printf("%d ", *p);
    }
    printf("\n");
}
int main()
{
    int a[10];
    inp(a);
    tackle(a);
    oup(a);
    return 0;
}

结构体

问题 A: C语言11.1

#include <cstdio>
#include <cstring>
//输入第一行有一个整数n,表示以下有n张选票信息将会输入。保证n不大于100。
//以后的n行中,每一行包含一个人名,为选票的得票人。保证每一个人名都是Li,
//Zhang和Fun中的某一个。
//输出
//有三行,分别为Li,Zhang和Fun每人的得票数。格式为首先输出人名,其后输出一个冒号,
//最后输出候选人的得票数。注意行尾输出换行
struct person{
        char name[20];
        int count;
}leader[3] = { "Li", 0, "Zhang", 0, "Fun", 0 };
int main()
{
    
    int n;
    char name1[20];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%s", &name1);
        if (!strcmp(name1, leader[0].name))
            leader[0].count++;
        else if (!strcmp(name1, leader[1].name))
            leader[1].count++;
        else 
            leader[2].count++;
    }
    for (int i = 0; i < 3; i++)
    {
        printf("%s:%d\n", leader[i].name, leader[i].count);
    }
    return 0;
}

问题 B: C语言11.2

#include <cstdio>
//输入 第一行有一个整数n,表示以下有n个学生的信息将会输入。保证n不大于20。
//以后的n行中,每一行包含对应学生的学号、名字、性别和年龄,用空格隔开。保证每一个人名
//都不包含空格且长度不超过15,性别用M和F两个字符来表示。
//输出 有n行,每行输出一个学生的学号、名字、性别和年龄,用空格隔开
struct student{
    int num;
    char name[20];
    char sex;
    int age;
};
int main()
{
    int n;
    scanf("%d", &n);
    student stu[20],*ptrToStu[20];
    for (int i = 0; i < n; i++){
        scanf("%d %s %c %d\n", &stu[i].num, &stu[i].name, &stu[i].sex, &stu[i].age);
        ptrToStu[i] = &stu[i];
    }
    for (int i = 0; i < n; i++)
        //printf("%d %s %c %d\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age);
        printf("%d %s %c %d\n", ptrToStu[i]->num, ptrToStu[i]->name, ptrToStu[i]->sex, ptrToStu[i]->age);
    return 0;
}

问题 C: C语言11.4

#include <cstdio>
struct body{
    int num;
    char name[10];
    char sex;
    char job;
    union{
        int classes;
        char position[10];
    }category;
}member[100];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %s %c %c", &member[i].num, member[i].name, &member[i].sex,&member[i].job);
        if (member[i].job == 's')
            scanf("%d", &member[i].category.classes);
        else if (member[i].job == 't')
            scanf("%s", member[i].category.position);
    }
    for (int i = 0; i < n; i++)
    {
        if (member[i].job == 's')
            printf("%d %s %c %c %d\n", member[i].num, member[i].name, member[i].sex, member[i].job, member[i].category.classes);
        else if (member[i].job == 't')
            printf("%d %s %c %c %s\n", member[i].num, member[i].name, member[i].sex, member[i].job, member[i].category.position);

    }
    return 0;
}

问题 D: C语言11.7

#include <cstdio>
typedef struct student {
    int num;
    char name[20];
    int score1;
    int score2;
    int score3;
};
void input(student stds[]) {
    for (int i = 0; i < 5; i++)
        scanf("%d %s %d %d %d", &stds[i].num, stds[i].name, &stds[i].score1, &stds[i].score2, &stds[i].score3);
}
void print(student *stds) {
    for (int i = 0; i < 5; i++)
        printf("%d %s %d %d %d\n", stds[i].num, stds[i].name, stds[i].score1, stds[i].score2, stds[i].score3);
}

int main()
{
    struct student stds[5];
    input(stds);
    print(stds);
    return 0;
}

问题 E: C语言11.8

#include <cstdio>
struct student{
    int num;
    char name[20];
    int score[3];
};
void input(student stu[])
{
    for (int i = 0; i < 10; i++)
        scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
}
void print(student stu[])
{
    double sum[3] = { 0 }, max_aver = (stu[0].score[0] + stu[0].score[1] + stu[0].score[2]) / 3.0;
    int k = 0;
    for (int i = 0; i < 10; i++)
    {
        sum[0] += stu[i].score[0];
        sum[1] += stu[i].score[1];
        sum[2] += stu[i].score[2];
        double now_max = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
        if (now_max > max_aver){
            k = i;
            max_aver = now_max;
        }
    }
    printf("%.2f %.2f %.2f\n", sum[0] / 10, sum[1] / 10, sum[2] / 10);
    printf("%d %s %d %d %d\n", stu[k].num, stu[k].name, stu[k].score[0], stu[k].score[1], stu[k].score[2]);
}
int main()
{
    student stu[10];
    input(stu);
    print(stu);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值