class-notes/最后两周/C语言同步练习答案.md
2025-03-22 19:49:55 +08:00

16 KiB

选择结构

选择结构-1

image-20250220225958223

#include <stdio.h>

/*
if(条件){
	复合语句(条件为真时执行) 
}else{
	复合语句(条件为假时执行) 
}
*/
int main(void){

	int x, y, z, t;//定义三个整型变量
	//数据类型 变量名1, 变量名2;
	scanf("%d%d%d", &x, &y, &z);
	if(x > y){
		t = x;
		x = y;
		y = t;
	}//实现x和y比较 大数放y位置 
	if(y > z){
		t = y;
		y = z;
		z = t;
	}//实现y和z比较 大数放z位置 z为三个数字中最大数
	if(x > y){
		t = x;
		x = y;
		y = t;
	}
	printf("%d %d %d\n", x, y, z);
	
	return 0;
}

选择结构-2

image-20250220230052521

#include <stdio.h> 

int main(void){
	
	
	int a;
	
	scanf("%d", &a);
	printf("该数的位数为%d\n", 
	(a/10==0?1:(a/100==0?2:(a/1000==0?3:(a/10000==0?4:5)))));
	printf("%d", a%10);
	if(a%100/10 != 0){
		printf("%d", a%100/10);
	}
	if(a%1000/100 != 0){
		printf("%d", a%1000/100);
	}
	if(a%10000/1000 != 0){
		printf("%d", a%10000/1000);
	}
	if(a/10000 != 0){
		printf("%d", a/10000);
	}
	printf("\n");
	return 0;
}

选择结构-3

image-20250220230133563

#include <stdio.h>

int main(void){
	
	float a, b, result;
	int flag;
	printf("请输入两个数字:");
	scanf("%f %f", &a, &b);
	printf("请输入您要进行的操作(1.做加法 2.做乘法 3.做除法):");
	scanf("%d", &flag);
	switch(flag){
		case 1:result = a+b;break;
		case 2:result = a*b;break;
		case 3:result = a/b;break;
	}
	printf("结果为%f\n", result);
	
	return 0;
}

选择结构-4

image-20250220230626411

#include <stdio.h>

int main(void){
	
	int year, month, day, days=0;
	
	scanf("%d-%d-%d", &year, &month, &day);
	days+=day;
	//1 3 5 7 8 10 12
	//从前一个月开始依次 
	switch(month-1){
		case 11:days+=30;
		case 10:days+=31;
		case 9:days+=30;
		case 8:days+=31;
		case 7:days+=31;
		case 6:days+=30;
		case 5:days+=31;
		case 4:days+=30;
		case 3:days+=31;
		case 2:days+=28;
		case 1:days+=31;
	}
	if(month>3 && (year%4==0&&year%100!=0 || year%400==0)){
		days++;
	} 
	printf("%d\n", days);
	
	
	return 0;
}

循环结构

循环结构-1

image-20250220230645828

#include <stdio.h>


/*
1.解决字符的循环输入
while((ch=getchar())!='\n')

2.判断字符类型
ASCALL码范围 

*/
int main(){
	
	char ch;
	int l, d, o;//l字母的个数 d为数字个数 o为其他字符个数
	l=d=o=0;
	while((ch=getchar()) != '\n'){
		if(ch >= 'a' && ch<='z' || ch >= 'A' && ch<='Z' ){
			l++;
		}else if(ch >= '0' && ch <= '9'){
			d++;
		}else{
			o++;
		}
	} 
	printf("字母个数:%d 数字个数:%d 其他个数%d\n", l, d, o);	
	
	return 0;
}

循环结构-2

image-20250220230945704

/*
暴力求解+枚举每一个台阶
for(i=0;i<1000;i++){
		
}
i=0;
while(i<1000){
	
	i++;
}
&& || !
表达式1&&表达式2
左右都为真才为真
短路运算 表达式1为假 表达式2直接不运算 直接为假 
*/

#include <stdio.h>

int main(){
	int i;
	for(i=0;i<1000;i++){
		if(i%2==1 && i%3==2 && i%5==4 && i%6==5 && i%7==0){
			printf("台阶数为%d\n", i);
			break;
		}
	}
	
	
	
	
	return 0;
}

循环结构-3

image-20250220230952843

#include <stdio.h>
/*
大马:i
中马:j
小马:k 
*/

