** 從終端輸入一個 n ,求1+2+3+……+n結果。例如:輸入5輸出 1+2+3+4+5=15 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int i, n, sum= 0;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
sum +=i;
printf("%d",i);
if(i < n)//將最后一次的+去掉
{
printf("+");
}
}
printf("=%d\n",sum);
return 0;
}
** 分解質因數 120 = 22235 **
** 單層循環 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int num;
scanf("%d", &num);
printf("%d=",num);
for(int i =2;i<num; )
{
if(num%i==0)
{
printf("%d*",i);
num /= i;
}
else
{
i++;
}
}
printf("%d\n", num);
return 0;
}
** 雙重循環 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int num;
scanf("%d", &num);
printf("%d=",num);
for(int i=2;i<num;i++)
{
while(num%i==0)
{
printf("%d*",i);
num /= i;
if(num==i)
{
break;
}
}
}
printf("%d\n",num);
return 0;
}
** 輸出n以內任意數范圍內的的質數。注意輸入使用scanf輸入 **
比如:
輸入 5 輸出為
2
3
5
輸入 3 輸出為
2
3
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n=100;
if (n<2) {
printf("沒有\n");
}
if (n==2) {
printf("2\n");
}
if (n>2) {
printf("2\n");
for (int i=3; i<=n; i++) {
for (int j=2; j<i; j++) {
if (i%j==0) {
break;
}
if (j==i-1) {
printf("%d\n",i);
}
}
}
}
return 0;
}
** 定義一個字符數組,輸入 10 個字符到數組中,將字符數組內容逐個輸出,每個字符之間使用空格隔開 **
輸入:A B C D E F G H I J
輸出:A B C D E F G H I J
#include <stdio.h>
int main(int argc, char * argv[])
{
char ch[10]={0};//最好先清空
char space;
for(int i=0; i<10; i++)
{
scanf("%c%c",&ch[i], &space);//用space來接收空格
printf("%c ",ch[i]);
}
return 0;
}
或者
#include <stdio.h>
int main(int argc, char * argv[])
{
char ch[10]={0};//最好先清空
for(int i=0; i<10; i++)
{
scanf(" %c",&ch[i]);//第一次的空格會忽略
printf("%c ",ch[i]);
}
return 0;
}
** 倒序輸出兩個大寫字母之間的字母序列。注意輸入使用scanf輸入 **
比如:
輸入 U
Y輸出為
Y
X
W
V
U
輸入 V
X 輸出為
X
W
V
#include <stdio.h>
int main(int argc, char * argv[])
{
char c1,c2;
int i;
scanf("%c\n%c",&c1,&c2);//注意要加 \n
for(i=c2;i>=c1;i--)
printf("%c\n",i);
return 0;
}
** 輸出數字序列2/1,3/2,5/3,8/5,13/8,21/13...,輸出個數由鍵盤輸入。注意輸入使用scanf輸入 **
比如:
輸入 3輸出為
2/1
3/2
5/3
輸入 4 輸出為
2/1
3/2
5/3
8/5
#include <stdio.h>
int main(int argc, char * argv[])
{
int i, n;
scanf("%d", &n);
int a[n], b[n];
a[0]=2; b[0]=1;
a[1]=3; b[1]=2;
if(n==1)
{
printf("%d/%d\n",a[n-1],b[n-1]);
}
if(n==2)
{
printf("%d/%d\n",a[n-2],b[n-2]);
printf("%d/%d\n",a[n-1],b[n-1]);
}
if(n>2)
{
for(i=0;i<n;i++)
{
if(i>1)
{
a[i]=a[i-1]+a[i-2];
b[i]=b[i-1]+b[i-2];
}
printf("%d/%d\n",a[i],b[i]);
}
}
return 0;
}
漢諾塔
??有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,并且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問該怎么移動?至少需要多少次?
#include <stdio.h>
void hanoi(int n, char a, char b, char c)
{
if (n > 0)
{
hanoi(n-1, a, c, b);
printf("%c--->%c\n",a,b);
hanoi(n-1, c, b, a);
}
}
int main(int argc, char * argv[])
{
int N;
printf("請輸入需要移動的盤子數:");
scanf("%d", &N);
hanoi(N, 'A', 'B', 'C');
return 0;
}
** 遞歸求階乘 **
#include <stdio.h>
double factorial(int n){
if(n == 0 || n== 1) return 1; //注意結束條件
return n * factorial(n-1);
}
int main(int argc, char * argv[])
{
int a;
printf("請輸入一個數字:");
scanf("%d", &a);
printf("%d的階乘為:%.0f\n", a, factorial(a));
return 0;
}
** 楊輝三角 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int num;
printf("請輸入需要打印的行數:");
scanf("%d", &num);
int a[num][num];
for(int i=0; i<num; i++)
{
for(int j=0;j<=i;j++)
{
if(j==0 || j==i)
{
a[i][j] = 1;
}
else
{
a[i][j] = a[i-1][j] + a[i-1][j-1];
}
printf("%d\t",a[i][j]);
}
printf("\n");
}
return 0;
}
** 打印 1、1、2、3、5、8、13...輸入需要打印的個數 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int N;
printf("請輸入需要打印的個數:");
scanf("%d",&N);
int a[N];
a[0] = 1;
a[1] = 1;
for(int i=2; i<N;i++)
{
a[i] = a[i-1] +a[i-2];
}
for(int i=0; i<N; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
** 統計色子各個點出現的次數 **
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char * argv[])
{
srand(time(0)); //隨機數的種子
int n = 6000; //搖色子的次數
int nums[6]={0};
for(int i=0; i<n;i++)
{
int num = rand() % 6 +1;//產生1 ~ 6 的隨機數
nums[num -1]++;
}
for(int i=1; i<=6;i++)
{
printf("%d點出現的次數%d\n",i,nums[i-1]);
}
return 0;
}
** Craps游戲 **
??搖色字游戲:第一次:7、11玩家勝;2、3、12莊家勝;其他點數游戲繼續。在繼續的過程中,如果搖出了7點,莊家勝;如果搖出了第一次搖的點數,玩家勝。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int BOOL;
static const int YES = 1;
static const int NO = 0;
// 搖兩顆色子返回點數之和
int roll_two_dice() {
int face1 = rand() % 6 + 1;
int face2 = rand() % 6 + 1;
return face1 + face2;
}
int main() {
srand((unsigned int)time(0));
int money = 1000;
do {
printf("你的余額為: %d\n", money);
int debt = 0;
do {
printf("請下注: ");
scanf("%d", &debt);
} while (debt <= 0 || debt > money);
BOOL go_on = NO;
int first_point, current_point;
first_point = current_point = roll_two_dice();
printf("玩家搖出了%d點\n", current_point);
switch(current_point) {
case 7: case 11:
money += debt;
printf("玩家勝!!!\n");
break;
case 2: case 3: case 12:
money -= debt;
printf("莊家勝!!!\n");
break;
default:
go_on = YES;
break;
}
while (go_on) {
current_point = roll_two_dice();
printf("玩家搖出了%d點\n", current_point);
if (current_point == 7) {
money -= debt;
printf("莊家勝!!!\n");
go_on = NO;
}
else if (current_point == first_point) {
money += debt;
printf("玩家勝!!!\n");
go_on = NO;
}
}
} while (money > 0);
printf("你已經破產, 游戲結束!!!\n");
return 0;
}
圖案打印
** 用for:輸出圖形,底邊長n。后一行比前一行多一個星號**
#include <stdio.h>
int main(int argc, char * argv[])
{
int i, j, n;
scanf("%d", &n);
for(i=0; i<n; i++)
{
for(j=0; j<=i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
** 輸入一個大寫字母,如 F,輸出 **
比如:
輸入:F
輸出:
F
EFE
DEFED
CDEFEDC
BCDEFEDCB
ABCDEFEDCBA
#include <stdio.h>
int main(int argc, char * argv[])
{
int i, j, t;
char ch1, ch = 'A';
scanf("%c", &ch1);
t = ch1 - ch + 1;
for(i=0; i<t; i++)
{
for(j=0; j<2*i+1;j++)
{
if(j<i)
printf("%c",ch1-i+j);
else
printf("%c",ch1-j+i);
}
printf("\n");
}
return 0;
}
** 輸入一個大寫字母,如F **
比如:
輸入:F
輸出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
#include <stdio.h>
int main(int argc, char * argv[])
{
char ch1, ch = 'A';
int i, j, t;
scanf("%c",&ch1);
t = ch1 - ch + 1;
for(i=0; i<t; i++)
{
for(j=0; j<2*i+1; j++)
{
if(j<i)
printf("%c",ch+j);
else
printf("%c",ch+2*i-j);
}
printf("\n");
}
return 0;
}
** 在屏幕上輸出以下圖形(等腰三角形),行數由輸入的數字來控制 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
for(int j=0; j<2*n-1; j++)
{
if(j>=n-1-i && j<=n-1+i)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
** 在屏幕上輸出以下圖形(等腰三角形的外框),行數由輸入的數字來控制 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
if(i<n-1)
{
for(int j=0; j<2*n-1; j++)
{
if(j==n-i-1 || j==n+i-1)
printf("*");
else
printf(" ");
}
}
if(i==n-1)
{
for(int j=0; j<n; j++)
{
printf("* ");
}
}
printf("\n");
}
return 0;
}
字符串函數
** strlen計算字符串有效長度 **
int mystrlen(const char *c){
if (c == NULL) {
return -1;
}
else
{
int n=0;
while (*c++ != 0){
n++;
}
return n;
}
}
** strcpy字符串復制 **
char *mystrcpy(char *dest, const char *src){
//方法一:
int i=0;
while (src[i]){
dest[i] = src[i];
i++;
}
return dest;
//方法二:
if (dest==NULL || src == NULL) {
return NULL;
}//不能為空,只要有一個為空都不行
while (*src) {
*dest++ = *src++;//*src++ = *(src++);
}
*dest = '\0';
return dest;
}
** myatoi將字符串轉換成整數 **
** mystrcmp比較兩個字符串的大小 **
int mystrcmp(const char *s1, const char *s2){
// int j=0,i=0;
// while (s1[i]==s2[i]){
// if (s1[i]==0) {
// return j;
// }
// i++;
// }
// j=s1[i]-s2[i];
// return j;
int ret=0;
while ((*s1!=0) || (*s2!=0)) {
if(*s1!=*s2){
ret = *s1-*s2;
}
s1++;
s2++;
}
return ret;
}
int mystrcmp2(const char *s1, const char *s2){
while((*s1!=0)&&(*s2!=0)&&(*s1==*s2)){
s1++;
s2++;
}
return *s1-*s2;
}
** mystrcat字符串連接 **
** mystrstr查找字符串 **
** 定義一個字符數組c[10],并初始化數組,將字符數組內容倒序輸出。。注意輸入使用scanf輸入 **
比如:
輸入
asdf
輸出為
fdsa
#include <stdio.h>
int main(int argc, const char * argv[]) {
char c[10]={0};
int i;
for (i=0; i<10; i++) {
scanf("%c",&c[i]);
}
for (i=9; i>=0; i--) {
if(c[i]!='\0')
printf("%c",c[i]);
}
return 0;
}
** 定義一個有5個元素的整型數組a,并終端輸入初始化值,再定義一個有5個元素的一維指針數組p。并將p數組中的每個指針變量指向a數組中對應的元素值,然后剩用p數組將a數組中的值輸出來。 **
比如:
輸入5 6 8 3 4
輸出為
5
6
8
3
4
#include <Stdio.h>
int main(int argc, char * argv[])
{
int a[5];
int i;
for (i=0; i<5; i++) {
scanf("%d",&a[i]);
}
int *p[5];
for (i=0; i<5; i++) {
p[i]=&a[i];
}
for (i=0; i<5; i++) {
printf("%d\n",*p[i]);
}
return 0;
}
** 找出 100 以內 7 的倍數 **
#include <stdio.h>
int main(int argc, char * argv[])
{
int a=1;
while(7 * a < 100)
{
printf("%d\n",7 * a);
a++;
}
return 0;
}
** 數組排序 **
// 9 1 2 3 4 5 6 7 8
#include <stdio.h>
int main(){
int a[9] = {9, 1, 2,3,4,5,6,7,8};
_Bool flag = 1;
for (int i=0; flag && i<8; i++) {
flag = 0;
for (int j=0; j<8-i; j++) {
if (a[j]>a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
flag = 1;
}
}
}
for (int i=0; i<9; i++) {
printf("%d ",a[i]);
}
}
// 9 2 3 4 5 6 7 8 1
輸入字符的處理
第一種情況:
int main(int argc, const char * argv[]) {
char ch;
do{
printf("輸入正確\n");
scanf("%c",&ch);
}while(ch=='Y' || ch == 'y');
return 0;
}
第二種情況:
int main(int argc, const char * argv[]) {
char ch, jy;
do{
printf("輸入正確\n");
scanf("%c%c",&ch,&jy);
}while(ch=='Y' || ch == 'y');
return 0;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a = 6, b = 2;
printf("%d\n",a / b); //3
int a1 = 6, b1 = 0;
printf("%d", a1 / b1); //不能輸出
double a2 = 6, b2 = 2;
printf("%lf\n", a2 / b2); //3.000000
double a3 = 6, b3 = 0;
printf("%lf\n", a3 / b3); //inf
double a4 = 6, b4 = -0;
printf("%lf\n", a4 / b4); //inf
double a5 = 0, b5 = 0;
printf("%lf\n", a5 / b5); //nan
double a6 = -0, b6 = 0;
printf("%lf\n", a6 / b6); //nan
double a7 = -0, b7 = -0;
printf("%lf\n", a7 / b7); //nan
}
return 0;
}
** 比較下面兩段代碼的輸出結果 **
#include <Stdio.h>
#include "unistd.h"
int main(int argc, char * argv[])
{
while(1){
printf("hello, world");
usleep(10000);
}
return 0;
}
#include <Stdio.h>
#include "unistd.h"
int main(int argc, char * argv[])
{
while(1){
printf("hello, world\n");
usleep(10000);
}
return 0;
}
運行結果:
??第一段代碼:等待緩沖區填滿之后輸出一長串 hello,world
??第二段代碼每過0.01s輸出一次 hello,world