Skip to content

[TOC]

概念题 ​

  1. ROM:read-only memory只读存储器,只能读出不能写入,断电不会丢失。在主板上的ROM里固化了BIOS系统 RAM:ramdom access memory随机存储器,高速缓存,断电消失。一般说的计算机内存是指RAM
  2. for循环一般用于知道具体循环次数的情况,但不是只能用于这个情况
  3. 调试运行和直接运行
    • 调试运行可以一步一步执行程序
    • 允许察看监视窗口
    • 允许察看程序的内存
  4. static静态变量只能被初始化一次,通常用在反复执行的一段代码里,给静态变量赋初值;再次执行这段代码的时候,该静态变量的值不会被初始化而是上一次运行结束时的值。
  5. 形参相当于实参的一份拷贝
  6. 结构体和联合体
    • 二者的使用语法相同
    • 结构体的关键字是struct,联合体是union
    • 结构体每个成员单独占内存,联合体所有成员共用内存

思路 ​

交换-->找中间变量
在函数中执行它本身-->递归
打印:

  • 外层循环控制输出多少行,内层循环控制每一行有多少列,每输出完一列需要换行符
  • 一般由空格和填充字符组成,基于printf函数逐个打印的模式以及转义字符的运用,结合一些嵌套循环的算法

上机题 ​

交换两个变量的值 ​

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int nNuma = 5;
	int nNumb = 6;
	printf("%d,%d\n", nNuma, nNumb);
	//使用中间变量
	int nBrg = 0;
	nBrg = nNuma;
	nNuma = nNumb;
	nNumb = nBrg;
	printf("%d,%d\n", nNuma, nNumb);
	//不使用中间变量
	nNuma = nNuma + nNumb;
	nNumb = nNuma - nNumb;
	nNuma = nNuma - nNumb;
	printf("%d,%d\n", nNuma, nNumb);
	//异或
	nNuma = nNuma ^ nNumb;
	nNumb = nNuma ^ nNumb;
	nNuma = nNuma ^ nNumb;
	printf("%d,%d\n", nNuma, nNumb);
	system("pause");
	return 0;	
	
}

打印 &#8203;

九九乘法表 &#8203;

for (int i = 1; i < 10; i++)
	{
		for (int j = 1; j <= i; j++)
			printf("%d*%d=%d  ", j,i, i*j);
		printf("\n");
	}

金字塔 &#8203;

image

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

int main(void)
{
	int nHigh = 0;
	printf("请输入要打印几行金字塔:");
	scanf_s("%d", &nHigh);
	for (int i=0;i<nHigh;i++)
	{
		for (int j=0;j<=nHigh - 1 + i;j++)
		{
			
			if(j>=nHigh-1-i&&j<=nHigh-1+i)
			{
				printf("*");
			}
			else printf(" ");
		}
		printf("\n");
	}
	system("pause");
}

任意奇数行的菱形 &#8203;

效果如下:
image

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

int main(void)
{
	int nHigh = 0,nMid=0;
	printf("请输入要打印的菱形行数(奇数):");
	scanf_s("%d", &nHigh);
	nMid = nHigh / 2;
	for (int i=0;i<nHigh;i++)
	{
		if (i <= nMid)		//打印上半部分
		{
			for (int j = 0; j <= nHigh - 1 + i; j++)
			{
				if (j >= nMid - i && j <= nMid + i)
				{
					printf("*");
				}
				else printf(" ");

			}

			printf("\n");
		}
		else     //打印下半部分
		{
			for (int j = 0; j <= nHigh - 1 + i; j++)
			{
				if (j >= i-nMid && j <= (nHigh-1)-(i-nMid))
				{
					printf("*");
				}
				else printf(" ");

			}

			printf("\n");
		}
	}
	system("pause");
}

杨辉三角 &#8203;

每行的两边都是1,从第2列开始,每个数是上一行肩上的数之和

打印指定行数的杨辉三角