int main(){
	int i, j , k;
	for(i=0;i<=33;i++){
		for(j=0;j<=50;j++){
			for(k=0;k<=200;k+=2){
				if(i+j+k==100 && i*3 + j*2 + k/2 == 100){
					printf("大马:%-2d 中马:%-2d 小马:%-2d\n", i, j, k);
				}
			}
		}
	}
	
	
	return 0;
}

循环结构-4

image-20250220231000056

#include <stdio.h>

int main(){
	
	int i, s, t;//i用来遍历所有数, s用来存储数的位数,t是截取掉最高位之后的数 
	for(i=1;i<9999;i++){
		t = i;
		while(t > 0){
			s = (t/10==0?1:(t/100==0?2:(t/1000==0?3:4)));//求出这个数字位数
			t = i%(int)pow(10, s-1);//使用模除去掉最高位 
			if(t*t == i){
				printf("%d:%d\n", t, i);
			}
		}
	}
	
	
	
	return 0;
}

循环结构-5

image-20250220231006104

#include <stdio.h>

int main(){
/*
	int x, n, t=1;//t为2当前需要加入的位置 
	
	scanf("%d", &x);
	n = x;//处理之后数
	while(t < x){//判断位置是否超过的数的范围 
		n+=t*2;
		//根据当前输入位置判断前一位是否溢出如果溢出则减一 
		if(n/(t*10) != x/(t*10)){
			n-=(t*10);
		}
		t*=10;//继续处理下一位 
	}
	printf("%d:%d\n", x, n);
*/
	int x, s = 0;
	scanf("%d", &x);
	while(x){
		s*=10;
		s += (x%10+2)%10;
		x /= 10;
	}
	for(;s;s/=10){
		printf("%d", s%10);
	}

	return 0;
}

循环结构-6

image-20250220231012110

#include <stdio.h>

int main(){
	
	int i;
	for(i=5;i<=100;i++){
		if(i%5==0 || i%7==0){
			printf("%d ", i);
		}
	}

	return 0;
}

循环结构-7

image-20250220231022607

#include <stdio.h>

int main(){
	
	int month, total = 2, i;
	scanf("%d", &month);

	for(i=1;i<=month;i++){
		if(i%3==0){
			total *= 2;
		}
		printf("%d月:%d个数\n", i, total); 
	}

	return 0;
}

循环结构-8

image-20250220231027969

#include <stdio.h>

int main(){
	int i, j, k;
	
	for(i=0;i<=3;i++){
		for(j=1;j<=5;j++){
			for(k=0;k<=6;k++){
				if(i+j+k==8){
					printf("红:%d 白:%d 黑:%d\n", i, j, k);
				}
			}
		}
	}

	return 0;
}

循环结构-9

image-20250220231034218

#include <stdio.h>

int main(){
	int num, n=2, first = 1;
	scanf("%d", &num);
	
	printf("%d=",num);
	while(num > 1){
		if(num%n==0){
			first?printf("%d", n):printf("*%d", n);
			first=0;
			num/=n;
		}else{
			n++;
		}
	}

	return 0;
}

循环结构-10

image-20250220231039716

#include <stdio.h>

int main(){
	int x;
	while(1){
		scanf("%d", &x);
		if(x == 0){
			break;
		}
		printf("%d:%s\n", x, (x%5==0&&x%7==0?"Yes":"No"));
	}

	return 0;
}

数组

数组-1

image-20250220231426147

#include <stdio.h>

int main(){
	int num[30], i, j;
	float result[6];
	for(i=0;i<30;i++){
		num[i] = 2+2*i;
	}
	
	for(i=0;i<30;i+=5){
		result[i/5] = (num[i]+ num[i+1] + num[i+2] + num[i+3] + num[i+4])/5.0;
	}
	
	for(i=0;i<6;i++){
		printf("%.2f ", result[i]);
	}
	printf("\n");

	return 0;
}

数组-2

image-20250220231434409

#include <stdio.h>

int fib(int n){
	if(n== 0 || n==1){
		return 1;
	}
	return fib(n-1) + fib(n-2);
}

int main(){
	int num[15], i;
	
	for(i=0;i<15;i++){
		num[i] = fib(i);
	}
	
	for(i=0;i<15;i++){
		printf("%d ", num[i]);
	}
	printf("\n");
	
	return 0;
}

/*
int main(){
	int num[15] = {1, 1}, i;

	for(i=2;i<15;i++){
		num[i] = num[i-1] + num[i-2];
	}
	for(i=0;i<15;i++){
		printf("%d ", num[i]);
	}
	printf("\n");

	return 0;
}
*/

数组-3

image-20250220231441384

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

