[TOC]
概念题 ​
- ROM:read-only memory只读存储器,只能读出不能写入,断电不会丢失。在主板上的ROM里固化了BIOS系统 RAM:ramdom access memory随机存储器,高速缓存,断电消失。一般说的计算机内存是指RAM
- for循环一般用于知道具体循环次数的情况,但不是只能用于这个情况
- 调试运行和直接运行
- 调试运行可以一步一步执行程序
- 允许察看监视窗口
- 允许察看程序的内存
- static静态变量只能被初始化一次,通常用在反复执行的一段代码里,给静态变量赋初值;再次执行这段代码的时候,该静态变量的值不会被初始化而是上一次运行结束时的值。
- 形参相当于实参的一份拷贝
- 结构体和联合体
- 二者的使用语法相同
- 结构体的关键字是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;
}打印 ​
九九乘法表 ​
for (int i = 1; i < 10; i++)
{
for (int j = 1; j <= i; j++)
printf("%d*%d=%d ", j,i, i*j);
printf("\n");
}金字塔 ​
#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");
}任意奇数行的菱形 ​
效果如下:
#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");
}杨辉三角 ​
每行的两边都是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();
}
}
}打印等腰三角 ​
#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");
}鸡兔同笼 ​
一个笼子里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水仙花数 ​
是指一个三位数其各位数字的立方和等于该数本身,例如为:153 = 1 + 125 + 9。
#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;
}猜数游戏(生成随机数) ​
#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;
}判断素数 ​
素数即质数,指在大于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;
}指定删除并压缩字符串 ​
函数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;
}文件读写操作 ​
字符串的读写(fputs/fgets) ​
#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) ​
#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;
}两个日期之间相隔的天数 ​
默认输入的第一个日期早于第二个日期,例如:
第一个日期: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;
}