java
package com.company;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int row = sc.nextInt();//输入杨辉三角的行数
        //定义二维数组存储杨辉三角
        int[][] yangHui = new int[row][];
        //根据杨辉三角的规则给二维数组赋值
        for (int i = 0; i < yangHui.length; i++) {
            //给一维数组开空间
            yangHui[i] = new int[i + 1];
            for (int i1 = 0; i1 < yangHui[i].length; i1++) {
                //如果是每一行的头尾则赋值1
                if(i1 == 0 || i1 == i) yangHui[i][i1] = 1;
                else yangHui[i][i1] = yangHui[i - 1][i1 - 1] + yangHui[i - 1][i1];
            }
        }
        //打印这个二维数组
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

打印等腰三角 &#8203;

image

#include <stdlib.h>
#include<iostream>
using std::cout;
using std::endl;
int main()
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 11; j++)
		{
			if (j <= 5)
			{

				if (i + j == 5)
				{
					cout << 1;
				}
				else if (i + j == 6)
				{
					cout << 2;
				}
				else if (i + j == 7)
				{
					cout << 3;
				}
				else if (i + j == 8)
				{
					cout << 4;
				}
				else if (i + j == 9)
				{
					cout << 5;
				}
				else if (i + j == 10)
				{
					cout << 6;
				}
				else cout << " ";
			}
			else
			{
				if (i + 5 == j)
				{
					cout << 1;
				}
				else if (i + 4 == j)
				{
					cout << 2;
				}
				else if (i + 3 == j)
				{
					cout << 3;
				}
				else if (i + 2 == j)
				{
					cout << 4;
				}
				else if (i + 1 == j)
				{
					cout << 5;
				}
				
				else cout << " ";
			}

		}
		cout << endl;

	}
	system("pause");
}
//第二种    
#include<iostream>
using std::cout;
using std::endl;
int main()
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 11; j++)
		{
			if (i+j==5||i+5==j)
			{
				cout << 1;
			}
			else if ((i+j==6||i+4==j)&&i!=0)
			{
				cout << 2;
			}
			else if ((i + j == 7 || i + 3 == j) && i != 0)
			{
				cout << 3;
			}
			else if ((i + j == 8 || i + 2 == j) && i != 0&&i!=1)
			{
				cout << 4;
			}
			else if ((i + j == 9 || i + 1 == j)&&i!=0 && i != 1)
			{
				cout << 5;
			}
			else if (i+j==10 && i != 0 && i != 1&&i!=2)
			{
				cout << 6;
			}
			else cout << " ";
		}
		cout << endl;

	}
	system("pause");
}

鸡兔同笼 &#8203;

一个笼子里10个头,110只脚;问鸡兔分别多少只

int cock = 0, rabbit = 0;
	for (cock; cock <= 40; cock++)
	{
		for (rabbit = 40 - cock; rabbit > 0; rabbit--)
			if ((cock + rabbit == 40) && (cock * 2 + rabbit * 4 == 110))
				printf("cock=%d,rabbit=%d\n", cock, rabbit);
	}

输出:cock=25,rabbit=15

水仙花数 &#8203;

是指一个三位数其各位数字的立方和等于该数本身,例如为:153 = 1 + 125 + 9。
image

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

int main(void)
{
	
	int ge, shi, bai;
	
	for (int i=100;i<1000;i++)
	{
		
		ge = i % 10;
		bai = i / 100;
		shi = i / 10 - bai * 10;
		if (i==ge*ge*ge+bai*bai*bai+shi*shi*shi)
		{
			printf("%d ", i);
		}
		
	}
	system("pause");
	return 0;		
}

猜数游戏(生成随机数) &#8203;

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

int main(void)
{
	srand((unsigned)time(NULL));    //重新播种,生成随机数
	int nRdm = rand()%20,nGus=0;    //生成20以内的随机数

	printf("猜数游戏,请输入猜的数字\n");
	
	do
	{
		scanf_s("%d", &nGus);
		if (nGus > nRdm)
		{
			printf("猜大了\n");
		}
		if (nGus < nRdm)
		{
			printf("猜小了\n");
		}
	
	} while (nGus != nRdm);
	printf("猜对了\n");
	

	system("pause");

	return 0;		
}