int main(){
	char a[200], b[200];//定义两个字符数组用来读取字符串a和b 
	char *p, *q;//定义两个指针 分别存储字符串a和字符串b的首地址 
	
	gets(a);
	gets(b);//从控制台获取输入 
	if(strlen(b) > 5){
		b[5] = '\0';
	}//判定字符串是否大于5 如果大于5 则将第六个元素改成结束符 
	p = a;//p指向a的首地址 
	q = b;//q指向b的首地址 
	while(*p != '\0'){//找到a结束符位置的地址 
		p++;
	}
	//从b的第一个元素开始赋值到a中 
	while(*q != '\0'){
		*p++ = *q++;
	}
	*p = '\0';//标记结束符 
	printf("a=%s\n", a);
	printf("b=%s\n", b);
	
	
	return 0;
}

数组-4

image-20250220231447834

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(){
	int num[10], i;
	srand((unsigned)time(NULL));
	
	for(i=0;i<10;i++){
		num[i] = rand()%101;
		printf("%d ", num[i]);
	}
	printf("\n");

	return 0;
}

数组-5

image-20250220231704799

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h> //里面定义了基本数据类型的最大值和最小值 

int main(){
	int num[3][4], i, j, min=INT_MAX, i_index, j_index;
	srand((unsigned)time(NULL));
	
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			num[i][j] = rand()%101;
			printf("%2d ", num[i][j]);
			if(num[i][j] < min){
				min = num[i][j];
				i_index = i;
				j_index = j;
			}
		}
		printf("\n");
	}
	printf("min=%d i=%d j=%d\n", min, i_index, j_index);
	return 0;
}


函数

函数-1

image-20250227231121624

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

/*
1 	2 	3 |6
4 	5 	6 |15
7 	8 	9 |24
-------------
12 15 	18 
*/
void getSum(int array[100][100], int n, int m){
	int i, j, sum;
	for(i=0;i<n;i++){
		sum = 0;
		for(j=0;j<m;j++){
			printf("%-5d ", array[i][j]);
			sum += array[i][j];
		}
		printf("| %-5d\n", sum);
	}
	for(j=0;j<m;j++){
		printf("------");
	}
	printf("\n");
	for(j=0;j<m;j++){//列的下标
		sum =0;
		for(i=0;i<n;i++){//行的下标 
			sum += array[i][j];	
		}
		printf("%-5d ", sum);
	}
	printf("\n");
}

int main(){
	int n, m, i, j;//n为行数 m为列数
	int array[100][100] = {0};
	
	printf("请输入行数和列数:");
	scanf("%d %d", &n, &m);
	
	srand((unsigned)time(NULL));
	
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			array[i][j] = rand()%100;
		}
	}
	getSum(array, n, m);

	return 0;
}

函数-2

image-20250227231147113

#include <stdio.h>

void change(char *p){
	//alex apple 
	*p++ -= 32;//a-> -32 ->A
	while(*p != '#'){
		if(*(p-1) == ' '){
			*p -= 32;
		}
		p++;
	}
	*p = '\0';
}

int main(){
	char str[1024];
	
	gets(str);//读取一行字符串 回车判定结束 
	change(str);
	puts(str);
	

	return 0;
}

函数-3

image-20250227231154429

#include <stdio.h>

//幂次方 
int power(int n){
	int s = 1, i;
	for(i=1;i<=n;i++){
		s *= 2;
	}
	return s;
}
//阶乘 
int factorial(int n){
	int s = 1, i;
	for(i=1;i<=n;i++){//1~n
		s*=i;
	}
	return s;
}

int main(){
	int n, i, s = 0;
	scanf("%d", &n);
	for(i=1;i<=n;i++){
		s += power(i) * factorial(i);
	}
	printf("%d\n", s);

	return 0;
}

指针

指针-1

image-20250227231209008

#include <stdio.h>

int main(){
	int a[10], b[10];
	int i;
	int *p, *q;
	
	for(i=0, p=a;i<10;i++){
		scanf("%d", p++);
	}
	for(i=0, p=a, q=b;i<10;i++){
		if(*p%2==0){
			*q++=*p;
		}
		p++;
	}
	for(i=0, p=b;i<q-b;i++){
		printf("%d ", *p++);
	}
	printf("\n");
	

	return 0;
}

指针-2

image-20250227231216409

#include <stdio.h>
/*
1 2 3 4 5 6 7 8 9 10
1 3 4 5 6 7 8 9 10
*/
int main(){
	int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int n = 10;
	int i;
	int *p, *q;
	p = a+1;
	q = a+2;
	for(i=0;i<8;i++){//用来控制循环的次数 
		*p++ = *q++;
	}
	n--;
	for(i=0;i<n;i++){
		printf("%d ", *(a+i));
	}
	printf("\n");
	return 0;
}

指针-3

image-20250227231232971

#include <stdio.h>

int main(){
	char str[] = "AbcDEfg";
	char *p = str;
	
	while(*p != '\0'){
		if(*p >= 'a' && *p <= 'z'){
			*p -= 32;
		}else{
			*p += 32;
		}
		p++;
	}
	puts(str);

	return 0;
}

指针-4

image-20250227231243197

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

int main(){
	char str[5][20];
	char (*p)[20], (*max)[20];//数据类型 (*变量名)[长度];数组指针 
	int i;
	for(i=0, p =str;i<5;i++){
		scanf("%s", p++);
	}
	max = p;
	
	for(i=1, p =str+1;i<5;i++){
		if(strcmp(*p, *max)){
			max = p;
		}
		p++;
	}
	printf("max = %s\n", max);

	return 0;
}

编译预处理

预处理-1

image-20250227231302316

#include <stdio.h>
#define MAXD(x, y) (x>y?x:y)

int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    //(1>2?1:2) 将MAXD替换成三目运算符
    printf("%d \n", MAXD(a, b));

    return 0;
}

预处理-2

image-20250227231314793

#include <stdio.h>
#define f(n) (n%5==0 && n%7==0?"能被整除\n":"不能被整除\n")
int main(){
    //#define 指令 语句序列 会在语句序列中将所有参数替换成传入的
    int num;
    scanf("%d", &num);

    puts(f(num));

    return 0;
}

预处理-3

image-20250227231325297

#include <stdio.h>

#define CHANGE 0 //1代表打印密文 0明文
//! Ctrl + .注释
int main(){
    char str[100], i=0;
    scanf("%s", str);
#if CHANGE
    while(str[i] != '\0'){
        if(str[i] >= 'a' && str[i] <= 'y' || str[i] >= 'A' && str[i] <= 'Y' ){
            str[i]++;
        }else if(str[i] == 'z' || str[i] == 'Z'){
            str[i]-=25;
        }
        i++;
    }
#endif
    puts(str);

    return 0;
}

结构体

结构体-1

image-20250227231339018

#include <stdio.h>

typedef struct student{
    int num;
    char name[20];
    float socre[3];
}student;
//student 作为一个类型
//如果不写typedef则结构体类型为 struct student

void output(student stuList[5]){
    int i;

    for(i=0;i<5;i++){
        printf("%d\t%s\t%f\t%f\t%f\n", stuList[i].num, stuList[i].name, stuList[i].socre[0], 
                                stuList[i].socre[1], stuList[i].socre[2]);
    }
}
int main(){
    student stuList[5];//定义了一个结构体数组里面可以容纳5个结构体变量
    int i;
    for(i=0;i<5;i++){
        scanf("%d %s %f %f %f", &stuList[i].num, stuList[i].name, &stuList[i].socre[0], 
                                &stuList[i].socre[1], &stuList[i].socre[2]);
    }
    output(stuList);
    return 0;
}

结构体-2

image-20250227231421233

#include <stdio.h>

typedef struct student{
    int num;
    char name[20];
    float socre[3];
}student;
//student 作为一个类型
//如果不写typedef则结构体类型为 struct student

void output(student stuList[5]){
    int i;

    for(i=0;i<5;i++){
        printf("%d\t%s\t%f\t%f\t%f\n", stuList[i].num, stuList[i].name, stuList[i].socre[0], 
                                stuList[i].socre[1], stuList[i].socre[2]);
    }
}

void input(student stuList[5]){
    int i;
    for(i=0;i<5;i++){
        scanf("%d %s %f %f %f", &stuList[i].num, stuList[i].name, &stuList[i].socre[0], 
                                &stuList[i].socre[1], &stuList[i].socre[2]);
    }
}
int main(){
    student stuList[5];//定义了一个结构体数组里面可以容纳5个结构体变量

    input(stuList);
    output(stuList);
    return 0;
}

结构体-3

image-20250227231434183

#include <stdio.h>
typedef struct score{
    float medScore;
    float endScore;
}score;

int main(){
    score s;
    scanf("%f %f", &s.medScore, &s.endScore);

    printf("avg=%.2f\n", (s.medScore + s.endScore)/2);
    return 0;
}

文件

文件-1

image-20250227231459946

文件-2

image-20250227231509693

文件-3

image-20250227231516025