判断素数 &#8203;

素数即质数,指在大于1的自然数中,除了1和它自身,不能被其他自然数整除


int jpri(int nInp) 
{
	int i;
	for (i=2;i<nInp;i++)
	{
		if (nInp%i==0)
		{
			return 0;
			break;
		}
	}
	if (i>=nInp)
	{
		return 1;
	}
	
}
int main(void)
{
	int nNum=0;
	scanf_s("%d", &nNum);
	if (jpri(nNum) == 0)
	{
		printf("不是素数\n");
	}
	else
	{
		printf("是素数\n");
	}
	system("pause");
	return 0;		
}

指定删除并压缩字符串 &#8203;

函数void dele(char *s)的功能是删除字符串s中所有的数字字符和非字母字符,并将字符串压缩。假设字符串不超过100位。例如原字符串为adc#@123ABC,则输出结果为abcABC

#include <stdio.h>
#include <stdlib.h>
#define LEN 100

void dele(char * s)
{
	int nErr = 0;	//定义nErr记录错误字符
	for(int i=0,j=0;s[i]!=0;i++)	//遍历字符串
	{
		
		if (s[i] < 'A' || s[i] > 'Z'&&s[i]<'a'||s[i]>'z')
		{
			//printf("%c\n", s[i]);		//检测到错误码
			j = i;
			while (s[j]!=0)
			{
				s[j] = s[j + 1];
				j++;
			}
			
			//printf("改变后的字符串是%s\n", s);
			nErr++;
		}
		
	}
	//printf("执行完一次删除函数结果%s\n", s);
	if(nErr!=0)		//只要存在错误码就要递归执行此函数
	dele(s);
}
int main(void)
{
	char nAry1[LEN] = {0};
	printf("请输入原字符串:\n");
	scanf_s("%s", nAry1,LEN);
	dele(nAry1);
	printf("最后结果%s",nAry1);
	system("pause");
	return 0;
}

文件读写操作 &#8203;

字符串的读写(fputs/fgets) &#8203;

#include <stdio.h>
#include <stdlib.h>
int i = 0;

int main(void)
{
	char cCh[100] = { 0 };
	char cCh1[100] = { 0 };
	scanf_s("%s", &cCh, 100);

	//以二进制形式将字符串写入文件test.txt
	FILE *fpFile;
	fopen_s(&fpFile,"c:\\test.txt", "wb+");
	fputs(cCh, fpFile);
	fclose(fpFile);

	//读取test.txt中的字符串并存入cCh1中输出
	
	fopen_s(&fpFile,"c:\\test.txt", "r");
	fgets(cCh1, 100, fpFile);
	fclose(fpFile);
	printf("%s\n", cCh1);

	system("pause");
}

结构体的读写(fprintf_s/fscanf_s) &#8203;

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

typedef struct _Book
{
	char bookName[20];
	char authorName[20];
	float price;
}Book, *PBook;
int main(void)
{
	
	Book books_input[2] = { {"书名1","作者1",99.8},
	{"书名2","作者2",88.8} };
	int array_input[10] = { 1,2,3,4,5,6,7,8,9,10 };
	FILE *pFile = nullptr;  

	//将结构体中的内容写入文件
	//1.打开
	fopen_s(&pFile, "book.txt", "wb");  
	//2.写入
	fprintf_s(pFile, "%s\r%s\r%.2f\r",books_input[0].bookName,books_input[0].authorName,books_input[0].price);		//注意\r的使用
	fprintf_s(pFile, "%s\r%s\r%.2f\r", books_input[1].bookName, books_input[1].authorName, books_input[1].price);    
	for (int i = 0; i < 10; i++)
	{
		fprintf_s(pFile, "%d\r", array_input[i]);
	}
	//3.关闭
	fclose(pFile);
	
	//读取文件中的数据
	//1.打开
	fopen_s(&pFile, "book.txt", "rb");
	//2.读取
	Book books_output[2];
	int array_output[10];
	fscanf_s(pFile, "%s %s %f", books_output[0].bookName,20, books_output[0].authorName, 20, &books_output[0].price);
	fscanf_s(pFile, "%s %s %f", books_output[1].bookName, 20, books_output[1].authorName, 20, &books_output[1].price);
	for (int i = 0; i < 10; i++)
	{
		fscanf_s(pFile, "%d", &array_output[i]);
	}
	//3.关闭
	fclose(pFile);

	//输出
	printf( "%s\t%s\t%.2f\n", books_output[0].bookName, books_output[0].authorName,books_output[0].price);
	printf("%s\t%s\t%.2f\n", books_output[1].bookName, books_output[1].authorName, books_output[1].price);  
	for (int i = 0; i < 10; i++)
	{
		printf( "%d", array_input[i]);
	}
	
	system("pause");
	return 0;
}

两个日期之间相隔的天数 &#8203;

默认输入的第一个日期早于第二个日期,例如:
第一个日期:2008.7.4
第二个日期:2008.8.5
相隔天数是32(21,32,33可以自己定义)

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

int y = 0, m = 0, d = 0, nRst = 0;
int yh = 0, mh = 0, dh = 0;
//分割第一个日期并得到相应的整型数字
void my_split1(char *sp)
{
	char *pCh = strtok(sp, ".");
	//printf("%s\n", pCh);
	y = atoi(pCh);
	pCh = strtok(NULL, ".");
	//printf("%s\n", pCh);
	m = atoi(pCh);
	pCh = strtok(NULL, ".");
	//printf("%s\n", pCh);
	d = atoi(pCh);	//字符串变整型数字

}
//分割第二个日期并得到相应的整型数字
void my_split2(char *sp)
{
	char *pCh = strtok(sp, ".");
	//printf("%s\n", pCh);
	yh = atoi(pCh);
	pCh = strtok(NULL, ".");
	//printf("%s\n", pCh);
	mh = atoi(pCh);
	pCh = strtok(NULL, ".");
	//printf("%s\n", pCh);
	dh = atoi(pCh);

}
//日期加法函数
void my_add(int year, int mon, int day)
{
	int nMmax = 12, nDmax = 0;

	switch (mon)		//判断每个月最大多少天
	{
	case 1:case 3:case 5:case 7:case 8:case 10:case 12:
	{
		nDmax = 31;
		printf("最大天数 %d\n", nDmax);
	}
	break;
	case 2:
	{
		if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))	//判断闰年
		{
			nDmax = 29;
			//printf("是闰年,2月最大天数 %d\n", nDmax);
		}
		else
		{
			nDmax = 28;
			//printf("不是闰年,2月最大天数 %d\n", nDmax);
		}
	}
	break;
	default:
	{
		nDmax = 30;
		//printf("最大天数 %d\n", nDmax);
	}
	break;
	}
	//日期加法
	if (day < nDmax&&mon <= nMmax)
	{
		d++;
	}
	else if (day == nDmax && mon != nMmax)
	{
		d = 1;
		m++;
	}
	else if (day == nDmax && mon == nMmax)
	{
		d = m = 1;
		y++;
	}

	printf("执行一次加法后%d.%d.%d\n", y, m, d);

}
int main(void)
{
	
	char cDt1[10] = { 0 }, cDt2[10] = { 0 };
	scanf_s("%s", &cDt1, 10);	//输入
	scanf_s("%s", &cDt2,10);

	my_split1(cDt1);
	my_split2(cDt2);
	//printf("分割后年月日整型分别是%d.%d.%d\n", y, m, d);
	//printf("分割后年月日整型分别是%d.%d.%d\n", yh, mh, dh);

	while (!(y==yh&&m==mh&&d==dh))
	{
		my_add(y,m,d);
		nRst++;
		//printf("+%d\n", nRst);
	}

	printf("最后结果%d,%d,%d\n", y, m, d);
	printf("相差天数%d\n", nRst);
	system("pause");
	return 0;
}